binario 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 +1140 -0
- package/dist/cloudflare.cjs +437 -0
- package/dist/cloudflare.cjs.map +1 -0
- package/dist/cloudflare.d.cts +293 -0
- package/dist/cloudflare.d.ts +293 -0
- package/dist/cloudflare.js +421 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/index.cjs +2476 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1104 -0
- package/dist/index.d.ts +1104 -0
- package/dist/index.js +2427 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.cjs +957 -0
- package/dist/memory.cjs.map +1 -0
- package/dist/memory.d.cts +542 -0
- package/dist/memory.d.ts +542 -0
- package/dist/memory.js +931 -0
- package/dist/memory.js.map +1 -0
- package/dist/react.cjs +1836 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +555 -0
- package/dist/react.d.ts +555 -0
- package/dist/react.js +1825 -0
- package/dist/react.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/memory/utils.ts","../src/memory/stores/in-memory.ts","../src/memory/buffer.ts","../src/memory/summary.ts","../src/memory/summary-buffer.ts","../src/memory/vector.ts","../src/memory/stores/local-storage.ts","../src/memory/stores/cloudflare-kv.ts"],"names":["DEFAULT_SUMMARIZE_THRESHOLD","MESSAGES_PREFIX","METADATA_PREFIX"],"mappings":"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","file":"memory.cjs","sourcesContent":["// Memory Utilities for Binario SDK\n\nimport type { Message } from '../types';\nimport type { StoredMessage, ConversationContext } from './types';\n\n/** \n * Estimate token count for text using character-based approximation.\n * Average English text: ~4 characters per token\n * Code/technical: ~3.5 characters per token\n * We use 4 as a conservative estimate.\n */\nexport function countTokens(text: string): number {\n if (!text) return 0;\n // More accurate estimation considering whitespace and punctuation\n const words = text.split(/\\s+/).filter(Boolean);\n const avgCharsPerWord = text.length / Math.max(words.length, 1);\n \n // Adjust ratio based on content type\n const ratio = avgCharsPerWord > 6 ? 3.5 : 4;\n return Math.ceil(text.length / ratio);\n}\n\n/** Count tokens for a single message */\nexport function countMessageTokens(message: Message): number {\n let tokens = 0;\n \n // Role token overhead (~4 tokens per message for formatting)\n tokens += 4;\n \n // Content tokens\n tokens += countTokens(message.content);\n \n // Name tokens if present\n if (message.name) {\n tokens += countTokens(message.name) + 1;\n }\n \n // Tool calls if present\n if (message.tool_calls) {\n for (const call of message.tool_calls) {\n tokens += countTokens(call.function.name);\n tokens += countTokens(call.function.arguments);\n tokens += 10; // Overhead for tool call structure\n }\n }\n \n return tokens;\n}\n\n/** Count total tokens for an array of messages */\nexport function countMessagesTokens(messages: Message[]): number {\n return messages.reduce((sum, msg) => sum + countMessageTokens(msg), 0);\n}\n\n/** Generate unique ID */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/** Create a stored message from a regular message */\nexport function createStoredMessage(\n message: Message,\n conversationId: string,\n options?: { embedding?: number[]; metadata?: Record<string, unknown> }\n): StoredMessage {\n return {\n id: generateId(),\n message,\n timestamp: Date.now(),\n conversationId,\n tokenCount: countMessageTokens(message),\n embedding: options?.embedding,\n metadata: options?.metadata,\n };\n}\n\n/** \n * Truncate messages to fit within token limit.\n * Removes oldest messages first (FIFO).\n */\nexport function truncateMessages(\n messages: Message[],\n maxTokens: number,\n options?: { keepSystemMessages?: boolean }\n): Message[] {\n const { keepSystemMessages = true } = options ?? {};\n \n // Separate system messages if we need to keep them\n const systemMessages = keepSystemMessages \n ? messages.filter(m => m.role === 'system')\n : [];\n const nonSystemMessages = keepSystemMessages\n ? messages.filter(m => m.role !== 'system')\n : [...messages];\n \n // Calculate tokens for system messages\n const systemTokens = countMessagesTokens(systemMessages);\n const remainingTokens = maxTokens - systemTokens;\n \n if (remainingTokens <= 0) {\n // If system messages alone exceed limit, truncate them too\n return truncateMessagesSimple(messages, maxTokens);\n }\n \n // Truncate non-system messages from the beginning\n const truncated = truncateMessagesSimple(nonSystemMessages, remainingTokens);\n \n return [...systemMessages, ...truncated];\n}\n\n/** Simple truncation without special handling */\nfunction truncateMessagesSimple(messages: Message[], maxTokens: number): Message[] {\n let totalTokens = 0;\n const result: Message[] = [];\n \n // Work backwards from most recent\n for (let i = messages.length - 1; i >= 0; i--) {\n const msgTokens = countMessageTokens(messages[i]);\n if (totalTokens + msgTokens > maxTokens) {\n break;\n }\n totalTokens += msgTokens;\n result.unshift(messages[i]);\n }\n \n return result;\n}\n\n/** Truncate messages by count */\nexport function truncateMessagesByCount(\n messages: Message[],\n maxMessages: number,\n options?: { keepSystemMessages?: boolean }\n): Message[] {\n const { keepSystemMessages = true } = options ?? {};\n \n if (messages.length <= maxMessages) {\n return messages;\n }\n \n if (keepSystemMessages) {\n const systemMessages = messages.filter(m => m.role === 'system');\n const nonSystemMessages = messages.filter(m => m.role !== 'system');\n \n const remainingSlots = maxMessages - systemMessages.length;\n if (remainingSlots <= 0) {\n return systemMessages.slice(-maxMessages);\n }\n \n return [...systemMessages, ...nonSystemMessages.slice(-remainingSlots)];\n }\n \n return messages.slice(-maxMessages);\n}\n\n/** Format messages for LLM context with conversation summary */\nexport function formatContextWithSummary(\n recentMessages: Message[],\n summary: string | null\n): Message[] {\n if (!summary) {\n return recentMessages;\n }\n \n // Insert summary as a system message at the beginning\n const summaryMessage: Message = {\n role: 'system',\n content: `Previous conversation summary:\\n${summary}`,\n };\n \n // Filter out existing system messages about summary\n const filtered = recentMessages.filter(\n m => !(m.role === 'system' && m.content.startsWith('Previous conversation summary:'))\n );\n \n // Find index after regular system messages\n const firstNonSystemIdx = filtered.findIndex(m => m.role !== 'system');\n const insertIdx = firstNonSystemIdx === -1 ? filtered.length : firstNonSystemIdx;\n \n return [\n ...filtered.slice(0, insertIdx),\n summaryMessage,\n ...filtered.slice(insertIdx),\n ];\n}\n\n/** Create conversation context object */\nexport function createContext(\n messages: Message[],\n summary?: string | null\n): ConversationContext {\n return {\n messages,\n summary: summary ?? undefined,\n tokenCount: countMessagesTokens(messages),\n messageCount: messages.length,\n };\n}\n\n/** Calculate cosine similarity between two vectors */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error('Vectors must have the same length');\n }\n \n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n \n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n \n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n if (magnitude === 0) return 0;\n \n return dotProduct / magnitude;\n}\n\n/** Default summarization prompt */\nexport const DEFAULT_SUMMARY_PROMPT = `Summarize the following conversation concisely, preserving key information, decisions, and context that would be useful for continuing the conversation. Focus on:\n- Main topics discussed\n- Key decisions or conclusions\n- Important user preferences or requirements\n- Any pending questions or tasks\n\nConversation:\n{conversation}\n\nSummary:`;\n\n/** Format conversation for summarization */\nexport function formatConversationForSummary(messages: Message[]): string {\n return messages\n .filter(m => m.role !== 'system')\n .map(m => `${m.role.toUpperCase()}: ${m.content}`)\n .join('\\n\\n');\n}\n","// In-Memory Store for Binario Memory System\n\nimport type { MemoryStore, StoredMessage } from '../types';\n\n/**\n * In-memory store for development and testing.\n * Data is lost when the process ends.\n */\nexport class InMemoryStore implements MemoryStore {\n private messages: Map<string, StoredMessage[]> = new Map();\n private metadata: Map<string, Record<string, unknown>> = new Map();\n\n async getMessages(conversationId: string): Promise<StoredMessage[]> {\n return this.messages.get(conversationId) ?? [];\n }\n\n async addMessage(message: StoredMessage): Promise<void> {\n const messages = this.messages.get(message.conversationId) ?? [];\n messages.push(message);\n this.messages.set(message.conversationId, messages);\n }\n\n async updateMessage(id: string, updates: Partial<StoredMessage>): Promise<void> {\n for (const [conversationId, messages] of this.messages) {\n const index = messages.findIndex(m => m.id === id);\n if (index !== -1) {\n messages[index] = { ...messages[index], ...updates };\n this.messages.set(conversationId, messages);\n return;\n }\n }\n }\n\n async deleteMessage(id: string): Promise<void> {\n for (const [conversationId, messages] of this.messages) {\n const filtered = messages.filter(m => m.id !== id);\n if (filtered.length !== messages.length) {\n this.messages.set(conversationId, filtered);\n return;\n }\n }\n }\n\n async clear(conversationId: string): Promise<void> {\n this.messages.delete(conversationId);\n this.metadata.delete(conversationId);\n }\n\n async getMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\n return this.metadata.get(conversationId) ?? null;\n }\n\n async setMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\n this.metadata.set(conversationId, metadata);\n }\n\n /** Clear all data (useful for testing) */\n clearAll(): void {\n this.messages.clear();\n this.metadata.clear();\n }\n\n /** Get all conversation IDs */\n getConversationIds(): string[] {\n return Array.from(this.messages.keys());\n }\n}\n\n/** Create a new in-memory store */\nexport function createInMemoryStore(): InMemoryStore {\n return new InMemoryStore();\n}\n","// Buffer Memory for Binario SDK\n// Simple sliding window memory that keeps the most recent messages\n\nimport type { Message } from '../types';\nimport type { \n Memory, \n MemoryStore, \n BufferMemoryOptions, \n ConversationContext,\n StoredMessage \n} from './types';\nimport { \n countMessagesTokens, \n truncateMessages, \n truncateMessagesByCount,\n createStoredMessage,\n createContext,\n generateId\n} from './utils';\nimport { InMemoryStore } from './stores/in-memory';\n\nconst DEFAULT_MAX_MESSAGES = 50;\nconst DEFAULT_MAX_TOKENS = 4000;\n\n/**\n * Buffer Memory - Sliding window of recent messages.\n * \n * Best for:\n * - Simple chat applications\n * - Short conversations\n * - When you don't need long-term context\n * \n * @example\n * ```ts\n * const memory = new BufferMemory({ maxMessages: 20 });\n * await memory.add({ role: 'user', content: 'Hello!' });\n * const messages = await memory.getMessages();\n * ```\n */\nexport class BufferMemory implements Memory {\n readonly type = 'buffer' as const;\n \n private store: MemoryStore;\n private conversationId: string;\n private maxMessages: number;\n private maxTokens: number;\n private includeSystemMessages: boolean;\n private strategy: 'fifo' | 'sliding';\n\n constructor(options: BufferMemoryOptions & { store?: MemoryStore } = {}) {\n this.store = options.store ?? new InMemoryStore();\n this.conversationId = options.conversationId ?? generateId();\n this.maxMessages = options.maxMessages ?? DEFAULT_MAX_MESSAGES;\n this.maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;\n this.includeSystemMessages = options.includeSystemMessages ?? true;\n this.strategy = options.strategy ?? 'sliding';\n }\n\n async add(message: Message): Promise<void> {\n const stored = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(stored);\n await this.trim();\n }\n\n async addMany(messages: Message[]): Promise<void> {\n for (const message of messages) {\n const stored = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(stored);\n }\n await this.trim();\n }\n\n async getMessages(): Promise<Message[]> {\n const stored = await this.store.getMessages(this.conversationId);\n return this.extractMessages(stored);\n }\n\n async getContext(): Promise<ConversationContext> {\n const messages = await this.getMessages();\n return createContext(messages);\n }\n\n async getContextWindow(maxTokens: number): Promise<ConversationContext> {\n const messages = await this.getMessages();\n const truncated = truncateMessages(messages, maxTokens, {\n keepSystemMessages: this.includeSystemMessages,\n });\n return createContext(truncated);\n }\n\n async clear(): Promise<void> {\n await this.store.clear(this.conversationId);\n }\n\n async getMessageCount(): Promise<number> {\n const stored = await this.store.getMessages(this.conversationId);\n return stored.length;\n }\n\n async getTokenCount(): Promise<number> {\n const messages = await this.getMessages();\n return countMessagesTokens(messages);\n }\n\n /** Get the conversation ID */\n getConversationId(): string {\n return this.conversationId;\n }\n\n /** Switch to a different conversation */\n setConversationId(id: string): void {\n this.conversationId = id;\n }\n\n private extractMessages(stored: StoredMessage[]): Message[] {\n return stored\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(s => s.message);\n }\n\n private async trim(): Promise<void> {\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n \n // First, trim by message count\n let trimmed = truncateMessagesByCount(messages, this.maxMessages, {\n keepSystemMessages: this.includeSystemMessages,\n });\n \n // Then, trim by token count\n trimmed = truncateMessages(trimmed, this.maxTokens, {\n keepSystemMessages: this.includeSystemMessages,\n });\n \n // If we trimmed, update the store\n if (trimmed.length < messages.length) {\n await this.store.clear(this.conversationId);\n for (const message of trimmed) {\n const storedMsg = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(storedMsg);\n }\n }\n }\n}\n\n/** Create a new buffer memory instance */\nexport function createBufferMemory(\n options: BufferMemoryOptions & { store?: MemoryStore } = {}\n): BufferMemory {\n return new BufferMemory(options);\n}\n","// Summary Memory for Binario SDK\n// Uses LLM to summarize conversation history\n\nimport type { Message } from '../types';\nimport type { \n Memory, \n MemoryStore, \n SummaryMemoryOptions, \n SummarizableMemory,\n ConversationContext,\n StoredMessage \n} from './types';\nimport { \n countMessagesTokens, \n createStoredMessage,\n createContext,\n generateId,\n formatConversationForSummary,\n DEFAULT_SUMMARY_PROMPT,\n truncateMessages\n} from './utils';\nimport { InMemoryStore } from './stores/in-memory';\n\nconst DEFAULT_SUMMARIZE_THRESHOLD = 2000; // tokens\nconst DEFAULT_SUMMARY_MODEL = 'google/gemini-2.5-flash';\n\n/** Summarizer function type */\nexport type SummarizerFn = (messages: Message[], prompt: string) => Promise<string>;\n\n/**\n * Summary Memory - Summarizes old conversation history.\n * \n * Best for:\n * - Long conversations\n * - When you need to preserve context but reduce tokens\n * - Cost optimization\n * \n * @example\n * ```ts\n * const memory = new SummaryMemory({\n * summarizer: async (messages, prompt) => {\n * const response = await binario.chat([\n * { role: 'system', content: prompt },\n * { role: 'user', content: formatConversation(messages) }\n * ]);\n * return response.content;\n * }\n * });\n * ```\n */\nexport class SummaryMemory implements Memory, SummarizableMemory {\n readonly type = 'summary' as const;\n \n private store: MemoryStore;\n private conversationId: string;\n private summarizeThreshold: number;\n private summaryModel: string;\n private summaryPrompt: string;\n private summarizer?: SummarizerFn;\n private includeSystemMessages: boolean;\n\n constructor(options: SummaryMemoryOptions & { \n store?: MemoryStore;\n summarizer?: SummarizerFn;\n } = {}) {\n this.store = options.store ?? new InMemoryStore();\n this.conversationId = options.conversationId ?? generateId();\n this.summarizeThreshold = options.summarizeThreshold ?? DEFAULT_SUMMARIZE_THRESHOLD;\n this.summaryModel = options.summaryModel ?? DEFAULT_SUMMARY_MODEL;\n this.summaryPrompt = options.summaryPrompt ?? DEFAULT_SUMMARY_PROMPT;\n this.summarizer = options.summarizer;\n this.includeSystemMessages = options.includeSystemMessages ?? true;\n }\n\n /** Set the summarizer function */\n setSummarizer(fn: SummarizerFn): void {\n this.summarizer = fn;\n }\n\n async add(message: Message): Promise<void> {\n const stored = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(stored);\n \n // Check if we need to summarize\n await this.checkAndSummarize();\n }\n\n async addMany(messages: Message[]): Promise<void> {\n for (const message of messages) {\n const stored = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(stored);\n }\n await this.checkAndSummarize();\n }\n\n async getMessages(): Promise<Message[]> {\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n const summary = await this.getSummary();\n \n if (summary) {\n // Prepend summary as system message\n const summaryMsg: Message = {\n role: 'system',\n content: `Previous conversation summary:\\n${summary}`,\n };\n \n // Filter out old system summary messages\n const filtered = messages.filter(\n m => !(m.role === 'system' && m.content.startsWith('Previous conversation summary:'))\n );\n \n return [summaryMsg, ...filtered];\n }\n \n return messages;\n }\n\n async getContext(): Promise<ConversationContext> {\n const messages = await this.getMessages();\n const summary = await this.getSummary();\n return createContext(messages, summary);\n }\n\n async getContextWindow(maxTokens: number): Promise<ConversationContext> {\n const messages = await this.getMessages();\n const summary = await this.getSummary();\n const truncated = truncateMessages(messages, maxTokens, {\n keepSystemMessages: this.includeSystemMessages,\n });\n return createContext(truncated, summary);\n }\n\n async clear(): Promise<void> {\n await this.store.clear(this.conversationId);\n }\n\n async getMessageCount(): Promise<number> {\n const stored = await this.store.getMessages(this.conversationId);\n return stored.length;\n }\n\n async getTokenCount(): Promise<number> {\n const messages = await this.getMessages();\n return countMessagesTokens(messages);\n }\n\n async getSummary(): Promise<string | null> {\n const metadata = await this.store.getMetadata(this.conversationId);\n return (metadata?.summary as string) ?? null;\n }\n\n async summarize(): Promise<string> {\n if (!this.summarizer) {\n throw new Error('No summarizer function provided. Set one with setSummarizer()');\n }\n\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n \n if (messages.length === 0) {\n return '';\n }\n\n const conversationText = formatConversationForSummary(messages);\n const prompt = this.summaryPrompt.replace('{conversation}', conversationText);\n \n const summary = await this.summarizer(messages, prompt);\n \n // Store the summary\n await this.store.setMetadata(this.conversationId, { summary });\n \n return summary;\n }\n\n /** Get the conversation ID */\n getConversationId(): string {\n return this.conversationId;\n }\n\n /** Switch to a different conversation */\n setConversationId(id: string): void {\n this.conversationId = id;\n }\n\n private extractMessages(stored: StoredMessage[]): Message[] {\n return stored\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(s => s.message);\n }\n\n private async checkAndSummarize(): Promise<void> {\n if (!this.summarizer) return;\n\n const tokenCount = await this.getTokenCount();\n \n if (tokenCount > this.summarizeThreshold) {\n // Get current messages\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n \n // Keep last few messages, summarize the rest\n const keepCount = Math.max(4, Math.floor(messages.length / 4));\n const toSummarize = messages.slice(0, -keepCount);\n const toKeep = messages.slice(-keepCount);\n \n if (toSummarize.length > 0) {\n // Get existing summary\n const existingSummary = await this.getSummary();\n \n // Create messages to summarize including existing summary\n const messagesForSummary = existingSummary \n ? [{ role: 'system' as const, content: `Previous summary: ${existingSummary}` }, ...toSummarize]\n : toSummarize;\n \n // Generate new summary\n const conversationText = formatConversationForSummary(messagesForSummary);\n const prompt = this.summaryPrompt.replace('{conversation}', conversationText);\n const summary = await this.summarizer(messagesForSummary, prompt);\n \n // Clear and re-add only kept messages\n await this.store.clear(this.conversationId);\n await this.store.setMetadata(this.conversationId, { summary });\n \n for (const message of toKeep) {\n const storedMsg = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(storedMsg);\n }\n }\n }\n }\n}\n\n/** Create a new summary memory instance */\nexport function createSummaryMemory(\n options: SummaryMemoryOptions & { \n store?: MemoryStore;\n summarizer?: SummarizerFn;\n } = {}\n): SummaryMemory {\n return new SummaryMemory(options);\n}\n","// Summary Buffer Memory for Binario SDK\n// Hybrid: keeps recent messages in buffer + summarizes older history\n\nimport type { Message } from '../types';\nimport type { \n Memory, \n MemoryStore, \n SummaryBufferMemoryOptions, \n SummarizableMemory,\n ConversationContext,\n StoredMessage \n} from './types';\nimport { \n countMessagesTokens, \n createStoredMessage,\n createContext,\n generateId,\n formatConversationForSummary,\n DEFAULT_SUMMARY_PROMPT,\n truncateMessages\n} from './utils';\nimport { InMemoryStore } from './stores/in-memory';\nimport type { SummarizerFn } from './summary';\n\nconst DEFAULT_BUFFER_SIZE = 10;\nconst DEFAULT_SUMMARIZE_THRESHOLD = 2000;\n\n/**\n * Summary Buffer Memory - Best of both worlds.\n * Keeps recent messages intact + summarizes older history.\n * \n * Best for:\n * - Production chat applications\n * - Long conversations where recent context matters\n * - Balancing token usage with context quality\n * \n * @example\n * ```ts\n * const memory = new SummaryBufferMemory({\n * bufferSize: 10, // Keep last 10 messages\n * summarizeThreshold: 2000, // Summarize when > 2000 tokens\n * summarizer: async (messages, prompt) => {\n * return await binario.chat([{ role: 'user', content: prompt }]).content;\n * }\n * });\n * ```\n */\nexport class SummaryBufferMemory implements Memory, SummarizableMemory {\n readonly type = 'summary-buffer' as const;\n \n private store: MemoryStore;\n private conversationId: string;\n private bufferSize: number;\n private summarizeThreshold: number;\n private summaryPrompt: string;\n private summarizer?: SummarizerFn;\n private includeSystemMessages: boolean;\n\n constructor(options: SummaryBufferMemoryOptions & { \n store?: MemoryStore;\n summarizer?: SummarizerFn;\n } = {}) {\n this.store = options.store ?? new InMemoryStore();\n this.conversationId = options.conversationId ?? generateId();\n this.bufferSize = options.bufferSize ?? DEFAULT_BUFFER_SIZE;\n this.summarizeThreshold = options.summarizeThreshold ?? DEFAULT_SUMMARIZE_THRESHOLD;\n this.summaryPrompt = options.summaryPrompt ?? DEFAULT_SUMMARY_PROMPT;\n this.summarizer = options.summarizer;\n this.includeSystemMessages = options.includeSystemMessages ?? true;\n }\n\n /** Set the summarizer function */\n setSummarizer(fn: SummarizerFn): void {\n this.summarizer = fn;\n }\n\n async add(message: Message): Promise<void> {\n const stored = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(stored);\n await this.checkAndSummarize();\n }\n\n async addMany(messages: Message[]): Promise<void> {\n for (const message of messages) {\n const stored = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(stored);\n }\n await this.checkAndSummarize();\n }\n\n async getMessages(): Promise<Message[]> {\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n const summary = await this.getSummary();\n \n // Get buffer (recent messages)\n const buffer = messages.slice(-this.bufferSize);\n \n if (summary) {\n const summaryMsg: Message = {\n role: 'system',\n content: `Previous conversation summary:\\n${summary}`,\n };\n \n // Get system messages\n const systemMessages = messages\n .slice(0, -this.bufferSize)\n .filter(m => m.role === 'system' && !m.content.startsWith('Previous conversation summary:'));\n \n return [...systemMessages, summaryMsg, ...buffer];\n }\n \n return messages;\n }\n\n async getContext(): Promise<ConversationContext> {\n const messages = await this.getMessages();\n const summary = await this.getSummary();\n return createContext(messages, summary);\n }\n\n async getContextWindow(maxTokens: number): Promise<ConversationContext> {\n const messages = await this.getMessages();\n const summary = await this.getSummary();\n const truncated = truncateMessages(messages, maxTokens, {\n keepSystemMessages: this.includeSystemMessages,\n });\n return createContext(truncated, summary);\n }\n\n async clear(): Promise<void> {\n await this.store.clear(this.conversationId);\n }\n\n async getMessageCount(): Promise<number> {\n const stored = await this.store.getMessages(this.conversationId);\n return stored.length;\n }\n\n async getTokenCount(): Promise<number> {\n const messages = await this.getMessages();\n return countMessagesTokens(messages);\n }\n\n async getSummary(): Promise<string | null> {\n const metadata = await this.store.getMetadata(this.conversationId);\n return (metadata?.summary as string) ?? null;\n }\n\n async summarize(): Promise<string> {\n if (!this.summarizer) {\n throw new Error('No summarizer function provided. Set one with setSummarizer()');\n }\n\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n \n // Messages outside the buffer\n const toSummarize = messages.slice(0, -this.bufferSize);\n \n if (toSummarize.length === 0) {\n return '';\n }\n\n const existingSummary = await this.getSummary();\n const messagesForSummary = existingSummary \n ? [{ role: 'system' as const, content: `Previous summary: ${existingSummary}` }, ...toSummarize]\n : toSummarize;\n\n const conversationText = formatConversationForSummary(messagesForSummary);\n const prompt = this.summaryPrompt.replace('{conversation}', conversationText);\n \n const summary = await this.summarizer(messagesForSummary, prompt);\n \n await this.store.setMetadata(this.conversationId, { summary });\n \n return summary;\n }\n\n /** Get buffer size */\n getBufferSize(): number {\n return this.bufferSize;\n }\n\n /** Get the conversation ID */\n getConversationId(): string {\n return this.conversationId;\n }\n\n /** Switch to a different conversation */\n setConversationId(id: string): void {\n this.conversationId = id;\n }\n\n private extractMessages(stored: StoredMessage[]): Message[] {\n return stored\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(s => s.message);\n }\n\n private async checkAndSummarize(): Promise<void> {\n if (!this.summarizer) return;\n\n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n \n // Only summarize if we have more messages than buffer size\n if (messages.length <= this.bufferSize) return;\n \n const tokenCount = await this.getTokenCount();\n \n if (tokenCount > this.summarizeThreshold) {\n // Get messages to keep in buffer\n const buffer = messages.slice(-this.bufferSize);\n const toSummarize = messages.slice(0, -this.bufferSize);\n \n if (toSummarize.length > 0) {\n const existingSummary = await this.getSummary();\n \n const messagesForSummary = existingSummary \n ? [{ role: 'system' as const, content: `Previous summary: ${existingSummary}` }, ...toSummarize]\n : toSummarize;\n \n const conversationText = formatConversationForSummary(messagesForSummary);\n const prompt = this.summaryPrompt.replace('{conversation}', conversationText);\n const summary = await this.summarizer(messagesForSummary, prompt);\n \n // Clear and re-add only buffer messages\n await this.store.clear(this.conversationId);\n await this.store.setMetadata(this.conversationId, { summary });\n \n for (const message of buffer) {\n const storedMsg = createStoredMessage(message, this.conversationId);\n await this.store.addMessage(storedMsg);\n }\n }\n }\n }\n}\n\n/** Create a new summary buffer memory instance */\nexport function createSummaryBufferMemory(\n options: SummaryBufferMemoryOptions & { \n store?: MemoryStore;\n summarizer?: SummarizerFn;\n } = {}\n): SummaryBufferMemory {\n return new SummaryBufferMemory(options);\n}\n","// Vector Memory for Binario SDK\n// Semantic search using embeddings\n\nimport type { Message } from '../types';\nimport type { \n Memory, \n MemoryStore, \n VectorMemoryOptions, \n SearchableMemory,\n ConversationContext,\n StoredMessage,\n SearchResult\n} from './types';\nimport type { EmbeddingsProvider } from '../embeddings/types';\nimport { \n countMessagesTokens, \n createStoredMessage,\n createContext,\n generateId,\n cosineSimilarity,\n truncateMessages\n} from './utils';\nimport { InMemoryStore } from './stores/in-memory';\n\nconst DEFAULT_TOP_K = 5;\nconst DEFAULT_MIN_SCORE = 0.5;\n\n/**\n * Vector Memory - Semantic search using embeddings.\n * Retrieves the most relevant messages based on similarity.\n * \n * Best for:\n * - Very long conversations\n * - Finding relevant context from history\n * - RAG-like applications\n * \n * @example\n * ```ts\n * const memory = new VectorMemory({\n * embeddings: new CloudflareEmbeddings({ binding: env.AI }),\n * topK: 5,\n * minScore: 0.7\n * });\n * \n * await memory.add({ role: 'user', content: 'I love pizza' });\n * const results = await memory.search('What food do I like?');\n * // Returns the pizza message with high similarity score\n * ```\n */\nexport class VectorMemory implements Memory, SearchableMemory {\n readonly type = 'vector' as const;\n \n private store: MemoryStore;\n private embeddings: EmbeddingsProvider;\n private conversationId: string;\n private topK: number;\n private minScore: number;\n private maxMessages?: number;\n private maxTokens?: number;\n private includeSystemMessages: boolean;\n\n constructor(options: VectorMemoryOptions & { \n store?: MemoryStore;\n embeddings: EmbeddingsProvider;\n }) {\n if (!options.embeddings) {\n throw new Error('VectorMemory requires an embeddings provider');\n }\n \n this.store = options.store ?? new InMemoryStore();\n this.embeddings = options.embeddings;\n this.conversationId = options.conversationId ?? generateId();\n this.topK = options.topK ?? DEFAULT_TOP_K;\n this.minScore = options.minScore ?? DEFAULT_MIN_SCORE;\n this.maxMessages = options.maxMessages;\n this.maxTokens = options.maxTokens;\n this.includeSystemMessages = options.includeSystemMessages ?? true;\n }\n\n async add(message: Message): Promise<void> {\n // Generate embedding for the message\n const { embedding } = await this.embeddings.embed(message.content);\n \n const stored = createStoredMessage(message, this.conversationId, {\n embedding,\n });\n \n await this.store.addMessage(stored);\n }\n\n async addMany(messages: Message[]): Promise<void> {\n if (messages.length === 0) return;\n \n // Batch embed all messages\n const texts = messages.map(m => m.content);\n const { embeddings } = await this.embeddings.embedMany(texts);\n \n for (let i = 0; i < messages.length; i++) {\n const stored = createStoredMessage(messages[i], this.conversationId, {\n embedding: embeddings[i].embedding,\n });\n await this.store.addMessage(stored);\n }\n }\n\n async getMessages(): Promise<Message[]> {\n const stored = await this.store.getMessages(this.conversationId);\n return this.extractMessages(stored);\n }\n\n async getContext(): Promise<ConversationContext> {\n const messages = await this.getMessages();\n return createContext(messages);\n }\n\n async getContextWindow(maxTokens: number): Promise<ConversationContext> {\n const messages = await this.getMessages();\n const truncated = truncateMessages(messages, maxTokens, {\n keepSystemMessages: this.includeSystemMessages,\n });\n return createContext(truncated);\n }\n\n async clear(): Promise<void> {\n await this.store.clear(this.conversationId);\n }\n\n async getMessageCount(): Promise<number> {\n const stored = await this.store.getMessages(this.conversationId);\n return stored.length;\n }\n\n async getTokenCount(): Promise<number> {\n const messages = await this.getMessages();\n return countMessagesTokens(messages);\n }\n\n async search(query: string, topK?: number): Promise<SearchResult[]> {\n const k = topK ?? this.topK;\n \n // Get query embedding\n const { embedding: queryEmbedding } = await this.embeddings.embed(query);\n \n // Get all stored messages\n const stored = await this.store.getMessages(this.conversationId);\n \n // Calculate similarity for each message\n const results: SearchResult[] = [];\n \n for (const msg of stored) {\n if (!msg.embedding) continue;\n \n const score = cosineSimilarity(queryEmbedding, msg.embedding);\n \n if (score >= this.minScore) {\n results.push({ message: msg, score });\n }\n }\n \n // Sort by score (highest first) and take top K\n return results\n .sort((a, b) => b.score - a.score)\n .slice(0, k);\n }\n\n /** \n * Get relevant context for a query.\n * Returns messages most semantically similar to the query.\n */\n async getRelevantContext(query: string, topK?: number): Promise<Message[]> {\n const results = await this.search(query, topK);\n \n // Sort by timestamp (oldest first) to maintain conversation order\n const sorted = results.sort((a, b) => a.message.timestamp - b.message.timestamp);\n \n return sorted.map(r => r.message.message);\n }\n\n /**\n * Build context with recent messages + relevant history.\n * Useful for including both recency and relevance.\n */\n async buildContext(\n query: string,\n options?: { recentCount?: number; relevantCount?: number }\n ): Promise<Message[]> {\n const { recentCount = 5, relevantCount = 3 } = options ?? {};\n \n const stored = await this.store.getMessages(this.conversationId);\n const messages = this.extractMessages(stored);\n \n // Get recent messages\n const recent = messages.slice(-recentCount);\n const recentIds = new Set(stored.slice(-recentCount).map(s => s.id));\n \n // Get relevant messages (excluding recent ones)\n const relevantResults = await this.search(query, relevantCount + recentCount);\n const relevant = relevantResults\n .filter(r => !recentIds.has(r.message.id))\n .slice(0, relevantCount)\n .sort((a, b) => a.message.timestamp - b.message.timestamp)\n .map(r => r.message.message);\n \n // Combine: relevant history + recent messages\n return [...relevant, ...recent];\n }\n\n /** Get the conversation ID */\n getConversationId(): string {\n return this.conversationId;\n }\n\n /** Switch to a different conversation */\n setConversationId(id: string): void {\n this.conversationId = id;\n }\n\n private extractMessages(stored: StoredMessage[]): Message[] {\n return stored\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(s => s.message);\n }\n}\n\n/** Create a new vector memory instance */\nexport function createVectorMemory(\n options: VectorMemoryOptions & { \n store?: MemoryStore;\n embeddings: EmbeddingsProvider;\n }\n): VectorMemory {\n return new VectorMemory(options);\n}\n","// LocalStorage Store for Binario Memory System\r\n\r\nimport type { MemoryStore, StoredMessage } from '../types';\r\n\r\nconst MESSAGES_PREFIX = 'binario:memory:messages:';\r\nconst METADATA_PREFIX = 'binario:memory:metadata:';\r\n\r\n/**\r\n * LocalStorage-based store for browser environments.\r\n * Data persists across page reloads.\r\n */\r\nexport class LocalStorageStore implements MemoryStore {\r\n private prefix: string;\r\n\r\n constructor(prefix: string = '') {\r\n this.prefix = prefix;\r\n }\r\n\r\n private getMessagesKey(conversationId: string): string {\r\n return `${MESSAGES_PREFIX}${this.prefix}${conversationId}`;\r\n }\r\n\r\n private getMetadataKey(conversationId: string): string {\r\n return `${METADATA_PREFIX}${this.prefix}${conversationId}`;\r\n }\r\n\r\n private getStorage(): Storage | null {\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n return window.localStorage;\r\n }\r\n return null;\r\n }\r\n\r\n async getMessages(conversationId: string): Promise<StoredMessage[]> {\r\n const storage = this.getStorage();\r\n if (!storage) return [];\r\n\r\n try {\r\n const data = storage.getItem(this.getMessagesKey(conversationId));\r\n return data ? JSON.parse(data) : [];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async addMessage(message: StoredMessage): Promise<void> {\r\n const storage = this.getStorage();\r\n if (!storage) return;\r\n\r\n const messages = await this.getMessages(message.conversationId);\r\n messages.push(message);\r\n \r\n try {\r\n storage.setItem(\r\n this.getMessagesKey(message.conversationId),\r\n JSON.stringify(messages)\r\n );\r\n } catch (e) {\r\n // Handle quota exceeded\r\n if (e instanceof Error && e.name === 'QuotaExceededError') {\r\n try {\r\n // Remove oldest messages and retry\r\n const trimmed = messages.slice(-Math.floor(messages.length / 2));\r\n storage.setItem(\r\n this.getMessagesKey(message.conversationId),\r\n JSON.stringify(trimmed)\r\n );\r\n } catch {\r\n // If retry also fails, silently ignore\r\n }\r\n }\r\n }\r\n }\r\n\r\n async updateMessage(id: string, updates: Partial<StoredMessage>): Promise<void> {\r\n const storage = this.getStorage();\r\n if (!storage) return;\r\n\r\n // We need to search all conversations since we don't know which one has this message\r\n const keys = Object.keys(storage).filter(k => k.startsWith(MESSAGES_PREFIX + this.prefix));\r\n \r\n for (const key of keys) {\r\n try {\r\n const data = storage.getItem(key);\r\n if (!data) continue;\r\n \r\n const messages: StoredMessage[] = JSON.parse(data);\r\n const index = messages.findIndex(m => m.id === id);\r\n \r\n if (index !== -1) {\r\n messages[index] = { ...messages[index], ...updates };\r\n storage.setItem(key, JSON.stringify(messages));\r\n return;\r\n }\r\n } catch {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n async deleteMessage(id: string): Promise<void> {\r\n const storage = this.getStorage();\r\n if (!storage) return;\r\n\r\n const keys = Object.keys(storage).filter(k => k.startsWith(MESSAGES_PREFIX + this.prefix));\r\n \r\n for (const key of keys) {\r\n try {\r\n const data = storage.getItem(key);\r\n if (!data) continue;\r\n \r\n const messages: StoredMessage[] = JSON.parse(data);\r\n const filtered = messages.filter(m => m.id !== id);\r\n \r\n if (filtered.length !== messages.length) {\r\n storage.setItem(key, JSON.stringify(filtered));\r\n return;\r\n }\r\n } catch {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n async clear(conversationId: string): Promise<void> {\r\n const storage = this.getStorage();\r\n if (!storage) return;\r\n\r\n storage.removeItem(this.getMessagesKey(conversationId));\r\n storage.removeItem(this.getMetadataKey(conversationId));\r\n }\r\n\r\n async getMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\r\n const storage = this.getStorage();\r\n if (!storage) return null;\r\n\r\n try {\r\n const data = storage.getItem(this.getMetadataKey(conversationId));\r\n return data ? JSON.parse(data) : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async setMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\r\n const storage = this.getStorage();\r\n if (!storage) return;\r\n\r\n storage.setItem(this.getMetadataKey(conversationId), JSON.stringify(metadata));\r\n }\r\n\r\n /** Clear all binario memory data */\r\n clearAll(): void {\r\n const storage = this.getStorage();\r\n if (!storage) return;\r\n\r\n const keysToRemove = Object.keys(storage).filter(\r\n k => k.startsWith(MESSAGES_PREFIX + this.prefix) || k.startsWith(METADATA_PREFIX + this.prefix)\r\n );\r\n \r\n keysToRemove.forEach(key => storage.removeItem(key));\r\n }\r\n\r\n /** Get all conversation IDs */\r\n getConversationIds(): string[] {\r\n const storage = this.getStorage();\r\n if (!storage) return [];\r\n\r\n const prefix = MESSAGES_PREFIX + this.prefix;\r\n return Object.keys(storage)\r\n .filter(k => k.startsWith(prefix))\r\n .map(k => k.slice(prefix.length));\r\n }\r\n}\r\n\r\n/** Create a new localStorage store */\r\nexport function createLocalStorageStore(prefix: string = ''): LocalStorageStore {\r\n return new LocalStorageStore(prefix);\r\n}\r\n","// Cloudflare KV Store for Binario Memory System\n\nimport type { MemoryStore, StoredMessage } from '../types';\n\n/** KV Namespace interface (Cloudflare Workers) */\ninterface KVNamespace {\n get(key: string, options?: { type?: 'text' | 'json' | 'arrayBuffer' | 'stream' }): Promise<unknown>;\n put(key: string, value: string, options?: { expirationTtl?: number; metadata?: unknown }): Promise<void>;\n delete(key: string): Promise<void>;\n list(options?: { prefix?: string; limit?: number; cursor?: string }): Promise<{\n keys: { name: string; expiration?: number; metadata?: unknown }[];\n list_complete: boolean;\n cursor?: string;\n }>;\n}\n\nconst MESSAGES_PREFIX = 'messages:';\nconst METADATA_PREFIX = 'metadata:';\n\n/**\n * Cloudflare KV-based store for Workers.\n * Provides persistent, globally distributed storage.\n */\nexport class CloudflareKVStore implements MemoryStore {\n private kv: KVNamespace;\n private ttl?: number;\n\n /**\n * @param kv - Cloudflare KV namespace binding\n * @param ttl - Optional TTL in seconds for automatic expiration\n */\n constructor(kv: KVNamespace, ttl?: number) {\n this.kv = kv;\n this.ttl = ttl;\n }\n\n private getMessagesKey(conversationId: string): string {\n return `${MESSAGES_PREFIX}${conversationId}`;\n }\n\n private getMetadataKey(conversationId: string): string {\n return `${METADATA_PREFIX}${conversationId}`;\n }\n\n async getMessages(conversationId: string): Promise<StoredMessage[]> {\n try {\n const data = await this.kv.get(this.getMessagesKey(conversationId), { type: 'json' });\n return (data as StoredMessage[]) ?? [];\n } catch {\n return [];\n }\n }\n\n async addMessage(message: StoredMessage): Promise<void> {\n const messages = await this.getMessages(message.conversationId);\n messages.push(message);\n \n await this.kv.put(\n this.getMessagesKey(message.conversationId),\n JSON.stringify(messages),\n this.ttl ? { expirationTtl: this.ttl } : undefined\n );\n }\n\n async updateMessage(id: string, updates: Partial<StoredMessage>): Promise<void> {\n // List all message keys to find the conversation\n const { keys } = await this.kv.list({ prefix: MESSAGES_PREFIX });\n \n for (const { name: key } of keys) {\n const conversationId = key.slice(MESSAGES_PREFIX.length);\n const messages = await this.getMessages(conversationId);\n const index = messages.findIndex(m => m.id === id);\n \n if (index !== -1) {\n messages[index] = { ...messages[index], ...updates };\n await this.kv.put(\n key,\n JSON.stringify(messages),\n this.ttl ? { expirationTtl: this.ttl } : undefined\n );\n return;\n }\n }\n }\n\n async deleteMessage(id: string): Promise<void> {\n const { keys } = await this.kv.list({ prefix: MESSAGES_PREFIX });\n \n for (const { name: key } of keys) {\n const conversationId = key.slice(MESSAGES_PREFIX.length);\n const messages = await this.getMessages(conversationId);\n const filtered = messages.filter(m => m.id !== id);\n \n if (filtered.length !== messages.length) {\n await this.kv.put(\n key,\n JSON.stringify(filtered),\n this.ttl ? { expirationTtl: this.ttl } : undefined\n );\n return;\n }\n }\n }\n\n async clear(conversationId: string): Promise<void> {\n await Promise.all([\n this.kv.delete(this.getMessagesKey(conversationId)),\n this.kv.delete(this.getMetadataKey(conversationId)),\n ]);\n }\n\n async getMetadata(conversationId: string): Promise<Record<string, unknown> | null> {\n try {\n const data = await this.kv.get(this.getMetadataKey(conversationId), { type: 'json' });\n return (data as Record<string, unknown>) ?? null;\n } catch {\n return null;\n }\n }\n\n async setMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\n await this.kv.put(\n this.getMetadataKey(conversationId),\n JSON.stringify(metadata),\n this.ttl ? { expirationTtl: this.ttl } : undefined\n );\n }\n\n /** Clear all binario memory data in this KV namespace */\n async clearAll(): Promise<void> {\n const { keys } = await this.kv.list();\n await Promise.all(keys.map(({ name }) => this.kv.delete(name)));\n }\n\n /** Get all conversation IDs */\n async getConversationIds(): Promise<string[]> {\n const { keys } = await this.kv.list({ prefix: MESSAGES_PREFIX });\n return keys.map(({ name }) => name.slice(MESSAGES_PREFIX.length));\n }\n}\n\n/** Create a new Cloudflare KV store */\nexport function createCloudflareKVStore(kv: KVNamespace, ttl?: number): CloudflareKVStore {\n return new CloudflareKVStore(kv, ttl);\n}\n"]}
|