@gendive/chatllm 0.1.0 → 0.2.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/dist/index.js CHANGED
@@ -2197,3 +2197,4 @@ function clearSkillApplicationHistory(chatId) {
2197
2197
  validateProviderConfig,
2198
2198
  wrapProviderError
2199
2199
  });
2200
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/types.ts","../src/providers/base.ts","../src/config.ts","../src/utils/errors.ts","../src/utils/stream.ts","../src/providers/ollama.ts","../src/core/message.ts","../src/core/session.ts","../src/core/chat.ts","../src/memory/storage.ts","../src/memory/global.ts","../src/memory/chat.ts","../src/memory/manager.ts","../src/acontext/observer.ts","../src/acontext/learner.ts","../src/acontext/skills.ts"],"sourcesContent":["/**\n * devdive-chatLLM\n * Multi-LLM chat library with model switching, memory, function calling, and Acontext support\n */\n\n// ============================================================================\n// Core Types\n// ============================================================================\nexport type {\n ProviderType,\n ProviderConfigs,\n OpenAIConfig,\n AnthropicConfig,\n GoogleConfig,\n NaverConfig,\n OllamaConfig,\n Role,\n Message,\n ToolCall,\n ToolResult,\n ParameterSchema,\n ToolDefinition,\n ChatConfig,\n Chat,\n SendOptions,\n StreamEventType,\n StreamEvent,\n MemoryEntry,\n GlobalMemoryStore,\n TaskStatus,\n ObservedTask,\n UserPreference,\n LearnedSkill,\n SkillStep,\n ObserverConfig,\n ObserverState,\n // Personalization Types\n StyleLevel,\n FormattingStyle,\n ResponseStyle,\n UserProfile,\n PersonalizationConfig,\n // LLM Chat Hook Integration Types\n MutationResult,\n ToolHook,\n LLMToolConfig,\n LLMActionConfig,\n LLMChatHookConfig,\n LLMChatComponentProps,\n} from './types';\n\nexport { DEFAULT_PERSONALIZATION } from './types';\n\n// ============================================================================\n// Chat Functions\n// ============================================================================\nexport {\n createChat,\n sendMessage,\n sendMessageStream,\n registerTool,\n unregisterTool,\n getTools,\n setSystemPrompt,\n getMessages,\n clearMessages,\n resetChat,\n getSession,\n destroyChat,\n} from './core/chat';\n\n// ============================================================================\n// Message Utilities\n// ============================================================================\nexport {\n createMessage,\n createUserMessage,\n createAssistantMessage,\n createSystemMessage,\n createToolMessage,\n cloneMessage,\n filterByRole,\n filterByProvider,\n getLastMessageByRole,\n getTotalContentLength,\n truncateMessages,\n formatMessagesForDisplay,\n} from './core/message';\n\n// ============================================================================\n// Session Functions\n// ============================================================================\nexport {\n createSession,\n addMessage as addSessionMessage,\n addMessages as addSessionMessages,\n getMessagesForProvider,\n setSystemPrompt as setSessionSystemPrompt,\n clearMessages as clearSessionMessages,\n getLastMessages,\n getMessagesAfter,\n getSessionSummary,\n setSessionMetadata,\n serializeSession,\n deserializeSession,\n type Session,\n} from './core/session';\n\n// ============================================================================\n// Providers\n// ============================================================================\nexport { BaseProvider, ProviderRegistry } from './providers/base';\nexport { OllamaProvider } from './providers/ollama';\n\n// ============================================================================\n// Errors\n// ============================================================================\nexport {\n ChatLLMError,\n ProviderError,\n ConfigurationError,\n ToolExecutionError,\n StorageError,\n StreamError,\n ValidationError,\n wrapProviderError,\n isProviderError,\n isToolExecutionError,\n isStorageError,\n} from './utils/errors';\n\n// ============================================================================\n// Stream Utilities\n// ============================================================================\nexport {\n parseSSEStream,\n parseNDJSONStream,\n createStreamEvent,\n collectStreamContent,\n} from './utils/stream';\n\n// ============================================================================\n// Config\n// ============================================================================\nexport {\n DEFAULT_STORAGE_PATH,\n DEFAULT_OLLAMA_BASE_URL,\n DEFAULT_MODELS,\n validateProviderConfig,\n getProviderBaseUrl,\n getDefaultModel,\n mergeConfig,\n} from './config';\n\n// ============================================================================\n// Memory - Storage\n// ============================================================================\nexport {\n FileStorage,\n MemoryStorage,\n type Storage,\n} from './memory/storage';\n\n// ============================================================================\n// Memory - Global\n// ============================================================================\nexport {\n initGlobalMemory,\n getGlobalMemoryStore,\n setGlobalMemory,\n getGlobalMemory,\n deleteGlobalMemory,\n hasGlobalMemory,\n getGlobalMemoryKeys,\n clearGlobalMemory,\n getGlobalMemoryContext,\n} from './memory/global';\n\n// ============================================================================\n// Memory - Chat\n// ============================================================================\nexport {\n initChatMemory,\n setChatMemory,\n getChatMemory,\n deleteChatMemory,\n hasChatMemory,\n getChatMemoryKeys,\n clearChatMemory,\n getChatMemoryContext,\n syncChatMemory,\n} from './memory/chat';\n\n// ============================================================================\n// Memory - Manager\n// ============================================================================\nexport {\n initMemory,\n getMemoryContext,\n buildSystemPromptWithMemory,\n type MemoryManagerConfig,\n} from './memory/manager';\n\n// ============================================================================\n// Acontext - Types\n// ============================================================================\nexport type {\n TaskExtractionResult,\n ExtractedTask,\n ExtractedPreference,\n LearningInput,\n LearningStep,\n SkillSearchOptions,\n SkillApplicationResult,\n ObserverEventType,\n ObserverEvent,\n ObserverCallback,\n} from './acontext/types';\n\n// ============================================================================\n// Acontext - Observer\n// ============================================================================\nexport {\n enableObserver,\n disableObserver,\n isObserverEnabled,\n getObserverConfig,\n onObserverEvent,\n analyzeMessages,\n processMessages,\n getObservedTasks,\n getObservedPreferences,\n updateTaskStatus,\n clearObserverState,\n getObserverState,\n} from './acontext/observer';\n\n// ============================================================================\n// Acontext - Learner\n// ============================================================================\nexport {\n initLearner,\n learnFromConversation,\n getLearnedSkills,\n searchLearnedSkills,\n getLearnedSkill,\n recordSkillUsage,\n deleteLearnedSkill,\n clearLearnedSkills,\n} from './acontext/learner';\n\n// ============================================================================\n// Acontext - Skills\n// ============================================================================\nexport {\n findRelevantSkills,\n applySkill,\n applySkillToSystemPrompt,\n getBestSkill,\n suggestSkills,\n recordSkillApplication,\n trackSkillApplication,\n updateSkillApplicationSuccess,\n getSkillApplicationHistory,\n clearSkillApplicationHistory,\n} from './acontext/skills';\n","/**\n * Core types for devdive-chatLLM\n */\n\n// ============================================================================\n// Provider Types\n// ============================================================================\n\nexport type ProviderType = 'openai' | 'anthropic' | 'google' | 'naver' | 'ollama';\n\nexport interface ProviderConfigs {\n openai?: OpenAIConfig;\n anthropic?: AnthropicConfig;\n google?: GoogleConfig;\n naver?: NaverConfig;\n ollama?: OllamaConfig;\n}\n\nexport interface OpenAIConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport interface AnthropicConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport interface GoogleConfig {\n apiKey: string;\n}\n\nexport interface NaverConfig {\n apiKey: string;\n apiGatewayKey: string;\n baseUrl?: string;\n}\n\nexport interface OllamaConfig {\n baseUrl?: string; // default: http://localhost:11434\n}\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\nexport type Role = 'system' | 'user' | 'assistant' | 'tool';\n\nexport interface Message {\n id: string;\n role: Role;\n content: string;\n provider?: ProviderType;\n model?: string;\n toolCalls?: ToolCall[];\n toolCallId?: string;\n timestamp: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolResult {\n toolCallId: string;\n result: unknown;\n error?: string;\n}\n\n// ============================================================================\n// Tool/Function Types\n// ============================================================================\n\nexport interface ParameterSchema {\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n description?: string;\n enum?: string[];\n items?: ParameterSchema;\n properties?: Record<string, ParameterSchema>;\n required?: string[];\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, ParameterSchema>;\n required?: string[];\n };\n handler: (params: Record<string, unknown>) => Promise<unknown> | unknown;\n}\n\n// ============================================================================\n// Chat & Session Types\n// ============================================================================\n\nexport interface ChatConfig {\n id?: string;\n providers: ProviderConfigs;\n defaultProvider: ProviderType;\n defaultModel?: string;\n storagePath?: string;\n systemPrompt?: string;\n /** 개인화 설정 */\n personalization?: Partial<PersonalizationConfig>;\n}\n\nexport interface Chat {\n id: string;\n config: ChatConfig;\n messages: Message[];\n tools: Map<string, ToolDefinition>;\n memory: Map<string, MemoryEntry>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SendOptions {\n provider?: ProviderType;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n tools?: ToolDefinition[];\n systemPrompt?: string;\n}\n\n// ============================================================================\n// Streaming Types\n// ============================================================================\n\nexport type StreamEventType = 'text' | 'tool_call' | 'tool_result' | 'done' | 'error';\n\nexport interface StreamEvent {\n type: StreamEventType;\n content?: string;\n toolCall?: ToolCall;\n toolResult?: ToolResult;\n error?: Error;\n message?: Message;\n}\n\n// ============================================================================\n// Memory Types\n// ============================================================================\n\nexport interface MemoryEntry {\n key: string;\n value: unknown;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface GlobalMemoryStore {\n entries: Map<string, MemoryEntry>;\n storagePath: string;\n}\n\n// ============================================================================\n// Acontext Types\n// ============================================================================\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\nexport interface ObservedTask {\n id: string;\n description: string;\n status: TaskStatus;\n progress: number; // 0-100\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface UserPreference {\n key: string;\n value: unknown;\n confidence: number; // 0-1\n source: string; // which message extracted this\n}\n\nexport interface LearnedSkill {\n id: string;\n name: string;\n description: string;\n category: string;\n steps: SkillStep[];\n successRate: number;\n usageCount: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SkillStep {\n order: number;\n action: string;\n expectedInput?: string;\n expectedOutput?: string;\n}\n\nexport interface ObserverConfig {\n extractTasks: boolean;\n extractPreferences: boolean;\n autoLearn: boolean;\n}\n\nexport interface ObserverState {\n enabled: boolean;\n config: ObserverConfig;\n tasks: ObservedTask[];\n preferences: UserPreference[];\n}\n\n// ============================================================================\n// Personalization Types (ChatGPT-style settings)\n// ============================================================================\n\nexport type StyleLevel = 'low' | 'medium' | 'high';\nexport type FormattingStyle = 'minimal' | 'default' | 'rich';\n\n/**\n * 응답 스타일 설정\n */\nexport interface ResponseStyle {\n /** 따뜻함 수준 */\n warmth: StyleLevel;\n /** 열정/에너지 수준 */\n enthusiasm: StyleLevel;\n /** 이모지 사용 수준 */\n emojiUsage: StyleLevel;\n /** 포맷팅 스타일 (헤더, 목록 등) */\n formatting: FormattingStyle;\n /** 응답 길이 선호 */\n verbosity: 'concise' | 'balanced' | 'detailed';\n}\n\n/**\n * 사용자 프로필 정보\n */\nexport interface UserProfile {\n /** 사용자 닉네임/호칭 */\n nickname?: string;\n /** 직업/역할 */\n occupation?: string;\n /** 추가 정보 (관심사, 가치, 선호 사항) */\n additionalInfo?: string;\n /** 선호 언어 */\n preferredLanguage?: string;\n /** 전문 분야 */\n expertise?: string[];\n /** 커스텀 지시사항 */\n customInstructions?: string;\n}\n\n/**\n * 개인화 설정 전체\n */\nexport interface PersonalizationConfig {\n /** 응답 스타일 */\n responseStyle: ResponseStyle;\n /** 사용자 프로필 */\n userProfile: UserProfile;\n /** 메모리 참조 활성화 */\n useMemory: boolean;\n /** 언어 설정 ('auto' | 'ko' | 'en' | etc.) */\n language: string;\n}\n\n/**\n * 개인화 설정 기본값\n */\nexport const DEFAULT_PERSONALIZATION: PersonalizationConfig = {\n responseStyle: {\n warmth: 'medium',\n enthusiasm: 'medium',\n emojiUsage: 'low',\n formatting: 'default',\n verbosity: 'balanced',\n },\n userProfile: {},\n useMemory: true,\n language: 'auto',\n};\n\n// ============================================================================\n// LLM Chat Hook Integration Types\n// ============================================================================\n\n/**\n * @description Hook 결과 타입 (React Query UseMutationResult 호환)\n */\nexport interface MutationResult<TData = unknown, TError = Error, TVariables = unknown> {\n mutate: (variables: TVariables) => void;\n mutateAsync: (variables: TVariables) => Promise<TData>;\n isPending: boolean;\n isError: boolean;\n isSuccess: boolean;\n data?: TData;\n error?: TError;\n reset: () => void;\n}\n\n/**\n * @description Tool/Action Hook 타입\n */\nexport type ToolHook<TRequest = unknown, TResponse = unknown> = () => MutationResult<TResponse, Error, TRequest>;\n\n/**\n * @description AI가 자동으로 호출하는 Tool 설정\n * AI가 사용자 메시지를 분석해서 필요시 자동 호출\n */\nexport interface LLMToolConfig<TRequest = unknown, TResponse = unknown> {\n /** Tool hook */\n hook: ToolHook<TRequest, TResponse>;\n /** AI가 판단할 때 사용하는 설명 */\n description: string;\n /** JSON Schema 형태의 파라미터 정의 (선택) */\n parameters?: {\n type: 'object';\n properties: Record<string, {\n type: string;\n description?: string;\n enum?: string[];\n }>;\n required?: string[];\n };\n}\n\n/**\n * @description 사용자가 UI에서 직접 선택하는 Action 설정\n */\nexport interface LLMActionConfig<TRequest = unknown, TResponse = unknown> {\n /** Action hook */\n hook: ToolHook<TRequest, TResponse>;\n /** UI에 표시할 레이블 */\n label: string;\n /** 아이콘 이름 또는 컴포넌트 */\n icon?: string;\n /** 비활성화 여부 */\n disabled?: boolean;\n}\n\n/**\n * @description 기본 채팅(텍스트 생성) 설정\n */\nexport interface LLMChatHookConfig<TRequest = unknown, TResponse = unknown> {\n /** 텍스트 생성 hook */\n hook: ToolHook<TRequest, TResponse>;\n /** 기본 시스템 프롬프트 */\n systemPrompt?: string;\n}\n\n/**\n * @description LLM Chat 컴포넌트 Props\n */\nexport interface LLMChatComponentProps {\n /** AI가 자동 호출하는 Tools */\n tools?: Record<string, LLMToolConfig>;\n /** 사용자가 직접 선택하는 Actions */\n actions?: Record<string, LLMActionConfig>;\n /** 기본 채팅 설정 */\n chat: LLMChatHookConfig;\n /** 스타일 클래스 */\n className?: string;\n /** 개인화 설정 */\n personalization?: Partial<PersonalizationConfig>;\n}\n","import type {\n ProviderType,\n Message,\n SendOptions,\n StreamEvent,\n ToolDefinition,\n ChatConfig,\n} from '../types';\n\n/**\n * Abstract base class for LLM providers\n * Each provider (OpenAI, Anthropic, etc.) must implement this interface\n */\nexport abstract class BaseProvider {\n abstract readonly name: ProviderType;\n\n constructor(protected config: ChatConfig) {}\n\n /**\n * Send a message and get a complete response\n */\n abstract sendMessage(\n messages: Message[],\n options: SendOptions\n ): Promise<Message>;\n\n /**\n * Send a message and stream the response\n */\n abstract sendMessageStream(\n messages: Message[],\n options: SendOptions\n ): AsyncGenerator<StreamEvent>;\n\n /**\n * Convert internal message format to provider-specific format\n */\n protected abstract formatMessages(messages: Message[]): unknown[];\n\n /**\n * Convert tool definitions to provider-specific format\n */\n protected abstract formatTools(tools: ToolDefinition[]): unknown[];\n\n /**\n * Parse provider response into internal message format\n */\n protected abstract parseResponse(response: unknown): Message;\n\n /**\n * Get the API endpoint URL\n */\n protected abstract getEndpoint(model: string): string;\n\n /**\n * Get headers for API requests\n */\n protected abstract getHeaders(): Record<string, string>;\n\n /**\n * Generate a unique message ID\n */\n protected generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Build the request body for API calls\n */\n protected abstract buildRequestBody(\n messages: unknown[],\n options: SendOptions,\n tools?: unknown[]\n ): unknown;\n}\n\n/**\n * Provider registry for managing available providers\n */\nexport class ProviderRegistry {\n private providers: Map<ProviderType, BaseProvider> = new Map();\n\n register(provider: BaseProvider): void {\n this.providers.set(provider.name, provider);\n }\n\n get(name: ProviderType): BaseProvider | undefined {\n return this.providers.get(name);\n }\n\n has(name: ProviderType): boolean {\n return this.providers.has(name);\n }\n\n getAll(): Map<ProviderType, BaseProvider> {\n return this.providers;\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport type { ChatConfig, ProviderType, OllamaConfig } from './types';\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_STORAGE_PATH = join(homedir(), '.devdive-chat');\n\nexport const DEFAULT_OLLAMA_BASE_URL = 'http://localhost:11434';\n\nexport const DEFAULT_MODELS: Record<ProviderType, string> = {\n openai: 'gpt-4',\n anthropic: 'claude-3-opus-20240229',\n google: 'gemini-pro',\n naver: 'HCX-003',\n ollama: 'llama2',\n};\n\n/**\n * Validates provider configuration\n */\nexport function validateProviderConfig(\n provider: ProviderType,\n config: ChatConfig\n): void {\n const providerConfig = config.providers[provider];\n\n if (!providerConfig) {\n throw new Error(`Provider \"${provider}\" is not configured`);\n }\n\n switch (provider) {\n case 'openai':\n if (!('apiKey' in providerConfig) || !providerConfig.apiKey) {\n throw new Error('OpenAI provider requires apiKey');\n }\n break;\n case 'anthropic':\n if (!('apiKey' in providerConfig) || !providerConfig.apiKey) {\n throw new Error('Anthropic provider requires apiKey');\n }\n break;\n case 'google':\n if (!('apiKey' in providerConfig) || !providerConfig.apiKey) {\n throw new Error('Google provider requires apiKey');\n }\n break;\n case 'naver':\n if (\n !('apiKey' in providerConfig) ||\n !providerConfig.apiKey ||\n !('apiGatewayKey' in providerConfig) ||\n !providerConfig.apiGatewayKey\n ) {\n throw new Error('Naver provider requires apiKey and apiGatewayKey');\n }\n break;\n case 'ollama':\n // Ollama doesn't require any credentials\n break;\n }\n}\n\n/**\n * Gets the base URL for a provider\n */\nexport function getProviderBaseUrl(\n provider: ProviderType,\n config: ChatConfig\n): string {\n const providerConfig = config.providers[provider];\n\n switch (provider) {\n case 'openai':\n return (providerConfig as { baseUrl?: string })?.baseUrl ?? 'https://api.openai.com/v1';\n case 'anthropic':\n return (providerConfig as { baseUrl?: string })?.baseUrl ?? 'https://api.anthropic.com';\n case 'google':\n return 'https://generativelanguage.googleapis.com';\n case 'naver':\n return (providerConfig as { baseUrl?: string })?.baseUrl ?? 'https://clovastudio.apigw.ntruss.com';\n case 'ollama':\n return (providerConfig as OllamaConfig)?.baseUrl ?? DEFAULT_OLLAMA_BASE_URL;\n }\n}\n\n/**\n * Gets the default model for a provider\n */\nexport function getDefaultModel(provider: ProviderType, config: ChatConfig): string {\n return config.defaultModel ?? DEFAULT_MODELS[provider];\n}\n\n/**\n * Merges user config with defaults\n */\nexport function mergeConfig(userConfig: ChatConfig): ChatConfig {\n return {\n ...userConfig,\n storagePath: userConfig.storagePath ?? DEFAULT_STORAGE_PATH,\n };\n}\n","/**\n * Custom error classes for devdive-chatLLM\n */\n\nexport class ChatLLMError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ChatLLMError';\n }\n}\n\nexport class ProviderError extends ChatLLMError {\n constructor(\n public provider: string,\n message: string,\n public statusCode?: number,\n public originalError?: Error\n ) {\n super(`[${provider}] ${message}`);\n this.name = 'ProviderError';\n }\n}\n\nexport class ConfigurationError extends ChatLLMError {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigurationError';\n }\n}\n\nexport class ToolExecutionError extends ChatLLMError {\n constructor(\n public toolName: string,\n message: string,\n public originalError?: Error\n ) {\n super(`Tool \"${toolName}\" execution failed: ${message}`);\n this.name = 'ToolExecutionError';\n }\n}\n\nexport class StorageError extends ChatLLMError {\n constructor(\n public operation: 'read' | 'write' | 'delete',\n message: string,\n public originalError?: Error\n ) {\n super(`Storage ${operation} failed: ${message}`);\n this.name = 'StorageError';\n }\n}\n\nexport class StreamError extends ChatLLMError {\n constructor(message: string, public originalError?: Error) {\n super(message);\n this.name = 'StreamError';\n }\n}\n\nexport class ValidationError extends ChatLLMError {\n constructor(\n public field: string,\n message: string\n ) {\n super(`Validation error for \"${field}\": ${message}`);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Wraps an error with provider context\n */\nexport function wrapProviderError(\n provider: string,\n error: unknown,\n statusCode?: number\n): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n const originalError = error instanceof Error ? error : undefined;\n\n return new ProviderError(provider, message, statusCode, originalError);\n}\n\n/**\n * Checks if an error is a specific type\n */\nexport function isProviderError(error: unknown): error is ProviderError {\n return error instanceof ProviderError;\n}\n\nexport function isToolExecutionError(error: unknown): error is ToolExecutionError {\n return error instanceof ToolExecutionError;\n}\n\nexport function isStorageError(error: unknown): error is StorageError {\n return error instanceof StorageError;\n}\n","import { StreamError } from './errors';\nimport type { StreamEvent } from '../types';\n\n/**\n * Parse Server-Sent Events (SSE) stream\n */\nexport async function* parseSSEStream(\n response: Response\n): AsyncGenerator<string> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new StreamError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith('data: ')) {\n const data = trimmed.slice(6);\n if (data !== '[DONE]') {\n yield data;\n }\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n if (trimmed.startsWith('data: ')) {\n const data = trimmed.slice(6);\n if (data !== '[DONE]') {\n yield data;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse NDJSON (Newline Delimited JSON) stream - used by Ollama\n */\nexport async function* parseNDJSONStream(\n response: Response\n): AsyncGenerator<unknown> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new StreamError('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n yield JSON.parse(trimmed);\n } catch {\n // Skip invalid JSON lines\n }\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.trim()) {\n try {\n yield JSON.parse(buffer.trim());\n } catch {\n // Skip invalid JSON\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Create a stream event helper\n */\nexport function createStreamEvent(\n type: StreamEvent['type'],\n data?: Partial<Omit<StreamEvent, 'type'>>\n): StreamEvent {\n return {\n type,\n ...data,\n };\n}\n\n/**\n * Collect all stream events into a single message content\n */\nexport async function collectStreamContent(\n stream: AsyncGenerator<StreamEvent>\n): Promise<string> {\n let content = '';\n for await (const event of stream) {\n if (event.type === 'text' && event.content) {\n content += event.content;\n }\n }\n return content;\n}\n","import { BaseProvider } from './base';\nimport { getProviderBaseUrl } from '../config';\nimport { wrapProviderError } from '../utils/errors';\nimport { parseNDJSONStream, createStreamEvent } from '../utils/stream';\nimport type {\n ProviderType,\n Message,\n SendOptions,\n StreamEvent,\n ToolDefinition,\n ToolCall,\n ChatConfig,\n} from '../types';\n\n/**\n * Ollama message format\n */\ninterface OllamaMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_calls?: OllamaToolCall[];\n}\n\ninterface OllamaToolCall {\n function: {\n name: string;\n arguments: Record<string, unknown>;\n };\n}\n\ninterface OllamaTool {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n };\n}\n\ninterface OllamaChatRequest {\n model: string;\n messages: OllamaMessage[];\n stream?: boolean;\n options?: {\n temperature?: number;\n num_predict?: number;\n };\n tools?: OllamaTool[];\n}\n\ninterface OllamaChatResponse {\n model: string;\n message: OllamaMessage;\n done: boolean;\n done_reason?: string;\n}\n\ninterface OllamaStreamChunk {\n model: string;\n message: {\n role: string;\n content: string;\n tool_calls?: OllamaToolCall[];\n };\n done: boolean;\n}\n\n/**\n * Ollama Provider implementation\n * Connects to local Ollama server for running open-source models\n */\nexport class OllamaProvider extends BaseProvider {\n readonly name: ProviderType = 'ollama';\n private baseUrl: string;\n\n constructor(config: ChatConfig) {\n super(config);\n this.baseUrl = getProviderBaseUrl('ollama', config);\n }\n\n /**\n * Send a message and get a complete response\n */\n async sendMessage(messages: Message[], options: SendOptions): Promise<Message> {\n const formattedMessages = this.formatMessages(messages);\n const tools = options.tools ? this.formatTools(options.tools) : undefined;\n const body = this.buildRequestBody(formattedMessages, options, tools);\n\n try {\n const response = await fetch(this.getEndpoint(options.model || 'llama2'), {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw wrapProviderError('ollama', errorText, response.status);\n }\n\n const data = await response.json() as OllamaChatResponse;\n return this.parseResponse(data);\n } catch (error) {\n throw wrapProviderError('ollama', error);\n }\n }\n\n /**\n * Send a message and stream the response\n */\n async *sendMessageStream(\n messages: Message[],\n options: SendOptions\n ): AsyncGenerator<StreamEvent> {\n const formattedMessages = this.formatMessages(messages);\n const tools = options.tools ? this.formatTools(options.tools) : undefined;\n const body = this.buildRequestBody(formattedMessages, options, tools);\n (body as OllamaChatRequest).stream = true;\n\n try {\n const response = await fetch(this.getEndpoint(options.model || 'llama2'), {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n yield createStreamEvent('error', {\n error: wrapProviderError('ollama', errorText, response.status),\n });\n return;\n }\n\n let fullContent = '';\n const toolCalls: ToolCall[] = [];\n\n for await (const chunk of parseNDJSONStream(response)) {\n const data = chunk as OllamaStreamChunk;\n\n if (data.message?.content) {\n fullContent += data.message.content;\n yield createStreamEvent('text', { content: data.message.content });\n }\n\n if (data.message?.tool_calls) {\n for (const tc of data.message.tool_calls) {\n const toolCall: ToolCall = {\n id: `call_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n name: tc.function.name,\n arguments: tc.function.arguments,\n };\n toolCalls.push(toolCall);\n yield createStreamEvent('tool_call', { toolCall });\n }\n }\n\n if (data.done) {\n const message: Message = {\n id: this.generateMessageId(),\n role: 'assistant',\n content: fullContent,\n provider: 'ollama',\n model: data.model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n timestamp: Date.now(),\n };\n yield createStreamEvent('done', { message });\n return;\n }\n }\n } catch (error) {\n yield createStreamEvent('error', {\n error: wrapProviderError('ollama', error),\n });\n }\n }\n\n /**\n * Convert internal message format to Ollama format\n */\n protected formatMessages(messages: Message[]): OllamaMessage[] {\n return messages.map((msg) => {\n const formatted: OllamaMessage = {\n role: msg.role,\n content: msg.content,\n };\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n formatted.tool_calls = msg.toolCalls.map((tc) => ({\n function: {\n name: tc.name,\n arguments: tc.arguments as Record<string, unknown>,\n },\n }));\n }\n\n return formatted;\n });\n }\n\n /**\n * Convert tool definitions to Ollama format\n */\n protected formatTools(tools: ToolDefinition[]): OllamaTool[] {\n return tools.map((tool) => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: 'object',\n properties: tool.parameters.properties as Record<string, unknown>,\n required: tool.parameters.required,\n },\n },\n }));\n }\n\n /**\n * Parse Ollama response into internal message format\n */\n protected parseResponse(response: OllamaChatResponse): Message {\n const toolCalls: ToolCall[] = [];\n\n if (response.message.tool_calls) {\n for (const tc of response.message.tool_calls) {\n toolCalls.push({\n id: `call_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n name: tc.function.name,\n arguments: tc.function.arguments,\n });\n }\n }\n\n return {\n id: this.generateMessageId(),\n role: 'assistant',\n content: response.message.content,\n provider: 'ollama',\n model: response.model,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Get the Ollama API endpoint\n */\n protected getEndpoint(_model: string): string {\n return `${this.baseUrl}/api/chat`;\n }\n\n /**\n * Get headers for Ollama API requests\n */\n protected getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n };\n }\n\n /**\n * Build request body for Ollama API\n */\n protected buildRequestBody(\n messages: unknown[],\n options: SendOptions,\n tools?: unknown[]\n ): OllamaChatRequest {\n const body: OllamaChatRequest = {\n model: options.model || 'llama2',\n messages: messages as OllamaMessage[],\n stream: false,\n };\n\n if (options.temperature !== undefined || options.maxTokens !== undefined) {\n body.options = {};\n if (options.temperature !== undefined) {\n body.options.temperature = options.temperature;\n }\n if (options.maxTokens !== undefined) {\n body.options.num_predict = options.maxTokens;\n }\n }\n\n if (tools && tools.length > 0) {\n body.tools = tools as OllamaTool[];\n }\n\n return body;\n }\n\n /**\n * List available models from Ollama\n */\n async listModels(): Promise<string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw wrapProviderError('ollama', 'Failed to list models', response.status);\n }\n\n const data = await response.json() as { models: Array<{ name: string }> };\n return data.models.map((m) => m.name);\n } catch (error) {\n throw wrapProviderError('ollama', error);\n }\n }\n\n /**\n * Check if Ollama server is available\n */\n async isAvailable(): Promise<boolean> {\n try {\n const response = await fetch(`${this.baseUrl}/api/tags`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n","import type { Message, Role, ProviderType, ToolCall } from '../types';\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Create a new message\n */\nexport function createMessage(\n role: Role,\n content: string,\n options?: {\n provider?: ProviderType;\n model?: string;\n toolCalls?: ToolCall[];\n toolCallId?: string;\n metadata?: Record<string, unknown>;\n }\n): Message {\n return {\n id: generateMessageId(),\n role,\n content,\n provider: options?.provider,\n model: options?.model,\n toolCalls: options?.toolCalls,\n toolCallId: options?.toolCallId,\n timestamp: Date.now(),\n metadata: options?.metadata,\n };\n}\n\n/**\n * Create a user message\n */\nexport function createUserMessage(content: string): Message {\n return createMessage('user', content);\n}\n\n/**\n * Create an assistant message\n */\nexport function createAssistantMessage(\n content: string,\n provider?: ProviderType,\n model?: string,\n toolCalls?: ToolCall[]\n): Message {\n return createMessage('assistant', content, { provider, model, toolCalls });\n}\n\n/**\n * Create a system message\n */\nexport function createSystemMessage(content: string): Message {\n return createMessage('system', content);\n}\n\n/**\n * Create a tool result message\n */\nexport function createToolMessage(\n content: string,\n toolCallId: string\n): Message {\n return createMessage('tool', content, { toolCallId });\n}\n\n/**\n * Clone a message with optional overrides\n */\nexport function cloneMessage(\n message: Message,\n overrides?: Partial<Message>\n): Message {\n return {\n ...message,\n ...overrides,\n id: overrides?.id ?? generateMessageId(),\n timestamp: overrides?.timestamp ?? Date.now(),\n };\n}\n\n/**\n * Filter messages by role\n */\nexport function filterByRole(messages: Message[], role: Role): Message[] {\n return messages.filter((m) => m.role === role);\n}\n\n/**\n * Filter messages by provider\n */\nexport function filterByProvider(\n messages: Message[],\n provider: ProviderType\n): Message[] {\n return messages.filter((m) => m.provider === provider);\n}\n\n/**\n * Get the last message of a specific role\n */\nexport function getLastMessageByRole(\n messages: Message[],\n role: Role\n): Message | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === role) {\n return messages[i];\n }\n }\n return undefined;\n}\n\n/**\n * Calculate total content length of messages\n */\nexport function getTotalContentLength(messages: Message[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0);\n}\n\n/**\n * Truncate messages to fit within a token limit (approximate)\n * Uses a simple character-based estimation (1 token ≈ 4 characters)\n */\nexport function truncateMessages(\n messages: Message[],\n maxTokens: number,\n preserveSystem: boolean = true\n): Message[] {\n const maxChars = maxTokens * 4;\n const result: Message[] = [];\n let currentLength = 0;\n\n // First pass: add system messages if preserveSystem is true\n if (preserveSystem) {\n for (const msg of messages) {\n if (msg.role === 'system') {\n result.push(msg);\n currentLength += msg.content.length;\n }\n }\n }\n\n // Second pass: add messages from the end (most recent first)\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n for (let i = nonSystemMessages.length - 1; i >= 0; i--) {\n const msg = nonSystemMessages[i];\n if (currentLength + msg.content.length <= maxChars) {\n result.unshift(msg);\n currentLength += msg.content.length;\n } else {\n break;\n }\n }\n\n // Sort by original order (system messages first, then by timestamp)\n return result.sort((a, b) => {\n if (a.role === 'system' && b.role !== 'system') return -1;\n if (a.role !== 'system' && b.role === 'system') return 1;\n return a.timestamp - b.timestamp;\n });\n}\n\n/**\n * Format messages for display/logging\n */\nexport function formatMessagesForDisplay(messages: Message[]): string {\n return messages\n .map((msg) => {\n const provider = msg.provider ? ` [${msg.provider}/${msg.model}]` : '';\n const prefix = `[${msg.role.toUpperCase()}]${provider}`;\n return `${prefix}: ${msg.content.substring(0, 100)}${msg.content.length > 100 ? '...' : ''}`;\n })\n .join('\\n');\n}\n","import type { Message, ProviderType } from '../types';\nimport { createSystemMessage } from './message';\n\n/**\n * Session represents a conversation context that can span multiple providers\n * This is inspired by Acontext's Session concept\n */\nexport interface Session {\n id: string;\n messages: Message[];\n systemPrompt?: string;\n createdAt: number;\n updatedAt: number;\n metadata: Record<string, unknown>;\n}\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Create a new session\n */\nexport function createSession(options?: {\n id?: string;\n systemPrompt?: string;\n metadata?: Record<string, unknown>;\n}): Session {\n const now = Date.now();\n return {\n id: options?.id ?? generateSessionId(),\n messages: [],\n systemPrompt: options?.systemPrompt,\n createdAt: now,\n updatedAt: now,\n metadata: options?.metadata ?? {},\n };\n}\n\n/**\n * Add a message to the session\n */\nexport function addMessage(session: Session, message: Message): Session {\n return {\n ...session,\n messages: [...session.messages, message],\n updatedAt: Date.now(),\n };\n}\n\n/**\n * Add multiple messages to the session\n */\nexport function addMessages(session: Session, messages: Message[]): Session {\n return {\n ...session,\n messages: [...session.messages, ...messages],\n updatedAt: Date.now(),\n };\n}\n\n/**\n * Get messages prepared for a specific provider\n * Includes system prompt as the first message if defined\n */\nexport function getMessagesForProvider(\n session: Session,\n _provider: ProviderType\n): Message[] {\n const messages: Message[] = [];\n\n // Add system prompt if exists\n if (session.systemPrompt) {\n messages.push(createSystemMessage(session.systemPrompt));\n }\n\n // Add all conversation messages\n messages.push(...session.messages);\n\n return messages;\n}\n\n/**\n * Update session system prompt\n */\nexport function setSystemPrompt(session: Session, prompt: string): Session {\n return {\n ...session,\n systemPrompt: prompt,\n updatedAt: Date.now(),\n };\n}\n\n/**\n * Clear session messages but keep system prompt\n */\nexport function clearMessages(session: Session): Session {\n return {\n ...session,\n messages: [],\n updatedAt: Date.now(),\n };\n}\n\n/**\n * Get the last N messages from session\n */\nexport function getLastMessages(session: Session, count: number): Message[] {\n return session.messages.slice(-count);\n}\n\n/**\n * Get messages after a specific timestamp\n */\nexport function getMessagesAfter(session: Session, timestamp: number): Message[] {\n return session.messages.filter((m) => m.timestamp > timestamp);\n}\n\n/**\n * Get a summary of the session\n */\nexport function getSessionSummary(session: Session): {\n id: string;\n messageCount: number;\n providers: ProviderType[];\n firstMessageAt: number | null;\n lastMessageAt: number | null;\n} {\n const providers = new Set<ProviderType>();\n let firstMessageAt: number | null = null;\n let lastMessageAt: number | null = null;\n\n for (const msg of session.messages) {\n if (msg.provider) {\n providers.add(msg.provider);\n }\n if (firstMessageAt === null || msg.timestamp < firstMessageAt) {\n firstMessageAt = msg.timestamp;\n }\n if (lastMessageAt === null || msg.timestamp > lastMessageAt) {\n lastMessageAt = msg.timestamp;\n }\n }\n\n return {\n id: session.id,\n messageCount: session.messages.length,\n providers: Array.from(providers),\n firstMessageAt,\n lastMessageAt,\n };\n}\n\n/**\n * Update session metadata\n */\nexport function setSessionMetadata(\n session: Session,\n key: string,\n value: unknown\n): Session {\n return {\n ...session,\n metadata: {\n ...session.metadata,\n [key]: value,\n },\n updatedAt: Date.now(),\n };\n}\n\n/**\n * Serialize session to JSON-compatible object\n */\nexport function serializeSession(session: Session): Record<string, unknown> {\n return {\n id: session.id,\n messages: session.messages,\n systemPrompt: session.systemPrompt,\n createdAt: session.createdAt,\n updatedAt: session.updatedAt,\n metadata: session.metadata,\n };\n}\n\n/**\n * Deserialize session from JSON-compatible object\n */\nexport function deserializeSession(data: Record<string, unknown>): Session {\n return {\n id: data.id as string,\n messages: data.messages as Message[],\n systemPrompt: data.systemPrompt as string | undefined,\n createdAt: data.createdAt as number,\n updatedAt: data.updatedAt as number,\n metadata: (data.metadata as Record<string, unknown>) ?? {},\n };\n}\n","import type {\n Chat,\n ChatConfig,\n Message,\n SendOptions,\n StreamEvent,\n ToolDefinition,\n ProviderType,\n} from '../types';\nimport { BaseProvider, ProviderRegistry } from '../providers/base';\nimport { OllamaProvider } from '../providers/ollama';\nimport { mergeConfig, getDefaultModel } from '../config';\nimport { ConfigurationError } from '../utils/errors';\nimport {\n createSession,\n addMessage,\n getMessagesForProvider,\n type Session,\n} from './session';\nimport { createUserMessage, createAssistantMessage } from './message';\n\n/**\n * Generate a unique chat ID\n */\nfunction generateChatId(): string {\n return `chat_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Internal chat state\n */\ninterface ChatState {\n chat: Chat;\n session: Session;\n providerRegistry: ProviderRegistry;\n}\n\n// Store for chat states\nconst chatStates = new Map<string, ChatState>();\n\n/**\n * Create a new chat instance\n */\nexport function createChat(config: ChatConfig): Chat {\n const mergedConfig = mergeConfig(config);\n const chatId = config.id ?? generateChatId();\n\n // Initialize provider registry\n const providerRegistry = new ProviderRegistry();\n\n // Register available providers based on config\n if (config.providers.ollama !== undefined || config.defaultProvider === 'ollama') {\n providerRegistry.register(new OllamaProvider(mergedConfig));\n }\n\n // TODO: Register other providers when implemented\n // if (config.providers.openai) {\n // providerRegistry.register(new OpenAIProvider(mergedConfig));\n // }\n\n // Validate default provider is available\n if (!providerRegistry.has(config.defaultProvider)) {\n // For ollama, we'll auto-register if it's the default\n if (config.defaultProvider === 'ollama') {\n providerRegistry.register(new OllamaProvider(mergedConfig));\n } else {\n throw new ConfigurationError(\n `Default provider \"${config.defaultProvider}\" is not configured`\n );\n }\n }\n\n const now = Date.now();\n const chat: Chat = {\n id: chatId,\n config: mergedConfig,\n messages: [],\n tools: new Map(),\n memory: new Map(),\n createdAt: now,\n updatedAt: now,\n };\n\n // Create session\n const session = createSession({\n systemPrompt: config.systemPrompt,\n });\n\n // Store state\n chatStates.set(chatId, {\n chat,\n session,\n providerRegistry,\n });\n\n return chat;\n}\n\n/**\n * Get internal chat state\n */\nfunction getChatState(chat: Chat): ChatState {\n const state = chatStates.get(chat.id);\n if (!state) {\n throw new ConfigurationError(`Chat \"${chat.id}\" not found`);\n }\n return state;\n}\n\n/**\n * Get provider instance for a chat\n */\nfunction getProvider(chat: Chat, providerType?: ProviderType): BaseProvider {\n const state = getChatState(chat);\n const type = providerType ?? chat.config.defaultProvider;\n\n const provider = state.providerRegistry.get(type);\n if (!provider) {\n throw new ConfigurationError(`Provider \"${type}\" is not available`);\n }\n\n return provider;\n}\n\n/**\n * Send a message and get a response\n */\nexport async function sendMessage(\n chat: Chat,\n content: string,\n options?: SendOptions\n): Promise<Message> {\n const state = getChatState(chat);\n const provider = getProvider(chat, options?.provider);\n const model = options?.model ?? getDefaultModel(provider.name, chat.config);\n\n // Create user message\n const userMessage = createUserMessage(content);\n\n // Add to session\n state.session = addMessage(state.session, userMessage);\n chat.messages.push(userMessage);\n\n // Get messages for provider (includes system prompt)\n const messages = getMessagesForProvider(state.session, provider.name);\n\n // Prepare tools\n const tools = options?.tools ?? Array.from(chat.tools.values());\n\n // Send to provider\n const sendOptions: SendOptions = {\n ...options,\n model,\n tools: tools.length > 0 ? tools : undefined,\n };\n\n const response = await provider.sendMessage(messages, sendOptions);\n\n // Add response to session\n state.session = addMessage(state.session, response);\n chat.messages.push(response);\n chat.updatedAt = Date.now();\n\n // Handle tool calls if present\n if (response.toolCalls && response.toolCalls.length > 0) {\n return await handleToolCalls(chat, response, sendOptions);\n }\n\n return response;\n}\n\n/**\n * Send a message and stream the response\n */\nexport async function* sendMessageStream(\n chat: Chat,\n content: string,\n options?: SendOptions\n): AsyncGenerator<StreamEvent> {\n const state = getChatState(chat);\n const provider = getProvider(chat, options?.provider);\n const model = options?.model ?? getDefaultModel(provider.name, chat.config);\n\n // Create user message\n const userMessage = createUserMessage(content);\n\n // Add to session\n state.session = addMessage(state.session, userMessage);\n chat.messages.push(userMessage);\n\n // Get messages for provider\n const messages = getMessagesForProvider(state.session, provider.name);\n\n // Prepare tools\n const tools = options?.tools ?? Array.from(chat.tools.values());\n\n // Send to provider\n const sendOptions: SendOptions = {\n ...options,\n model,\n tools: tools.length > 0 ? tools : undefined,\n };\n\n for await (const event of provider.sendMessageStream(messages, sendOptions)) {\n yield event;\n\n // When done, add the complete message to session\n if (event.type === 'done' && event.message) {\n state.session = addMessage(state.session, event.message);\n chat.messages.push(event.message);\n chat.updatedAt = Date.now();\n }\n }\n}\n\n/**\n * Handle tool calls by executing them and continuing the conversation\n */\nasync function handleToolCalls(\n chat: Chat,\n response: Message,\n options: SendOptions\n): Promise<Message> {\n const state = getChatState(chat);\n const provider = getProvider(chat, options.provider);\n\n if (!response.toolCalls) {\n return response;\n }\n\n // Execute each tool call\n for (const toolCall of response.toolCalls) {\n const tool = chat.tools.get(toolCall.name);\n if (!tool) {\n // Add error message for unknown tool\n const errorMessage = createAssistantMessage(\n `Tool \"${toolCall.name}\" not found`,\n provider.name,\n options.model\n );\n state.session = addMessage(state.session, errorMessage);\n continue;\n }\n\n try {\n // Execute the tool\n const result = await tool.handler(toolCall.arguments);\n\n // Create tool result message\n const toolResultMessage: Message = {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: 'tool',\n content: JSON.stringify(result),\n toolCallId: toolCall.id,\n timestamp: Date.now(),\n };\n\n state.session = addMessage(state.session, toolResultMessage);\n chat.messages.push(toolResultMessage);\n } catch (error) {\n // Create error message\n const errorContent = error instanceof Error ? error.message : String(error);\n const toolErrorMessage: Message = {\n id: `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n role: 'tool',\n content: JSON.stringify({ error: errorContent }),\n toolCallId: toolCall.id,\n timestamp: Date.now(),\n };\n\n state.session = addMessage(state.session, toolErrorMessage);\n chat.messages.push(toolErrorMessage);\n }\n }\n\n // Continue conversation to get final response\n const messages = getMessagesForProvider(state.session, provider.name);\n const finalResponse = await provider.sendMessage(messages, options);\n\n state.session = addMessage(state.session, finalResponse);\n chat.messages.push(finalResponse);\n chat.updatedAt = Date.now();\n\n // Recursively handle if there are more tool calls\n if (finalResponse.toolCalls && finalResponse.toolCalls.length > 0) {\n return handleToolCalls(chat, finalResponse, options);\n }\n\n return finalResponse;\n}\n\n/**\n * Register a tool for the chat\n */\nexport function registerTool(chat: Chat, tool: ToolDefinition): void {\n chat.tools.set(tool.name, tool);\n chat.updatedAt = Date.now();\n}\n\n/**\n * Unregister a tool from the chat\n */\nexport function unregisterTool(chat: Chat, toolName: string): boolean {\n const deleted = chat.tools.delete(toolName);\n if (deleted) {\n chat.updatedAt = Date.now();\n }\n return deleted;\n}\n\n/**\n * Get all registered tools\n */\nexport function getTools(chat: Chat): ToolDefinition[] {\n return Array.from(chat.tools.values());\n}\n\n/**\n * Set system prompt for the chat\n */\nexport function setSystemPrompt(chat: Chat, prompt: string): void {\n const state = getChatState(chat);\n state.session.systemPrompt = prompt;\n chat.config.systemPrompt = prompt;\n chat.updatedAt = Date.now();\n}\n\n/**\n * Get chat messages\n */\nexport function getMessages(chat: Chat): Message[] {\n return [...chat.messages];\n}\n\n/**\n * Clear chat messages only\n */\nexport function clearMessages(chat: Chat): void {\n const state = getChatState(chat);\n chat.messages = [];\n state.session.messages = [];\n chat.updatedAt = Date.now();\n}\n\n/**\n * Reset chat completely (messages, tools, memory)\n */\nexport function resetChat(chat: Chat): void {\n const state = getChatState(chat);\n\n // Clear messages\n chat.messages = [];\n state.session.messages = [];\n\n // Clear tools\n chat.tools.clear();\n\n // Clear memory\n chat.memory.clear();\n\n // Reset timestamps\n const now = Date.now();\n chat.updatedAt = now;\n state.session.updatedAt = now;\n}\n\n/**\n * Get chat session\n */\nexport function getSession(chat: Chat): Session {\n const state = getChatState(chat);\n return state.session;\n}\n\n/**\n * Destroy a chat and clean up resources\n */\nexport function destroyChat(chat: Chat): void {\n chatStates.delete(chat.id);\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { StorageError } from '../utils/errors';\n\n/**\n * File-based storage for persisting data\n */\nexport class FileStorage {\n private basePath: string;\n\n constructor(basePath: string) {\n this.basePath = basePath;\n this.ensureDirectory(basePath);\n }\n\n /**\n * Ensure a directory exists\n */\n private ensureDirectory(path: string): void {\n if (!existsSync(path)) {\n try {\n mkdirSync(path, { recursive: true });\n } catch (error) {\n throw new StorageError(\n 'write',\n `Failed to create directory: ${path}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n }\n\n /**\n * Get the full path for a key\n */\n private getFilePath(key: string): string {\n // Sanitize key to be a valid filename\n const sanitizedKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(this.basePath, `${sanitizedKey}.json`);\n }\n\n /**\n * Read data from storage\n */\n read<T>(key: string): T | null {\n const filePath = this.getFilePath(key);\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (error) {\n throw new StorageError(\n 'read',\n `Failed to read key: ${key}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Write data to storage\n */\n write<T>(key: string, data: T): void {\n const filePath = this.getFilePath(key);\n\n try {\n this.ensureDirectory(dirname(filePath));\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n } catch (error) {\n throw new StorageError(\n 'write',\n `Failed to write key: ${key}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Delete data from storage\n */\n delete(key: string): boolean {\n const filePath = this.getFilePath(key);\n\n if (!existsSync(filePath)) {\n return false;\n }\n\n try {\n unlinkSync(filePath);\n return true;\n } catch (error) {\n throw new StorageError(\n 'delete',\n `Failed to delete key: ${key}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Check if a key exists\n */\n exists(key: string): boolean {\n return existsSync(this.getFilePath(key));\n }\n\n /**\n * Get the base path\n */\n getBasePath(): string {\n return this.basePath;\n }\n}\n\n/**\n * In-memory storage (for testing or temporary use)\n */\nexport class MemoryStorage {\n private data: Map<string, unknown> = new Map();\n\n read<T>(key: string): T | null {\n const value = this.data.get(key);\n return value !== undefined ? (value as T) : null;\n }\n\n write<T>(key: string, data: T): void {\n this.data.set(key, data);\n }\n\n delete(key: string): boolean {\n return this.data.delete(key);\n }\n\n exists(key: string): boolean {\n return this.data.has(key);\n }\n\n clear(): void {\n this.data.clear();\n }\n\n getAll(): Map<string, unknown> {\n return new Map(this.data);\n }\n}\n\n/**\n * Storage interface for polymorphism\n */\nexport interface Storage {\n read<T>(key: string): T | null;\n write<T>(key: string, data: T): void;\n delete(key: string): boolean;\n exists(key: string): boolean;\n}\n","import { join } from 'path';\nimport type { MemoryEntry } from '../types';\nimport { FileStorage, MemoryStorage, type Storage } from './storage';\nimport { DEFAULT_STORAGE_PATH } from '../config';\n\n/**\n * Global memory store - shared across all chats\n */\nclass GlobalMemoryStore {\n private entries: Map<string, MemoryEntry> = new Map();\n private storage: Storage;\n private storageKey = 'global_memory';\n private autoSave: boolean;\n\n constructor(storagePath?: string, autoSave: boolean = true) {\n this.autoSave = autoSave;\n\n if (storagePath) {\n this.storage = new FileStorage(join(storagePath, 'memory'));\n this.load();\n } else {\n this.storage = new MemoryStorage();\n }\n }\n\n /**\n * Load entries from storage\n */\n private load(): void {\n const data = this.storage.read<Record<string, MemoryEntry>>(this.storageKey);\n if (data) {\n this.entries = new Map(Object.entries(data));\n }\n }\n\n /**\n * Save entries to storage\n */\n private save(): void {\n if (!this.autoSave) return;\n\n const data: Record<string, MemoryEntry> = {};\n for (const [key, value] of this.entries) {\n data[key] = value;\n }\n this.storage.write(this.storageKey, data);\n }\n\n /**\n * Set a memory entry\n */\n set(key: string, value: unknown): void {\n const now = Date.now();\n const existing = this.entries.get(key);\n\n this.entries.set(key, {\n key,\n value,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n\n this.save();\n }\n\n /**\n * Get a memory entry value\n */\n get<T = unknown>(key: string): T | undefined {\n const entry = this.entries.get(key);\n return entry?.value as T | undefined;\n }\n\n /**\n * Get a memory entry with metadata\n */\n getEntry(key: string): MemoryEntry | undefined {\n return this.entries.get(key);\n }\n\n /**\n * Check if a key exists\n */\n has(key: string): boolean {\n return this.entries.has(key);\n }\n\n /**\n * Delete a memory entry\n */\n delete(key: string): boolean {\n const deleted = this.entries.delete(key);\n if (deleted) {\n this.save();\n }\n return deleted;\n }\n\n /**\n * Get all memory entries\n */\n getAll(): Map<string, MemoryEntry> {\n return new Map(this.entries);\n }\n\n /**\n * Get all keys\n */\n keys(): string[] {\n return Array.from(this.entries.keys());\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.entries.clear();\n this.save();\n }\n\n /**\n * Get entries count\n */\n size(): number {\n return this.entries.size;\n }\n\n /**\n * Force save to storage\n */\n forceSave(): void {\n const originalAutoSave = this.autoSave;\n this.autoSave = true;\n this.save();\n this.autoSave = originalAutoSave;\n }\n\n /**\n * Convert entries to a format suitable for system prompt injection\n */\n toPromptContext(): string {\n if (this.entries.size === 0) {\n return '';\n }\n\n const lines: string[] = ['[Global Memory]'];\n for (const [key, entry] of this.entries) {\n const valueStr =\n typeof entry.value === 'object'\n ? JSON.stringify(entry.value)\n : String(entry.value);\n lines.push(`- ${key}: ${valueStr}`);\n }\n return lines.join('\\n');\n }\n}\n\n// Singleton instance\nlet globalMemoryInstance: GlobalMemoryStore | null = null;\n\n/**\n * Initialize global memory with storage path\n */\nexport function initGlobalMemory(storagePath?: string, autoSave: boolean = true): void {\n globalMemoryInstance = new GlobalMemoryStore(storagePath ?? DEFAULT_STORAGE_PATH, autoSave);\n}\n\n/**\n * Get global memory instance\n */\nexport function getGlobalMemoryStore(): GlobalMemoryStore {\n if (!globalMemoryInstance) {\n globalMemoryInstance = new GlobalMemoryStore();\n }\n return globalMemoryInstance;\n}\n\n/**\n * Set a global memory value\n */\nexport function setGlobalMemory(key: string, value: unknown): void {\n getGlobalMemoryStore().set(key, value);\n}\n\n/**\n * Get a global memory value\n */\nexport function getGlobalMemory<T = unknown>(key: string): T | undefined {\n return getGlobalMemoryStore().get<T>(key);\n}\n\n/**\n * Delete a global memory entry\n */\nexport function deleteGlobalMemory(key: string): boolean {\n return getGlobalMemoryStore().delete(key);\n}\n\n/**\n * Check if a global memory key exists\n */\nexport function hasGlobalMemory(key: string): boolean {\n return getGlobalMemoryStore().has(key);\n}\n\n/**\n * Get all global memory keys\n */\nexport function getGlobalMemoryKeys(): string[] {\n return getGlobalMemoryStore().keys();\n}\n\n/**\n * Clear all global memory\n */\nexport function clearGlobalMemory(): void {\n getGlobalMemoryStore().clear();\n}\n\n/**\n * Get global memory as prompt context\n */\nexport function getGlobalMemoryContext(): string {\n return getGlobalMemoryStore().toPromptContext();\n}\n","import { join } from 'path';\nimport type { Chat, MemoryEntry } from '../types';\nimport { FileStorage, MemoryStorage, type Storage } from './storage';\n\n/**\n * Chat-specific memory store\n */\nclass ChatMemoryStore {\n private storage: Storage;\n private autoSave: boolean;\n\n constructor(storagePath?: string, autoSave: boolean = true) {\n this.autoSave = autoSave;\n\n if (storagePath) {\n this.storage = new FileStorage(join(storagePath, 'chat_memory'));\n } else {\n this.storage = new MemoryStorage();\n }\n }\n\n /**\n * Get storage key for a chat\n */\n private getChatKey(chatId: string): string {\n return `chat_${chatId}`;\n }\n\n /**\n * Load chat memory from storage\n */\n private loadChatMemory(chatId: string): Map<string, MemoryEntry> {\n const data = this.storage.read<Record<string, MemoryEntry>>(this.getChatKey(chatId));\n if (data) {\n return new Map(Object.entries(data));\n }\n return new Map();\n }\n\n /**\n * Save chat memory to storage\n */\n private saveChatMemory(chatId: string, entries: Map<string, MemoryEntry>): void {\n if (!this.autoSave) return;\n\n const data: Record<string, MemoryEntry> = {};\n for (const [key, value] of entries) {\n data[key] = value;\n }\n this.storage.write(this.getChatKey(chatId), data);\n }\n\n /**\n * Set a memory entry for a chat\n */\n set(chatId: string, key: string, value: unknown): void {\n const entries = this.loadChatMemory(chatId);\n const now = Date.now();\n const existing = entries.get(key);\n\n entries.set(key, {\n key,\n value,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n\n this.saveChatMemory(chatId, entries);\n }\n\n /**\n * Get a memory entry value for a chat\n */\n get<T = unknown>(chatId: string, key: string): T | undefined {\n const entries = this.loadChatMemory(chatId);\n const entry = entries.get(key);\n return entry?.value as T | undefined;\n }\n\n /**\n * Get a memory entry with metadata\n */\n getEntry(chatId: string, key: string): MemoryEntry | undefined {\n const entries = this.loadChatMemory(chatId);\n return entries.get(key);\n }\n\n /**\n * Check if a key exists for a chat\n */\n has(chatId: string, key: string): boolean {\n const entries = this.loadChatMemory(chatId);\n return entries.has(key);\n }\n\n /**\n * Delete a memory entry for a chat\n */\n delete(chatId: string, key: string): boolean {\n const entries = this.loadChatMemory(chatId);\n const deleted = entries.delete(key);\n if (deleted) {\n this.saveChatMemory(chatId, entries);\n }\n return deleted;\n }\n\n /**\n * Get all memory entries for a chat\n */\n getAll(chatId: string): Map<string, MemoryEntry> {\n return this.loadChatMemory(chatId);\n }\n\n /**\n * Get all keys for a chat\n */\n keys(chatId: string): string[] {\n const entries = this.loadChatMemory(chatId);\n return Array.from(entries.keys());\n }\n\n /**\n * Clear all entries for a chat\n */\n clear(chatId: string): void {\n this.storage.delete(this.getChatKey(chatId));\n }\n\n /**\n * Get entries count for a chat\n */\n size(chatId: string): number {\n const entries = this.loadChatMemory(chatId);\n return entries.size;\n }\n\n /**\n * Convert chat memory to a format suitable for system prompt injection\n */\n toPromptContext(chatId: string): string {\n const entries = this.loadChatMemory(chatId);\n\n if (entries.size === 0) {\n return '';\n }\n\n const lines: string[] = ['[Chat Memory]'];\n for (const [key, entry] of entries) {\n const valueStr =\n typeof entry.value === 'object'\n ? JSON.stringify(entry.value)\n : String(entry.value);\n lines.push(`- ${key}: ${valueStr}`);\n }\n return lines.join('\\n');\n }\n}\n\n// Singleton instance\nlet chatMemoryInstance: ChatMemoryStore | null = null;\n\n/**\n * Initialize chat memory with storage path\n */\nexport function initChatMemory(storagePath?: string, autoSave: boolean = true): void {\n chatMemoryInstance = new ChatMemoryStore(storagePath, autoSave);\n}\n\n/**\n * Get chat memory instance\n */\nfunction getChatMemoryStore(): ChatMemoryStore {\n if (!chatMemoryInstance) {\n chatMemoryInstance = new ChatMemoryStore();\n }\n return chatMemoryInstance;\n}\n\n/**\n * Set a chat memory value\n */\nexport function setChatMemory(chat: Chat, key: string, value: unknown): void {\n getChatMemoryStore().set(chat.id, key, value);\n\n // Also update the chat's internal memory map\n const now = Date.now();\n const existing = chat.memory.get(key);\n chat.memory.set(key, {\n key,\n value,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n });\n}\n\n/**\n * Get a chat memory value\n */\nexport function getChatMemory<T = unknown>(chat: Chat, key: string): T | undefined {\n // First check chat's internal memory\n const internalEntry = chat.memory.get(key);\n if (internalEntry) {\n return internalEntry.value as T;\n }\n\n // Fall back to persistent storage\n return getChatMemoryStore().get<T>(chat.id, key);\n}\n\n/**\n * Delete a chat memory entry\n */\nexport function deleteChatMemory(chat: Chat, key: string): boolean {\n chat.memory.delete(key);\n return getChatMemoryStore().delete(chat.id, key);\n}\n\n/**\n * Check if a chat memory key exists\n */\nexport function hasChatMemory(chat: Chat, key: string): boolean {\n return chat.memory.has(key) || getChatMemoryStore().has(chat.id, key);\n}\n\n/**\n * Get all chat memory keys\n */\nexport function getChatMemoryKeys(chat: Chat): string[] {\n const internalKeys = Array.from(chat.memory.keys());\n const storedKeys = getChatMemoryStore().keys(chat.id);\n return [...new Set([...internalKeys, ...storedKeys])];\n}\n\n/**\n * Clear all chat memory\n */\nexport function clearChatMemory(chat: Chat): void {\n chat.memory.clear();\n getChatMemoryStore().clear(chat.id);\n}\n\n/**\n * Get chat memory as prompt context\n */\nexport function getChatMemoryContext(chat: Chat): string {\n return getChatMemoryStore().toPromptContext(chat.id);\n}\n\n/**\n * Sync chat's internal memory to persistent storage\n */\nexport function syncChatMemory(chat: Chat): void {\n for (const [key, entry] of chat.memory) {\n getChatMemoryStore().set(chat.id, key, entry.value);\n }\n}\n","import type { Chat } from '../types';\nimport { initGlobalMemory, getGlobalMemoryContext } from './global';\nimport { initChatMemory, getChatMemoryContext } from './chat';\n\n/**\n * Memory manager configuration\n */\nexport interface MemoryManagerConfig {\n storagePath?: string;\n autoSave?: boolean;\n}\n\n/**\n * Initialize memory system\n */\nexport function initMemory(config: MemoryManagerConfig = {}): void {\n initGlobalMemory(config.storagePath, config.autoSave);\n initChatMemory(config.storagePath, config.autoSave);\n}\n\n/**\n * Get combined memory context for prompt injection\n * Combines global memory and chat-specific memory\n */\nexport function getMemoryContext(chat: Chat): string {\n const globalContext = getGlobalMemoryContext();\n const chatContext = getChatMemoryContext(chat);\n\n const parts: string[] = [];\n\n if (globalContext) {\n parts.push(globalContext);\n }\n\n if (chatContext) {\n parts.push(chatContext);\n }\n\n return parts.join('\\n\\n');\n}\n\n/**\n * Build a system prompt with memory context injected\n */\nexport function buildSystemPromptWithMemory(\n basePrompt: string,\n chat: Chat\n): string {\n const memoryContext = getMemoryContext(chat);\n\n if (!memoryContext) {\n return basePrompt;\n }\n\n return `${basePrompt}\n\n---\n${memoryContext}\n---`;\n}\n","import type { Chat, Message, ObserverConfig, ObserverState, ObservedTask, UserPreference } from '../types';\nimport type { ObserverCallback, ObserverEvent, TaskExtractionResult } from './types';\n\n/**\n * Observer state storage per chat\n */\nconst observerStates = new Map<string, ObserverState>();\nconst observerCallbacks = new Map<string, ObserverCallback[]>();\n\n/**\n * Default observer configuration\n */\nconst DEFAULT_OBSERVER_CONFIG: ObserverConfig = {\n extractTasks: true,\n extractPreferences: true,\n autoLearn: false,\n};\n\n/**\n * Generate unique ID for observed items\n */\nfunction generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Get observer state for a chat\n */\nfunction getState(chatId: string): ObserverState {\n let state = observerStates.get(chatId);\n if (!state) {\n state = {\n enabled: false,\n config: { ...DEFAULT_OBSERVER_CONFIG },\n tasks: [],\n preferences: [],\n };\n observerStates.set(chatId, state);\n }\n return state;\n}\n\n/**\n * Emit an observer event\n */\nfunction emitEvent(chatId: string, event: ObserverEvent): void {\n const callbacks = observerCallbacks.get(chatId) || [];\n for (const callback of callbacks) {\n try {\n callback(event);\n } catch (error) {\n console.error('Observer callback error:', error);\n }\n }\n}\n\n/**\n * Enable observer for a chat\n */\nexport function enableObserver(chat: Chat, config?: Partial<ObserverConfig>): void {\n const state = getState(chat.id);\n state.enabled = true;\n state.config = { ...DEFAULT_OBSERVER_CONFIG, ...config };\n observerStates.set(chat.id, state);\n}\n\n/**\n * Disable observer for a chat\n */\nexport function disableObserver(chat: Chat): void {\n const state = getState(chat.id);\n state.enabled = false;\n observerStates.set(chat.id, state);\n}\n\n/**\n * Check if observer is enabled\n */\nexport function isObserverEnabled(chat: Chat): boolean {\n return getState(chat.id).enabled;\n}\n\n/**\n * Get observer configuration\n */\nexport function getObserverConfig(chat: Chat): ObserverConfig {\n return { ...getState(chat.id).config };\n}\n\n/**\n * Register an observer callback\n */\nexport function onObserverEvent(chat: Chat, callback: ObserverCallback): () => void {\n const callbacks = observerCallbacks.get(chat.id) || [];\n callbacks.push(callback);\n observerCallbacks.set(chat.id, callbacks);\n\n // Return unsubscribe function\n return () => {\n const currentCallbacks = observerCallbacks.get(chat.id) || [];\n const index = currentCallbacks.indexOf(callback);\n if (index > -1) {\n currentCallbacks.splice(index, 1);\n observerCallbacks.set(chat.id, currentCallbacks);\n }\n };\n}\n\n/**\n * Analyze messages and extract tasks/preferences\n * This is a simplified local extraction - in production, you might use LLM for this\n */\nexport function analyzeMessages(chat: Chat, messages?: Message[]): TaskExtractionResult {\n const state = getState(chat.id);\n if (!state.enabled) {\n return { tasks: [], preferences: [] };\n }\n\n const messagesToAnalyze = messages || chat.messages;\n const tasks: TaskExtractionResult['tasks'] = [];\n const preferences: TaskExtractionResult['preferences'] = [];\n\n // Simple heuristic-based extraction\n for (const msg of messagesToAnalyze) {\n if (msg.role === 'user') {\n // Extract potential tasks from user messages\n const taskPatterns = [\n /(?:해줘|해주세요|만들어|작성해|구현해|추가해|수정해|삭제해|찾아)/,\n /(?:please|create|make|write|implement|add|update|delete|find)/i,\n ];\n\n for (const pattern of taskPatterns) {\n if (pattern.test(msg.content)) {\n // Extract task description (first 100 chars)\n const description = msg.content.substring(0, 100).trim();\n tasks.push({\n description,\n status: 'pending',\n progress: 0,\n });\n break;\n }\n }\n\n // Extract preferences\n const preferencePatterns = [\n { pattern: /한국어|korean/i, key: 'language', value: 'ko' },\n { pattern: /영어|english/i, key: 'language', value: 'en' },\n { pattern: /간단히|짧게|briefly/i, key: 'response_length', value: 'short' },\n { pattern: /자세히|상세히|in detail/i, key: 'response_length', value: 'detailed' },\n { pattern: /코드로|with code/i, key: 'include_code', value: true },\n ];\n\n for (const { pattern, key, value } of preferencePatterns) {\n if (pattern.test(msg.content)) {\n preferences.push({\n key,\n value,\n confidence: 0.7,\n });\n }\n }\n }\n\n if (msg.role === 'assistant') {\n // Check if tasks are being completed\n const completionPatterns = [\n /완료|완성|done|finished|completed/i,\n ];\n\n for (const pattern of completionPatterns) {\n if (pattern.test(msg.content) && tasks.length > 0) {\n // Mark last pending task as completed\n for (let i = tasks.length - 1; i >= 0; i--) {\n if (tasks[i].status === 'pending') {\n tasks[i].status = 'completed';\n tasks[i].progress = 100;\n break;\n }\n }\n }\n }\n }\n }\n\n return { tasks, preferences };\n}\n\n/**\n * Process new messages and update observer state\n */\nexport function processMessages(chat: Chat, newMessages: Message[]): void {\n const state = getState(chat.id);\n if (!state.enabled) return;\n\n const extraction = analyzeMessages(chat, newMessages);\n const now = Date.now();\n\n // Add new tasks\n if (state.config.extractTasks) {\n for (const extractedTask of extraction.tasks) {\n const task: ObservedTask = {\n id: generateId('task'),\n description: extractedTask.description,\n status: extractedTask.status,\n progress: extractedTask.progress,\n createdAt: now,\n updatedAt: now,\n };\n\n state.tasks.push(task);\n\n emitEvent(chat.id, {\n type: 'task_detected',\n timestamp: now,\n data: task,\n });\n }\n }\n\n // Add new preferences\n if (state.config.extractPreferences) {\n for (const extractedPref of extraction.preferences) {\n // Update existing preference or add new one\n const existingIndex = state.preferences.findIndex(p => p.key === extractedPref.key);\n\n const preference: UserPreference = {\n key: extractedPref.key,\n value: extractedPref.value,\n confidence: extractedPref.confidence,\n source: `message_${newMessages[0]?.id || 'unknown'}`,\n };\n\n if (existingIndex >= 0) {\n state.preferences[existingIndex] = preference;\n } else {\n state.preferences.push(preference);\n }\n\n emitEvent(chat.id, {\n type: 'preference_detected',\n timestamp: now,\n data: preference,\n });\n }\n }\n\n observerStates.set(chat.id, state);\n}\n\n/**\n * Get observed tasks for a chat\n */\nexport function getObservedTasks(chat: Chat): ObservedTask[] {\n return [...getState(chat.id).tasks];\n}\n\n/**\n * Get observed preferences for a chat\n */\nexport function getObservedPreferences(chat: Chat): UserPreference[] {\n return [...getState(chat.id).preferences];\n}\n\n/**\n * Update a task's status\n */\nexport function updateTaskStatus(\n chat: Chat,\n taskId: string,\n status: ObservedTask['status'],\n progress?: number\n): boolean {\n const state = getState(chat.id);\n const task = state.tasks.find(t => t.id === taskId);\n\n if (!task) return false;\n\n task.status = status;\n if (progress !== undefined) {\n task.progress = progress;\n }\n task.updatedAt = Date.now();\n\n emitEvent(chat.id, {\n type: 'task_updated',\n timestamp: Date.now(),\n data: task,\n });\n\n observerStates.set(chat.id, state);\n return true;\n}\n\n/**\n * Clear observer state for a chat\n */\nexport function clearObserverState(chat: Chat): void {\n observerStates.delete(chat.id);\n observerCallbacks.delete(chat.id);\n}\n\n/**\n * Get full observer state (for debugging/export)\n */\nexport function getObserverState(chat: Chat): ObserverState {\n return { ...getState(chat.id) };\n}\n","import { join } from 'path';\nimport type { Chat, LearnedSkill, SkillStep } from '../types';\nimport type { LearningInput, LearningStep } from './types';\nimport { FileStorage, MemoryStorage, type Storage } from '../memory/storage';\nimport { DEFAULT_STORAGE_PATH } from '../config';\n\n/**\n * Learner - extracts SOPs from successful conversations\n */\nclass SkillLearner {\n private storage: Storage;\n private skills: Map<string, LearnedSkill> = new Map();\n private storageKey = 'learned_skills';\n\n constructor(storagePath?: string) {\n if (storagePath) {\n this.storage = new FileStorage(join(storagePath, 'acontext'));\n this.load();\n } else {\n this.storage = new MemoryStorage();\n }\n }\n\n /**\n * Load skills from storage\n */\n private load(): void {\n const data = this.storage.read<Record<string, LearnedSkill>>(this.storageKey);\n if (data) {\n this.skills = new Map(Object.entries(data));\n }\n }\n\n /**\n * Save skills to storage\n */\n private save(): void {\n const data: Record<string, LearnedSkill> = {};\n for (const [key, value] of this.skills) {\n data[key] = value;\n }\n this.storage.write(this.storageKey, data);\n }\n\n /**\n * Generate a unique skill ID\n */\n private generateId(): string {\n return `skill_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Extract category from task description\n */\n private extractCategory(description: string): string {\n const categoryPatterns: [RegExp, string][] = [\n [/여행|travel|trip/i, 'travel'],\n [/코드|code|programming|개발/i, 'coding'],\n [/글|write|작성|문서/i, 'writing'],\n [/분석|analyze|analysis/i, 'analysis'],\n [/검색|search|find|찾/i, 'search'],\n [/번역|translate/i, 'translation'],\n [/요약|summarize|summary/i, 'summarization'],\n ];\n\n for (const [pattern, category] of categoryPatterns) {\n if (pattern.test(description)) {\n return category;\n }\n }\n\n return 'general';\n }\n\n /**\n * Learn from a completed conversation\n */\n learn(input: LearningInput): LearnedSkill {\n const now = Date.now();\n const skillId = this.generateId();\n const category = this.extractCategory(input.taskDescription);\n\n // Convert learning steps to skill steps\n const steps: SkillStep[] = input.steps.map((step, index) => ({\n order: index + 1,\n action: this.summarizeAction(step),\n expectedInput: this.extractInputPattern(step.userInput),\n expectedOutput: this.extractOutputPattern(step.assistantOutput),\n }));\n\n const skill: LearnedSkill = {\n id: skillId,\n name: this.generateSkillName(input.taskDescription),\n description: input.taskDescription,\n category,\n steps,\n successRate: input.outcome === 'success' ? 1.0 : input.outcome === 'partial' ? 0.5 : 0.0,\n usageCount: 0,\n createdAt: now,\n updatedAt: now,\n };\n\n this.skills.set(skillId, skill);\n this.save();\n\n return skill;\n }\n\n /**\n * Summarize an action from a learning step\n */\n private summarizeAction(step: LearningStep): string {\n // Simple summarization - take first 100 chars of assistant output\n const summary = step.assistantOutput.substring(0, 100).trim();\n if (step.toolsUsed && step.toolsUsed.length > 0) {\n return `${summary} [Tools: ${step.toolsUsed.join(', ')}]`;\n }\n return summary;\n }\n\n /**\n * Extract input pattern from user input\n */\n private extractInputPattern(input: string): string {\n // Simple pattern extraction\n return input.substring(0, 50).trim();\n }\n\n /**\n * Extract output pattern from assistant output\n */\n private extractOutputPattern(output: string): string {\n // Simple pattern extraction\n return output.substring(0, 50).trim();\n }\n\n /**\n * Generate a skill name from task description\n */\n private generateSkillName(description: string): string {\n // Take first 30 chars and clean up\n const name = description.substring(0, 30).trim();\n return name.replace(/[^a-zA-Z0-9가-힣\\s]/g, '').trim() || 'Unnamed Skill';\n }\n\n /**\n * Get a skill by ID\n */\n getSkill(skillId: string): LearnedSkill | undefined {\n return this.skills.get(skillId);\n }\n\n /**\n * Get all skills\n */\n getAllSkills(): LearnedSkill[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * Search skills by category\n */\n getSkillsByCategory(category: string): LearnedSkill[] {\n return this.getAllSkills().filter(s => s.category === category);\n }\n\n /**\n * Search skills by keyword\n */\n searchSkills(keyword: string): LearnedSkill[] {\n const lowerKeyword = keyword.toLowerCase();\n return this.getAllSkills().filter(\n s =>\n s.name.toLowerCase().includes(lowerKeyword) ||\n s.description.toLowerCase().includes(lowerKeyword) ||\n s.category.toLowerCase().includes(lowerKeyword)\n );\n }\n\n /**\n * Update skill success rate\n */\n updateSuccessRate(skillId: string, success: boolean): void {\n const skill = this.skills.get(skillId);\n if (!skill) return;\n\n skill.usageCount += 1;\n // Weighted average\n skill.successRate =\n (skill.successRate * (skill.usageCount - 1) + (success ? 1 : 0)) / skill.usageCount;\n skill.updatedAt = Date.now();\n\n this.skills.set(skillId, skill);\n this.save();\n }\n\n /**\n * Delete a skill\n */\n deleteSkill(skillId: string): boolean {\n const deleted = this.skills.delete(skillId);\n if (deleted) {\n this.save();\n }\n return deleted;\n }\n\n /**\n * Clear all skills\n */\n clearSkills(): void {\n this.skills.clear();\n this.save();\n }\n}\n\n// Singleton instance\nlet learnerInstance: SkillLearner | null = null;\n\n/**\n * Initialize the learner\n */\nexport function initLearner(storagePath?: string): void {\n learnerInstance = new SkillLearner(storagePath ?? DEFAULT_STORAGE_PATH);\n}\n\n/**\n * Get learner instance\n */\nfunction getLearner(): SkillLearner {\n if (!learnerInstance) {\n learnerInstance = new SkillLearner();\n }\n return learnerInstance;\n}\n\n/**\n * Learn from a completed conversation\n */\nexport function learnFromConversation(\n chat: Chat,\n taskDescription: string,\n outcome: 'success' | 'failure' | 'partial' = 'success'\n): LearnedSkill {\n const steps: LearningStep[] = [];\n let currentUserInput = '';\n\n for (const msg of chat.messages) {\n if (msg.role === 'user') {\n currentUserInput = msg.content;\n } else if (msg.role === 'assistant' && currentUserInput) {\n steps.push({\n userInput: currentUserInput,\n assistantOutput: msg.content,\n toolsUsed: msg.toolCalls?.map(tc => tc.name),\n });\n currentUserInput = '';\n }\n }\n\n return getLearner().learn({\n taskDescription,\n conversationSummary: `Conversation with ${chat.messages.length} messages`,\n outcome,\n steps,\n });\n}\n\n/**\n * Get all learned skills\n */\nexport function getLearnedSkills(category?: string): LearnedSkill[] {\n if (category) {\n return getLearner().getSkillsByCategory(category);\n }\n return getLearner().getAllSkills();\n}\n\n/**\n * Search learned skills\n */\nexport function searchLearnedSkills(keyword: string): LearnedSkill[] {\n return getLearner().searchSkills(keyword);\n}\n\n/**\n * Get a specific skill\n */\nexport function getLearnedSkill(skillId: string): LearnedSkill | undefined {\n return getLearner().getSkill(skillId);\n}\n\n/**\n * Record skill usage result\n */\nexport function recordSkillUsage(skillId: string, success: boolean): void {\n getLearner().updateSuccessRate(skillId, success);\n}\n\n/**\n * Delete a learned skill\n */\nexport function deleteLearnedSkill(skillId: string): boolean {\n return getLearner().deleteSkill(skillId);\n}\n\n/**\n * Clear all learned skills\n */\nexport function clearLearnedSkills(): void {\n getLearner().clearSkills();\n}\n","import type { Chat, LearnedSkill } from '../types';\nimport type { SkillSearchOptions, SkillApplicationResult } from './types';\nimport { getLearnedSkills, recordSkillUsage } from './learner';\n\n/**\n * Search for relevant skills based on user input\n */\nexport function findRelevantSkills(\n query: string,\n options: SkillSearchOptions = {}\n): LearnedSkill[] {\n const { category, minSuccessRate = 0, limit = 10 } = options;\n\n let skills = getLearnedSkills(category);\n\n // Filter by success rate\n if (minSuccessRate > 0) {\n skills = skills.filter(s => s.successRate >= minSuccessRate);\n }\n\n // Score and rank skills by relevance\n const scoredSkills = skills.map(skill => ({\n skill,\n score: calculateRelevanceScore(query, skill),\n }));\n\n // Sort by score descending\n scoredSkills.sort((a, b) => b.score - a.score);\n\n // Return top skills\n return scoredSkills\n .filter(s => s.score > 0)\n .slice(0, limit)\n .map(s => s.skill);\n}\n\n/**\n * Calculate relevance score between query and skill\n */\nfunction calculateRelevanceScore(query: string, skill: LearnedSkill): number {\n const lowerQuery = query.toLowerCase();\n const words = lowerQuery.split(/\\s+/).filter(w => w.length > 1);\n\n let score = 0;\n\n // Check name match\n const lowerName = skill.name.toLowerCase();\n for (const word of words) {\n if (lowerName.includes(word)) {\n score += 3;\n }\n }\n\n // Check description match\n const lowerDesc = skill.description.toLowerCase();\n for (const word of words) {\n if (lowerDesc.includes(word)) {\n score += 2;\n }\n }\n\n // Check category match\n if (lowerQuery.includes(skill.category)) {\n score += 2;\n }\n\n // Boost by success rate\n score *= (0.5 + skill.successRate * 0.5);\n\n // Slight boost for more used skills\n score += Math.min(skill.usageCount * 0.1, 1);\n\n return score;\n}\n\n/**\n * Apply a skill to a chat by generating a suggested prompt\n */\nexport function applySkill(_chat: Chat, skill: LearnedSkill): SkillApplicationResult {\n if (!skill || !skill.steps || skill.steps.length === 0) {\n return {\n applied: false,\n skillId: skill?.id || 'unknown',\n error: 'Invalid skill or no steps available',\n };\n }\n\n try {\n // Generate a suggested prompt based on skill steps\n const suggestedPrompt = generateSkillPrompt(skill);\n\n return {\n applied: true,\n skillId: skill.id,\n suggestedPrompt,\n };\n } catch (error) {\n return {\n applied: false,\n skillId: skill.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Generate a prompt from skill steps\n */\nfunction generateSkillPrompt(skill: LearnedSkill): string {\n const lines: string[] = [\n `[Skill: ${skill.name}]`,\n '',\n 'Follow these steps:',\n ];\n\n for (const step of skill.steps) {\n lines.push(`${step.order}. ${step.action}`);\n if (step.expectedInput) {\n lines.push(` Input pattern: ${step.expectedInput}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Apply a skill and inject it into system prompt\n */\nexport function applySkillToSystemPrompt(\n chat: Chat,\n skill: LearnedSkill,\n baseSystemPrompt: string\n): string {\n const result = applySkill(chat, skill);\n\n if (!result.applied || !result.suggestedPrompt) {\n return baseSystemPrompt;\n }\n\n return `${baseSystemPrompt}\n\n---\n${result.suggestedPrompt}\n---`;\n}\n\n/**\n * Get best matching skill for a query\n */\nexport function getBestSkill(\n query: string,\n options: SkillSearchOptions = {}\n): LearnedSkill | undefined {\n const skills = findRelevantSkills(query, { ...options, limit: 1 });\n return skills[0];\n}\n\n/**\n * Suggest skills based on conversation context\n */\nexport function suggestSkills(chat: Chat, limit: number = 3): LearnedSkill[] {\n // Build context from recent messages\n const recentMessages = chat.messages.slice(-5);\n const context = recentMessages\n .map(m => m.content)\n .join(' ');\n\n return findRelevantSkills(context, { limit, minSuccessRate: 0.3 });\n}\n\n/**\n * Record that a skill was used and whether it was successful\n */\nexport function recordSkillApplication(\n skillId: string,\n success: boolean\n): void {\n recordSkillUsage(skillId, success);\n}\n\n/**\n * Get skill application history for a chat\n */\nconst skillApplicationHistory = new Map<string, Array<{\n skillId: string;\n appliedAt: number;\n success?: boolean;\n}>>();\n\n/**\n * Track skill application\n */\nexport function trackSkillApplication(\n chatId: string,\n skillId: string\n): void {\n const history = skillApplicationHistory.get(chatId) || [];\n history.push({\n skillId,\n appliedAt: Date.now(),\n });\n skillApplicationHistory.set(chatId, history);\n}\n\n/**\n * Update skill application success\n */\nexport function updateSkillApplicationSuccess(\n chatId: string,\n skillId: string,\n success: boolean\n): void {\n const history = skillApplicationHistory.get(chatId) || [];\n\n // Find last matching application\n let application: { skillId: string; appliedAt: number; success?: boolean } | undefined;\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].skillId === skillId) {\n application = history[i];\n break;\n }\n }\n\n if (application) {\n application.success = success;\n recordSkillApplication(skillId, success);\n }\n}\n\n/**\n * Get skill application history for a chat\n */\nexport function getSkillApplicationHistory(\n chatId: string\n): Array<{ skillId: string; appliedAt: number; success?: boolean }> {\n return [...(skillApplicationHistory.get(chatId) || [])];\n}\n\n/**\n * Clear skill application history for a chat\n */\nexport function clearSkillApplicationHistory(chatId: string): void {\n skillApplicationHistory.delete(chatId);\n}\n"],"mappings":"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","names":["clearMessages","setSystemPrompt","setSystemPrompt","clearMessages","import_path","import_path","import_path","import_path"]}
package/dist/index.mjs CHANGED
@@ -2056,3 +2056,4 @@ export {
2056
2056
  validateProviderConfig,
2057
2057
  wrapProviderError
2058
2058
  };
2059
+ //# sourceMappingURL=index.mjs.map