@avee1234/agent-kit 0.1.0
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/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/index.cjs +657 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +201 -0
- package/dist/index.d.ts +201 -0
- package/dist/index.js +619 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/model/mock.ts","../src/model/openai-compatible.ts","../src/events.ts","../src/types.ts","../src/agent.ts","../src/tool.ts","../src/store/in-memory.ts","../src/store/sqlite.ts","../src/memory.ts"],"sourcesContent":["// Core\nexport { Agent } from './agent';\nexport type { AgentConfig } from './agent';\n\nexport { Tool } from './tool';\n\nexport { Memory } from './memory';\nexport type { MemoryConfig, MemoryContext } from './memory';\n\n// Model adapters\nexport type { ModelAdapter } from './model/adapter';\nexport { MockAdapter } from './model/mock';\nexport { OpenAICompatibleAdapter } from './model/openai-compatible';\nexport type { OpenAIAdapterConfig } from './model/openai-compatible';\n\n// Storage\nexport type { MemoryStore } from './store/interface';\nexport { InMemoryStore } from './store/in-memory';\nexport { SQLiteStore } from './store/sqlite';\n\n// Events\nexport { AgentEventEmitter } from './events';\n\n// Types\nexport type {\n Message,\n ToolCall,\n Summary,\n ModelConfig,\n ModelResponse,\n ModelChunk,\n ToolDefinition,\n ParameterDef,\n AgentEvent,\n} from './types';\nexport { createMessage, createSummary, isToolCallMessage } from './types';\n","// src/model/mock.ts\nimport type { ModelAdapter } from './adapter';\nimport type { Message, ModelResponse, ModelChunk, ToolDefinition } from '../types';\n\nexport class MockAdapter implements ModelAdapter {\n async chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse> {\n const lastUserMsg = [...messages].reverse().find((m) => m.role === 'user');\n const content = lastUserMsg?.content ?? '';\n\n // Check if this is a summarization request\n const systemMsg = messages.find((m) => m.role === 'system');\n if (systemMsg?.content.toLowerCase().includes('summarize')) {\n const conversationContent = messages\n .filter((m) => m.role !== 'system')\n .map((m) => m.content)\n .join(' ');\n return { content: `[Mock Summary] ${conversationContent.slice(0, 200)}` };\n }\n\n // Check if user message matches any tool\n if (tools?.length) {\n for (const tool of tools) {\n const toolNameWords = tool.name.replace(/_/g, ' ').split(' ');\n const matches = toolNameWords.some((word) =>\n content.toLowerCase().includes(word.toLowerCase()),\n );\n if (matches) {\n return {\n content: '',\n toolCalls: [\n {\n id: `mock-tc-${Date.now()}`,\n name: tool.name,\n arguments: JSON.stringify(\n Object.fromEntries(Object.keys(tool.parameters).map((key) => [key, content])),\n ),\n },\n ],\n };\n }\n }\n }\n\n return {\n content: `[Mock] Received: \"${content}\". Tools available: ${tools?.map((t) => t.name).join(', ') ?? 'none'}.`,\n };\n }\n\n async *stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk> {\n const response = await this.chat(messages, tools);\n const words = response.content.split(' ');\n for (let i = 0; i < words.length; i++) {\n yield {\n text: (i > 0 ? ' ' : '') + words[i],\n done: i === words.length - 1,\n ...(i === words.length - 1 && response.toolCalls ? { toolCalls: response.toolCalls } : {}),\n };\n }\n }\n}\n","// src/model/openai-compatible.ts\nimport type { ModelAdapter } from './adapter';\nimport type { Message, ModelResponse, ModelChunk, ToolDefinition } from '../types';\n\nexport interface OpenAIAdapterConfig {\n baseURL: string;\n model: string;\n apiKey?: string;\n}\n\nexport class OpenAICompatibleAdapter implements ModelAdapter {\n private config: OpenAIAdapterConfig;\n\n constructor(config: OpenAIAdapterConfig) {\n this.config = config;\n }\n\n async chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse> {\n const body: Record<string, unknown> = {\n model: this.config.model,\n messages: messages.map((m) => this.toOpenAIMessage(m)),\n };\n if (tools?.length) {\n body.tools = tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: { type: 'object', properties: t.parameters },\n },\n }));\n }\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.apiKey) headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n\n const response = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Model API error (${response.status}): ${errorText}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data: any = await response.json();\n const choice = data.choices[0].message;\n const result: ModelResponse = { content: choice.content ?? '' };\n if (choice.tool_calls?.length) {\n result.toolCalls = choice.tool_calls.map(\n (tc: { id: string; function: { name: string; arguments: string } }) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n }),\n );\n }\n if (data.usage) {\n result.tokens = { input: data.usage.prompt_tokens, output: data.usage.completion_tokens };\n }\n return result;\n }\n\n async *stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (this.config.apiKey) headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n const body: Record<string, unknown> = {\n model: this.config.model,\n messages: messages.map((m) => this.toOpenAIMessage(m)),\n stream: true,\n };\n if (tools?.length) {\n body.tools = tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: { type: 'object', properties: t.parameters },\n },\n }));\n }\n const response = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Model API error (${response.status}): ${errorText}`);\n }\n const reader = response.body?.getReader();\n if (!reader) throw new Error('No response body');\n const decoder = new TextDecoder();\n let buffer = '';\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n yield { text: '', done: true };\n return;\n }\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n if (delta?.content) yield { text: delta.content, done: false };\n }\n }\n }\n\n private toOpenAIMessage(msg: Message): Record<string, unknown> {\n const result: Record<string, unknown> = { role: msg.role, content: msg.content };\n if (msg.toolCalls) {\n result.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: { name: tc.name, arguments: tc.arguments },\n }));\n }\n if (msg.toolCallId) result.tool_call_id = msg.toolCallId;\n return result;\n }\n}\n","// src/events.ts\nimport type { AgentEvent } from './types';\n\ntype EventHandler = (event: AgentEvent) => void;\n\nexport class AgentEventEmitter {\n private listeners = new Map<string, Set<EventHandler>>();\n\n on(type: string, handler: EventHandler): void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set());\n }\n this.listeners.get(type)!.add(handler);\n }\n\n off(type: string, handler: EventHandler): void {\n this.listeners.get(type)?.delete(handler);\n }\n\n emit(event: AgentEvent): void {\n this.listeners.get(event.type)?.forEach((handler) => handler(event));\n if (event.type !== '*') {\n this.listeners.get('*')?.forEach((handler) => handler(event));\n }\n }\n}\n","// src/types.ts\n\n// --- Messages ---\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: string; // JSON string\n}\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n timestamp: number;\n toolCalls?: ToolCall[];\n toolCallId?: string; // for role: 'tool' — links to ToolCall.id\n}\n\nexport function createMessage(opts: Omit<Message, 'timestamp'> & { timestamp?: number }): Message {\n return {\n ...opts,\n timestamp: opts.timestamp ?? Date.now(),\n };\n}\n\nexport function isToolCallMessage(msg: Message): boolean {\n return Array.isArray(msg.toolCalls) && msg.toolCalls.length > 0;\n}\n\n// --- Summaries ---\n\nexport interface Summary {\n id: string;\n content: string;\n timestamp: number;\n messageRange: { from: number; to: number }; // timestamps of summarized messages\n}\n\nexport function createSummary(\n opts: Omit<Summary, 'id' | 'timestamp' | 'messageRange'> & {\n id?: string;\n timestamp?: number;\n messageRange?: { from: number; to: number };\n },\n): Summary {\n return {\n id: opts.id ?? crypto.randomUUID(),\n content: opts.content,\n timestamp: opts.timestamp ?? Date.now(),\n messageRange: opts.messageRange ?? { from: 0, to: 0 },\n };\n}\n\n// --- Model ---\n\nexport interface ModelConfig {\n provider?: 'ollama';\n baseURL?: string;\n apiKey?: string;\n model: string;\n}\n\nexport interface ModelResponse {\n content: string;\n toolCalls?: ToolCall[];\n tokens?: { input: number; output: number };\n}\n\nexport interface ModelChunk {\n text: string;\n toolCalls?: ToolCall[];\n done: boolean;\n}\n\n// --- Tools ---\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n parameters: Record<string, ParameterDef>;\n}\n\nexport interface ParameterDef {\n type: string;\n description?: string;\n enum?: string[];\n required?: boolean;\n}\n\n// --- Events ---\n\nexport interface AgentEvent {\n type: string;\n timestamp: number;\n agentId: string;\n data: Record<string, unknown>;\n latencyMs?: number;\n tokens?: { input: number; output: number };\n}\n","// src/agent.ts\nimport type { ModelAdapter } from './model/adapter';\nimport { MockAdapter } from './model/mock';\nimport { OpenAICompatibleAdapter } from './model/openai-compatible';\nimport type { Memory } from './memory';\nimport type { Tool } from './tool';\nimport { AgentEventEmitter } from './events';\nimport { createMessage, isToolCallMessage } from './types';\nimport type { Message, ModelConfig, ModelResponse, ModelChunk, AgentEvent } from './types';\n\nexport interface AgentConfig {\n name: string;\n model?: ModelAdapter | ModelConfig;\n memory?: Memory;\n tools?: Tool[];\n system?: string;\n maxToolRounds?: number;\n}\n\nexport class Agent {\n private name: string;\n private model: ModelAdapter;\n private memory?: Memory;\n private tools: Tool[];\n private toolMap: Map<string, Tool>;\n private system?: string;\n private maxToolRounds: number;\n private emitter: AgentEventEmitter;\n\n constructor(config: AgentConfig) {\n this.name = config.name;\n this.memory = config.memory;\n this.tools = config.tools ?? [];\n this.system = config.system;\n this.maxToolRounds = config.maxToolRounds ?? 10;\n this.emitter = new AgentEventEmitter();\n\n // Build tool map for quick lookup\n this.toolMap = new Map(this.tools.map((t) => [t.name, t]));\n\n // Resolve model adapter\n if (!config.model) {\n this.model = new MockAdapter();\n } else if (this.isModelAdapter(config.model)) {\n this.model = config.model;\n } else {\n // ModelConfig object — create OpenAICompatibleAdapter\n const cfg = config.model as ModelConfig;\n const baseURL =\n cfg.provider === 'ollama'\n ? (cfg.baseURL ?? 'http://localhost:11434/v1')\n : (cfg.baseURL ?? 'http://localhost:11434/v1');\n this.model = new OpenAICompatibleAdapter({\n baseURL,\n model: cfg.model,\n apiKey: cfg.apiKey,\n });\n }\n\n // Wire memory model for summarization\n if (this.memory) {\n this.memory.setModel(this.model);\n }\n }\n\n private isModelAdapter(obj: ModelAdapter | ModelConfig): obj is ModelAdapter {\n return typeof (obj as ModelAdapter).chat === 'function';\n }\n\n on(type: string, handler: (event: AgentEvent) => void): void {\n this.emitter.on(type, handler);\n }\n\n off(type: string, handler: (event: AgentEvent) => void): void {\n this.emitter.off(type, handler);\n }\n\n private emit(type: string, data: Record<string, unknown>, extras?: Partial<AgentEvent>): void {\n this.emitter.emit({\n type,\n timestamp: Date.now(),\n agentId: this.name,\n data,\n ...extras,\n });\n }\n\n async chat(input: string): Promise<ModelResponse> {\n const toolDefs = this.tools.map((t) => t.definition);\n\n // Build initial messages\n const messages: Message[] = [];\n\n // Add system prompt\n if (this.system) {\n messages.push(createMessage({ role: 'system', content: this.system }));\n }\n\n // Add memory context (summaries + recent messages)\n if (this.memory) {\n const ctx = await this.memory.getContext(this.name, input);\n this.emit('memory:retrieve', {\n summaries: ctx.relevantSummaries.length,\n recentMessages: ctx.recentMessages.length,\n });\n\n // Add relevant summaries as system context\n for (const summary of ctx.relevantSummaries) {\n messages.push(\n createMessage({\n role: 'system',\n content: `[Previous conversation summary]: ${summary.content}`,\n timestamp: summary.timestamp,\n }),\n );\n }\n\n // Add recent messages\n messages.push(...ctx.recentMessages);\n }\n\n // Add current user message\n const userMessage = createMessage({ role: 'user', content: input });\n messages.push(userMessage);\n\n // Emit user message event\n this.emit('message', { role: 'user', content: input });\n\n // Main tool loop\n let response: ModelResponse = { content: '' };\n let toolRoundsUsed = 0;\n\n // First model call\n response = await this.model.chat(messages, toolDefs.length ? toolDefs : undefined);\n\n // Tool call loop\n while (\n isToolCallMessage({ ...response, role: 'assistant', timestamp: Date.now() }) &&\n toolRoundsUsed < this.maxToolRounds\n ) {\n // Append assistant's tool-calling message\n const assistantMsg = createMessage({\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n });\n messages.push(assistantMsg);\n\n // Execute each tool call\n for (const toolCall of response.toolCalls ?? []) {\n const tool = this.toolMap.get(toolCall.name);\n const startTime = Date.now();\n\n this.emit('tool:start', {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n arguments: toolCall.arguments,\n });\n\n let toolResult: string;\n if (!tool) {\n toolResult = `Error: tool \"${toolCall.name}\" not found`;\n this.emit('error', {\n message: `Tool not found: ${toolCall.name}`,\n toolCallId: toolCall.id,\n });\n } else {\n try {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = JSON.parse(toolCall.arguments) as Record<string, unknown>;\n } catch {\n parsedArgs = {};\n }\n const result = await tool.execute(parsedArgs);\n toolResult = typeof result === 'string' ? result : JSON.stringify(result);\n } catch (err) {\n const error = err as Error;\n toolResult = `Error: ${error.message}`;\n this.emit('error', {\n message: error.message,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n });\n }\n }\n\n const latencyMs = Date.now() - startTime;\n this.emit('tool:end', {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n result: toolResult,\n latencyMs,\n });\n\n // Append tool result message\n messages.push(\n createMessage({\n role: 'tool',\n content: toolResult,\n toolCallId: toolCall.id,\n }),\n );\n }\n\n toolRoundsUsed++;\n\n // Call model again with tool results\n response = await this.model.chat(messages, toolDefs.length ? toolDefs : undefined);\n }\n\n // Emit final assistant message event\n this.emit('message', { role: 'assistant', content: response.content });\n\n // Save exchange to memory\n if (this.memory) {\n const exchangeMessages: Message[] = [\n userMessage,\n createMessage({\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n }),\n ];\n await this.memory.saveExchange(this.name, exchangeMessages);\n }\n\n return response;\n }\n\n async *stream(input: string): AsyncIterable<ModelChunk> {\n const toolDefs = this.tools.map((t) => t.definition);\n\n // Build messages\n const messages: Message[] = [];\n\n if (this.system) {\n messages.push(createMessage({ role: 'system', content: this.system }));\n }\n\n if (this.memory) {\n const ctx = await this.memory.getContext(this.name, input);\n for (const summary of ctx.relevantSummaries) {\n messages.push(\n createMessage({\n role: 'system',\n content: `[Previous conversation summary]: ${summary.content}`,\n timestamp: summary.timestamp,\n }),\n );\n }\n messages.push(...ctx.recentMessages);\n }\n\n const userMessage = createMessage({ role: 'user', content: input });\n messages.push(userMessage);\n\n this.emit('message', { role: 'user', content: input });\n\n // Stream response\n let fullText = '';\n for await (const chunk of this.model.stream(messages, toolDefs.length ? toolDefs : undefined)) {\n fullText += chunk.text;\n yield chunk;\n }\n\n this.emit('message', { role: 'assistant', content: fullText });\n\n // Save to memory\n if (this.memory) {\n await this.memory.saveExchange(this.name, [\n userMessage,\n createMessage({ role: 'assistant', content: fullText }),\n ]);\n }\n }\n}\n","// src/tool.ts\nimport type { ToolDefinition, ParameterDef } from './types';\n\ninterface ToolConfig {\n name: string;\n description: string;\n parameters: Record<string, ParameterDef>;\n execute: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\nexport class Tool {\n readonly name: string;\n readonly description: string;\n readonly definition: ToolDefinition;\n private executeFn: (params: Record<string, unknown>) => Promise<unknown>;\n\n private constructor(config: ToolConfig) {\n this.name = config.name;\n this.description = config.description;\n this.definition = {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n };\n this.executeFn = config.execute;\n }\n\n static create(config: ToolConfig): Tool {\n return new Tool(config);\n }\n\n async execute(params: Record<string, unknown>): Promise<unknown> {\n return this.executeFn(params);\n }\n}\n","// src/store/in-memory.ts\nimport type { Message, Summary } from '../types';\nimport type { MemoryStore } from './interface';\n\nexport class InMemoryStore implements MemoryStore {\n private messages = new Map<string, Message[]>();\n private summaries = new Map<string, Summary[]>();\n\n async saveMessages(agentId: string, messages: Message[]): Promise<void> {\n const existing = this.messages.get(agentId) ?? [];\n existing.push(...messages);\n this.messages.set(agentId, existing);\n }\n\n async getRecentMessages(agentId: string, limit: number): Promise<Message[]> {\n const all = this.messages.get(agentId) ?? [];\n return all.slice(-limit);\n }\n\n async saveSummary(agentId: string, summary: Summary): Promise<void> {\n const existing = this.summaries.get(agentId) ?? [];\n existing.push(summary);\n this.summaries.set(agentId, existing);\n }\n\n async searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]> {\n const all = this.summaries.get(agentId) ?? [];\n const queryLower = query.toLowerCase();\n const matches = all\n .filter((s) => s.content.toLowerCase().includes(queryLower))\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, limit);\n return matches;\n }\n}\n","// src/store/sqlite.ts\nimport { createRequire } from 'module';\nimport type { Message, Summary } from '../types';\nimport type { MemoryStore } from './interface';\n\nconst require = createRequire(import.meta.url);\n\nexport class SQLiteStore implements MemoryStore {\n private db: import('better-sqlite3').Database;\n\n constructor(path: string) {\n const Database = require('better-sqlite3');\n this.db = new Database(path);\n this.db.pragma('journal_mode = WAL');\n this.init();\n }\n\n private init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n agent_id TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n tool_calls TEXT,\n tool_call_id TEXT\n );\n CREATE TABLE IF NOT EXISTS summaries (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n message_range_from INTEGER NOT NULL,\n message_range_to INTEGER NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_messages_agent ON messages(agent_id);\n CREATE INDEX IF NOT EXISTS idx_summaries_agent ON summaries(agent_id);\n `);\n }\n\n async saveMessages(agentId: string, messages: Message[]): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT INTO messages (agent_id, role, content, timestamp, tool_calls, tool_call_id) VALUES (?, ?, ?, ?, ?, ?)',\n );\n const insertMany = this.db.transaction((msgs: Message[]) => {\n for (const msg of msgs) {\n stmt.run(\n agentId,\n msg.role,\n msg.content,\n msg.timestamp,\n msg.toolCalls ? JSON.stringify(msg.toolCalls) : null,\n msg.toolCallId ?? null,\n );\n }\n });\n insertMany(messages);\n }\n\n async getRecentMessages(agentId: string, limit: number): Promise<Message[]> {\n const rows = this.db\n .prepare(\n `SELECT role, content, timestamp, tool_calls, tool_call_id\n FROM messages WHERE agent_id = ?\n ORDER BY id DESC LIMIT ?`,\n )\n .all(agentId, limit) as Array<{\n role: Message['role'];\n content: string;\n timestamp: number;\n tool_calls: string | null;\n tool_call_id: string | null;\n }>;\n\n return rows.reverse().map((row) => ({\n role: row.role,\n content: row.content,\n timestamp: row.timestamp,\n ...(row.tool_calls ? { toolCalls: JSON.parse(row.tool_calls) } : {}),\n ...(row.tool_call_id ? { toolCallId: row.tool_call_id } : {}),\n }));\n }\n\n async saveSummary(agentId: string, summary: Summary): Promise<void> {\n this.db\n .prepare(\n 'INSERT INTO summaries (id, agent_id, content, timestamp, message_range_from, message_range_to) VALUES (?, ?, ?, ?, ?, ?)',\n )\n .run(\n summary.id,\n agentId,\n summary.content,\n summary.timestamp,\n summary.messageRange.from,\n summary.messageRange.to,\n );\n }\n\n async searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]> {\n const rows = this.db\n .prepare(\n `SELECT id, content, timestamp, message_range_from, message_range_to\n FROM summaries WHERE agent_id = ? AND content LIKE ?\n ORDER BY timestamp DESC LIMIT ?`,\n )\n .all(agentId, `%${query}%`, limit) as Array<{\n id: string;\n content: string;\n timestamp: number;\n message_range_from: number;\n message_range_to: number;\n }>;\n\n return rows.map((row) => ({\n id: row.id,\n content: row.content,\n timestamp: row.timestamp,\n messageRange: { from: row.message_range_from, to: row.message_range_to },\n }));\n }\n\n close(): void {\n this.db.close();\n }\n}\n","// src/memory.ts\nimport type { Message, Summary } from './types';\nimport { createSummary } from './types';\nimport type { MemoryStore } from './store/interface';\nimport { InMemoryStore } from './store/in-memory';\nimport { SQLiteStore } from './store/sqlite';\nimport type { ModelAdapter } from './model/adapter';\n\nexport interface MemoryConfig {\n store?: 'memory' | 'sqlite' | MemoryStore;\n path?: string;\n windowSize?: number;\n summarizeAfter?: number;\n}\n\nexport interface MemoryContext {\n recentMessages: Message[];\n relevantSummaries: Summary[];\n}\n\nexport class Memory {\n private store: MemoryStore;\n private windowSize: number;\n private summarizeAfter: number;\n private model?: ModelAdapter;\n private messageCount = new Map<string, number>();\n\n constructor(config: MemoryConfig = {}) {\n this.windowSize = config.windowSize ?? 20;\n this.summarizeAfter = config.summarizeAfter ?? 20;\n\n if (!config.store || config.store === 'memory') {\n this.store = new InMemoryStore();\n } else if (config.store === 'sqlite') {\n this.store = new SQLiteStore(config.path ?? './agent-memory.db');\n } else {\n this.store = config.store;\n }\n }\n\n setModel(model: ModelAdapter): void {\n this.model = model;\n }\n\n getStore(): MemoryStore {\n return this.store;\n }\n\n async saveExchange(agentId: string, messages: Message[]): Promise<void> {\n await this.store.saveMessages(agentId, messages);\n const count = (this.messageCount.get(agentId) ?? 0) + messages.length;\n this.messageCount.set(agentId, count);\n if (count >= this.summarizeAfter && this.model) {\n await this.summarize(agentId);\n this.messageCount.set(agentId, 0);\n }\n }\n\n async getContext(agentId: string, query: string): Promise<MemoryContext> {\n const recentMessages = await this.store.getRecentMessages(agentId, this.windowSize);\n const relevantSummaries = await this.store.searchSummaries(agentId, query, 3);\n return { recentMessages, relevantSummaries };\n }\n\n private async summarize(agentId: string): Promise<void> {\n if (!this.model) return;\n const allRecent = await this.store.getRecentMessages(agentId, this.summarizeAfter);\n if (allRecent.length === 0) return;\n const summaryResponse = await this.model.chat([\n {\n role: 'system',\n content:\n 'Summarize the following conversation concisely. Focus on key topics, decisions, and facts discussed.',\n timestamp: Date.now(),\n },\n ...allRecent,\n ]);\n const summary = createSummary({\n content: summaryResponse.content,\n messageRange: {\n from: allRecent[0].timestamp,\n to: allRecent[allRecent.length - 1].timestamp,\n },\n });\n await this.store.saveSummary(agentId, summary);\n }\n\n close(): void {\n if (\n 'close' in this.store &&\n typeof (this.store as { close: () => void }).close === 'function'\n ) {\n (this.store as { close: () => void }).close();\n }\n }\n}\n"],"mappings":"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","names":["require"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
interface ToolCall {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
arguments: string;
|
|
5
|
+
}
|
|
6
|
+
interface Message {
|
|
7
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
8
|
+
content: string;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
toolCalls?: ToolCall[];
|
|
11
|
+
toolCallId?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function createMessage(opts: Omit<Message, 'timestamp'> & {
|
|
14
|
+
timestamp?: number;
|
|
15
|
+
}): Message;
|
|
16
|
+
declare function isToolCallMessage(msg: Message): boolean;
|
|
17
|
+
interface Summary {
|
|
18
|
+
id: string;
|
|
19
|
+
content: string;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
messageRange: {
|
|
22
|
+
from: number;
|
|
23
|
+
to: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
declare function createSummary(opts: Omit<Summary, 'id' | 'timestamp' | 'messageRange'> & {
|
|
27
|
+
id?: string;
|
|
28
|
+
timestamp?: number;
|
|
29
|
+
messageRange?: {
|
|
30
|
+
from: number;
|
|
31
|
+
to: number;
|
|
32
|
+
};
|
|
33
|
+
}): Summary;
|
|
34
|
+
interface ModelConfig {
|
|
35
|
+
provider?: 'ollama';
|
|
36
|
+
baseURL?: string;
|
|
37
|
+
apiKey?: string;
|
|
38
|
+
model: string;
|
|
39
|
+
}
|
|
40
|
+
interface ModelResponse {
|
|
41
|
+
content: string;
|
|
42
|
+
toolCalls?: ToolCall[];
|
|
43
|
+
tokens?: {
|
|
44
|
+
input: number;
|
|
45
|
+
output: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
interface ModelChunk {
|
|
49
|
+
text: string;
|
|
50
|
+
toolCalls?: ToolCall[];
|
|
51
|
+
done: boolean;
|
|
52
|
+
}
|
|
53
|
+
interface ToolDefinition {
|
|
54
|
+
name: string;
|
|
55
|
+
description: string;
|
|
56
|
+
parameters: Record<string, ParameterDef>;
|
|
57
|
+
}
|
|
58
|
+
interface ParameterDef {
|
|
59
|
+
type: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
enum?: string[];
|
|
62
|
+
required?: boolean;
|
|
63
|
+
}
|
|
64
|
+
interface AgentEvent {
|
|
65
|
+
type: string;
|
|
66
|
+
timestamp: number;
|
|
67
|
+
agentId: string;
|
|
68
|
+
data: Record<string, unknown>;
|
|
69
|
+
latencyMs?: number;
|
|
70
|
+
tokens?: {
|
|
71
|
+
input: number;
|
|
72
|
+
output: number;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface ModelAdapter {
|
|
77
|
+
chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse>;
|
|
78
|
+
stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface MemoryStore {
|
|
82
|
+
saveMessages(agentId: string, messages: Message[]): Promise<void>;
|
|
83
|
+
getRecentMessages(agentId: string, limit: number): Promise<Message[]>;
|
|
84
|
+
saveSummary(agentId: string, summary: Summary): Promise<void>;
|
|
85
|
+
searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface MemoryConfig {
|
|
89
|
+
store?: 'memory' | 'sqlite' | MemoryStore;
|
|
90
|
+
path?: string;
|
|
91
|
+
windowSize?: number;
|
|
92
|
+
summarizeAfter?: number;
|
|
93
|
+
}
|
|
94
|
+
interface MemoryContext {
|
|
95
|
+
recentMessages: Message[];
|
|
96
|
+
relevantSummaries: Summary[];
|
|
97
|
+
}
|
|
98
|
+
declare class Memory {
|
|
99
|
+
private store;
|
|
100
|
+
private windowSize;
|
|
101
|
+
private summarizeAfter;
|
|
102
|
+
private model?;
|
|
103
|
+
private messageCount;
|
|
104
|
+
constructor(config?: MemoryConfig);
|
|
105
|
+
setModel(model: ModelAdapter): void;
|
|
106
|
+
getStore(): MemoryStore;
|
|
107
|
+
saveExchange(agentId: string, messages: Message[]): Promise<void>;
|
|
108
|
+
getContext(agentId: string, query: string): Promise<MemoryContext>;
|
|
109
|
+
private summarize;
|
|
110
|
+
close(): void;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface ToolConfig {
|
|
114
|
+
name: string;
|
|
115
|
+
description: string;
|
|
116
|
+
parameters: Record<string, ParameterDef>;
|
|
117
|
+
execute: (params: Record<string, unknown>) => Promise<unknown>;
|
|
118
|
+
}
|
|
119
|
+
declare class Tool {
|
|
120
|
+
readonly name: string;
|
|
121
|
+
readonly description: string;
|
|
122
|
+
readonly definition: ToolDefinition;
|
|
123
|
+
private executeFn;
|
|
124
|
+
private constructor();
|
|
125
|
+
static create(config: ToolConfig): Tool;
|
|
126
|
+
execute(params: Record<string, unknown>): Promise<unknown>;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
interface AgentConfig {
|
|
130
|
+
name: string;
|
|
131
|
+
model?: ModelAdapter | ModelConfig;
|
|
132
|
+
memory?: Memory;
|
|
133
|
+
tools?: Tool[];
|
|
134
|
+
system?: string;
|
|
135
|
+
maxToolRounds?: number;
|
|
136
|
+
}
|
|
137
|
+
declare class Agent {
|
|
138
|
+
private name;
|
|
139
|
+
private model;
|
|
140
|
+
private memory?;
|
|
141
|
+
private tools;
|
|
142
|
+
private toolMap;
|
|
143
|
+
private system?;
|
|
144
|
+
private maxToolRounds;
|
|
145
|
+
private emitter;
|
|
146
|
+
constructor(config: AgentConfig);
|
|
147
|
+
private isModelAdapter;
|
|
148
|
+
on(type: string, handler: (event: AgentEvent) => void): void;
|
|
149
|
+
off(type: string, handler: (event: AgentEvent) => void): void;
|
|
150
|
+
private emit;
|
|
151
|
+
chat(input: string): Promise<ModelResponse>;
|
|
152
|
+
stream(input: string): AsyncIterable<ModelChunk>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
declare class MockAdapter implements ModelAdapter {
|
|
156
|
+
chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse>;
|
|
157
|
+
stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk>;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
interface OpenAIAdapterConfig {
|
|
161
|
+
baseURL: string;
|
|
162
|
+
model: string;
|
|
163
|
+
apiKey?: string;
|
|
164
|
+
}
|
|
165
|
+
declare class OpenAICompatibleAdapter implements ModelAdapter {
|
|
166
|
+
private config;
|
|
167
|
+
constructor(config: OpenAIAdapterConfig);
|
|
168
|
+
chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse>;
|
|
169
|
+
stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk>;
|
|
170
|
+
private toOpenAIMessage;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
declare class InMemoryStore implements MemoryStore {
|
|
174
|
+
private messages;
|
|
175
|
+
private summaries;
|
|
176
|
+
saveMessages(agentId: string, messages: Message[]): Promise<void>;
|
|
177
|
+
getRecentMessages(agentId: string, limit: number): Promise<Message[]>;
|
|
178
|
+
saveSummary(agentId: string, summary: Summary): Promise<void>;
|
|
179
|
+
searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
declare class SQLiteStore implements MemoryStore {
|
|
183
|
+
private db;
|
|
184
|
+
constructor(path: string);
|
|
185
|
+
private init;
|
|
186
|
+
saveMessages(agentId: string, messages: Message[]): Promise<void>;
|
|
187
|
+
getRecentMessages(agentId: string, limit: number): Promise<Message[]>;
|
|
188
|
+
saveSummary(agentId: string, summary: Summary): Promise<void>;
|
|
189
|
+
searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]>;
|
|
190
|
+
close(): void;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
type EventHandler = (event: AgentEvent) => void;
|
|
194
|
+
declare class AgentEventEmitter {
|
|
195
|
+
private listeners;
|
|
196
|
+
on(type: string, handler: EventHandler): void;
|
|
197
|
+
off(type: string, handler: EventHandler): void;
|
|
198
|
+
emit(event: AgentEvent): void;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { Agent, type AgentConfig, type AgentEvent, AgentEventEmitter, InMemoryStore, Memory, type MemoryConfig, type MemoryContext, type MemoryStore, type Message, MockAdapter, type ModelAdapter, type ModelChunk, type ModelConfig, type ModelResponse, type OpenAIAdapterConfig, OpenAICompatibleAdapter, type ParameterDef, SQLiteStore, type Summary, Tool, type ToolCall, type ToolDefinition, createMessage, createSummary, isToolCallMessage };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
interface ToolCall {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
arguments: string;
|
|
5
|
+
}
|
|
6
|
+
interface Message {
|
|
7
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
8
|
+
content: string;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
toolCalls?: ToolCall[];
|
|
11
|
+
toolCallId?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function createMessage(opts: Omit<Message, 'timestamp'> & {
|
|
14
|
+
timestamp?: number;
|
|
15
|
+
}): Message;
|
|
16
|
+
declare function isToolCallMessage(msg: Message): boolean;
|
|
17
|
+
interface Summary {
|
|
18
|
+
id: string;
|
|
19
|
+
content: string;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
messageRange: {
|
|
22
|
+
from: number;
|
|
23
|
+
to: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
declare function createSummary(opts: Omit<Summary, 'id' | 'timestamp' | 'messageRange'> & {
|
|
27
|
+
id?: string;
|
|
28
|
+
timestamp?: number;
|
|
29
|
+
messageRange?: {
|
|
30
|
+
from: number;
|
|
31
|
+
to: number;
|
|
32
|
+
};
|
|
33
|
+
}): Summary;
|
|
34
|
+
interface ModelConfig {
|
|
35
|
+
provider?: 'ollama';
|
|
36
|
+
baseURL?: string;
|
|
37
|
+
apiKey?: string;
|
|
38
|
+
model: string;
|
|
39
|
+
}
|
|
40
|
+
interface ModelResponse {
|
|
41
|
+
content: string;
|
|
42
|
+
toolCalls?: ToolCall[];
|
|
43
|
+
tokens?: {
|
|
44
|
+
input: number;
|
|
45
|
+
output: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
interface ModelChunk {
|
|
49
|
+
text: string;
|
|
50
|
+
toolCalls?: ToolCall[];
|
|
51
|
+
done: boolean;
|
|
52
|
+
}
|
|
53
|
+
interface ToolDefinition {
|
|
54
|
+
name: string;
|
|
55
|
+
description: string;
|
|
56
|
+
parameters: Record<string, ParameterDef>;
|
|
57
|
+
}
|
|
58
|
+
interface ParameterDef {
|
|
59
|
+
type: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
enum?: string[];
|
|
62
|
+
required?: boolean;
|
|
63
|
+
}
|
|
64
|
+
interface AgentEvent {
|
|
65
|
+
type: string;
|
|
66
|
+
timestamp: number;
|
|
67
|
+
agentId: string;
|
|
68
|
+
data: Record<string, unknown>;
|
|
69
|
+
latencyMs?: number;
|
|
70
|
+
tokens?: {
|
|
71
|
+
input: number;
|
|
72
|
+
output: number;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface ModelAdapter {
|
|
77
|
+
chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse>;
|
|
78
|
+
stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface MemoryStore {
|
|
82
|
+
saveMessages(agentId: string, messages: Message[]): Promise<void>;
|
|
83
|
+
getRecentMessages(agentId: string, limit: number): Promise<Message[]>;
|
|
84
|
+
saveSummary(agentId: string, summary: Summary): Promise<void>;
|
|
85
|
+
searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface MemoryConfig {
|
|
89
|
+
store?: 'memory' | 'sqlite' | MemoryStore;
|
|
90
|
+
path?: string;
|
|
91
|
+
windowSize?: number;
|
|
92
|
+
summarizeAfter?: number;
|
|
93
|
+
}
|
|
94
|
+
interface MemoryContext {
|
|
95
|
+
recentMessages: Message[];
|
|
96
|
+
relevantSummaries: Summary[];
|
|
97
|
+
}
|
|
98
|
+
declare class Memory {
|
|
99
|
+
private store;
|
|
100
|
+
private windowSize;
|
|
101
|
+
private summarizeAfter;
|
|
102
|
+
private model?;
|
|
103
|
+
private messageCount;
|
|
104
|
+
constructor(config?: MemoryConfig);
|
|
105
|
+
setModel(model: ModelAdapter): void;
|
|
106
|
+
getStore(): MemoryStore;
|
|
107
|
+
saveExchange(agentId: string, messages: Message[]): Promise<void>;
|
|
108
|
+
getContext(agentId: string, query: string): Promise<MemoryContext>;
|
|
109
|
+
private summarize;
|
|
110
|
+
close(): void;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface ToolConfig {
|
|
114
|
+
name: string;
|
|
115
|
+
description: string;
|
|
116
|
+
parameters: Record<string, ParameterDef>;
|
|
117
|
+
execute: (params: Record<string, unknown>) => Promise<unknown>;
|
|
118
|
+
}
|
|
119
|
+
declare class Tool {
|
|
120
|
+
readonly name: string;
|
|
121
|
+
readonly description: string;
|
|
122
|
+
readonly definition: ToolDefinition;
|
|
123
|
+
private executeFn;
|
|
124
|
+
private constructor();
|
|
125
|
+
static create(config: ToolConfig): Tool;
|
|
126
|
+
execute(params: Record<string, unknown>): Promise<unknown>;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
interface AgentConfig {
|
|
130
|
+
name: string;
|
|
131
|
+
model?: ModelAdapter | ModelConfig;
|
|
132
|
+
memory?: Memory;
|
|
133
|
+
tools?: Tool[];
|
|
134
|
+
system?: string;
|
|
135
|
+
maxToolRounds?: number;
|
|
136
|
+
}
|
|
137
|
+
declare class Agent {
|
|
138
|
+
private name;
|
|
139
|
+
private model;
|
|
140
|
+
private memory?;
|
|
141
|
+
private tools;
|
|
142
|
+
private toolMap;
|
|
143
|
+
private system?;
|
|
144
|
+
private maxToolRounds;
|
|
145
|
+
private emitter;
|
|
146
|
+
constructor(config: AgentConfig);
|
|
147
|
+
private isModelAdapter;
|
|
148
|
+
on(type: string, handler: (event: AgentEvent) => void): void;
|
|
149
|
+
off(type: string, handler: (event: AgentEvent) => void): void;
|
|
150
|
+
private emit;
|
|
151
|
+
chat(input: string): Promise<ModelResponse>;
|
|
152
|
+
stream(input: string): AsyncIterable<ModelChunk>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
declare class MockAdapter implements ModelAdapter {
|
|
156
|
+
chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse>;
|
|
157
|
+
stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk>;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
interface OpenAIAdapterConfig {
|
|
161
|
+
baseURL: string;
|
|
162
|
+
model: string;
|
|
163
|
+
apiKey?: string;
|
|
164
|
+
}
|
|
165
|
+
declare class OpenAICompatibleAdapter implements ModelAdapter {
|
|
166
|
+
private config;
|
|
167
|
+
constructor(config: OpenAIAdapterConfig);
|
|
168
|
+
chat(messages: Message[], tools?: ToolDefinition[]): Promise<ModelResponse>;
|
|
169
|
+
stream(messages: Message[], tools?: ToolDefinition[]): AsyncIterable<ModelChunk>;
|
|
170
|
+
private toOpenAIMessage;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
declare class InMemoryStore implements MemoryStore {
|
|
174
|
+
private messages;
|
|
175
|
+
private summaries;
|
|
176
|
+
saveMessages(agentId: string, messages: Message[]): Promise<void>;
|
|
177
|
+
getRecentMessages(agentId: string, limit: number): Promise<Message[]>;
|
|
178
|
+
saveSummary(agentId: string, summary: Summary): Promise<void>;
|
|
179
|
+
searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
declare class SQLiteStore implements MemoryStore {
|
|
183
|
+
private db;
|
|
184
|
+
constructor(path: string);
|
|
185
|
+
private init;
|
|
186
|
+
saveMessages(agentId: string, messages: Message[]): Promise<void>;
|
|
187
|
+
getRecentMessages(agentId: string, limit: number): Promise<Message[]>;
|
|
188
|
+
saveSummary(agentId: string, summary: Summary): Promise<void>;
|
|
189
|
+
searchSummaries(agentId: string, query: string, limit: number): Promise<Summary[]>;
|
|
190
|
+
close(): void;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
type EventHandler = (event: AgentEvent) => void;
|
|
194
|
+
declare class AgentEventEmitter {
|
|
195
|
+
private listeners;
|
|
196
|
+
on(type: string, handler: EventHandler): void;
|
|
197
|
+
off(type: string, handler: EventHandler): void;
|
|
198
|
+
emit(event: AgentEvent): void;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { Agent, type AgentConfig, type AgentEvent, AgentEventEmitter, InMemoryStore, Memory, type MemoryConfig, type MemoryContext, type MemoryStore, type Message, MockAdapter, type ModelAdapter, type ModelChunk, type ModelConfig, type ModelResponse, type OpenAIAdapterConfig, OpenAICompatibleAdapter, type ParameterDef, SQLiteStore, type Summary, Tool, type ToolCall, type ToolDefinition, createMessage, createSummary, isToolCallMessage };
|