@memstack/core 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/LICENSE +21 -0
- package/README.md +774 -0
- package/dist/index.cjs +1991 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +536 -0
- package/dist/index.d.ts +536 -0
- package/dist/index.js +1974 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
- package/src/adapters/embedding/cohere.ts +77 -0
- package/src/adapters/embedding/openai.ts +65 -0
- package/src/adapters/llm/anthropic.ts +69 -0
- package/src/adapters/llm/groq.ts +185 -0
- package/src/adapters/llm/ollama.ts +85 -0
- package/src/adapters/llm/openai.ts +178 -0
- package/src/adapters/storage/disk.ts +334 -0
- package/src/adapters/storage/memory.ts +147 -0
- package/src/adapters/storage/postgres.ts +310 -0
- package/src/adapters/storage/redis.ts +274 -0
- package/src/client.ts +236 -0
- package/src/errors.ts +47 -0
- package/src/index.ts +52 -0
- package/src/interfaces.ts +154 -0
- package/src/memory/ContextCompiler.ts +158 -0
- package/src/memory/MemoryStore.ts +266 -0
- package/src/memory/Pruner.ts +66 -0
- package/src/memory/Summarizer.ts +46 -0
- package/src/types.ts +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/memory/Summarizer.ts","../src/memory/Pruner.ts","../src/memory/ContextCompiler.ts","../src/memory/MemoryStore.ts","../src/adapters/storage/memory.ts","../src/client.ts","../src/adapters/storage/disk.ts","../src/adapters/storage/redis.ts","../src/adapters/storage/postgres.ts","../src/adapters/llm/openai.ts","../src/adapters/llm/anthropic.ts","../src/adapters/embedding/openai.ts","../src/adapters/embedding/cohere.ts","../src/adapters/llm/ollama.ts","../src/adapters/llm/groq.ts"],"names":["mkdir","join","readFile","writeFile","readdir"],"mappings":"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","file":"index.cjs","sourcesContent":["export type MemStackErrorCode =\n | \"STORAGE_ERROR\"\n | \"EMBEDDING_ERROR\"\n | \"LLM_ERROR\"\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"CONFIG_ERROR\";\n\nexport class MemStackError extends Error {\n code: MemStackErrorCode;\n retryable: boolean;\n details?: Record<string, unknown>;\n\n constructor(\n code: MemStackErrorCode,\n message: string,\n options: { retryable?: boolean; details?: Record<string, unknown> } = {}\n ) {\n super(message);\n this.name = \"MemStackError\";\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.details = options.details;\n }\n}\n\nexport function notFound(entity: string, id: string): MemStackError {\n return new MemStackError(\"NOT_FOUND\", `${entity} not found: ${id}`, {\n retryable: false,\n details: { entity, id },\n });\n}\n\nexport function validationError(message: string, details?: Record<string, unknown>): MemStackError {\n return new MemStackError(\"VALIDATION_ERROR\", message, { details });\n}\n\nexport function storageError(message: string, cause?: unknown): MemStackError {\n return new MemStackError(\"STORAGE_ERROR\", message, {\n retryable: true,\n details: { cause: cause instanceof Error ? cause.message : String(cause) },\n });\n}\n\nexport function configError(message: string): MemStackError {\n return new MemStackError(\"CONFIG_ERROR\", message, { retryable: false });\n}\n","import type { LLMProvider } from \"../interfaces.js\";\nimport type { Memory } from \"../types.js\";\nimport type { SummarizeOptions } from \"../interfaces.js\";\nimport { MemStackError } from \"../errors.js\";\n\nexport class Summarizer {\n private llm: LLMProvider;\n private defaultPrompt: string;\n\n constructor(llm: LLMProvider, defaultPrompt?: string) {\n this.llm = llm;\n this.defaultPrompt = defaultPrompt ??\n \"You are a memory summarizer. Condense the following list of memories into a single, concise summary paragraph that captures the key events, emotional tone, and important details. Write in third person past tense.\";\n }\n\n async summarize(\n memories: Memory[],\n options: SummarizeOptions = {},\n promptOverride?: string\n ): Promise<{ summaryContent: string; tokenCount: number }> {\n if (memories.length === 0) {\n throw new MemStackError(\"VALIDATION_ERROR\", \"No memories to summarize\");\n }\n\n const sorted = [...memories].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n const memoryTexts = sorted.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n try {\n const response = await this.llm.complete({ system, user });\n return {\n summaryContent: response.text.trim(),\n tokenCount: response.tokens.total,\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"LLM_ERROR\",\n `Summarization failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true, details: { cause: err instanceof Error ? err.message : String(err) } }\n );\n }\n }\n}\n","import type { Memory } from \"../types.js\";\nimport type { PruneStrategy } from \"../interfaces.js\";\n\nexport class Pruner {\n /** Returns memories to KEEP after applying the strategy. */\n execute(memories: Memory[], strategy: PruneStrategy): Memory[] {\n switch (strategy.type) {\n case \"byAge\":\n return this.keepByAge(memories, strategy);\n case \"byImportance\":\n return this.keepByImportance(memories, strategy);\n case \"byCount\":\n return this.keepByCount(memories, strategy);\n case \"byType\":\n return this.removeByType(memories, strategy);\n case \"custom\":\n return this.removeCustom(memories, strategy);\n default:\n return memories;\n }\n }\n\n dryRun(memories: Memory[], strategy: PruneStrategy): Memory[] {\n return this.execute(memories, strategy);\n }\n\n private keepByAge(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.maxAge) return memories;\n const cutoff = Date.now() - strategy.maxAge;\n return memories.filter((m) => m.createdAt.getTime() >= cutoff);\n }\n\n private keepByImportance(memories: Memory[], strategy: PruneStrategy): Memory[] {\n const threshold = strategy.minImportance ?? 0.5;\n return memories.filter((m) => m.importance >= threshold);\n }\n\n private keepByCount(memories: Memory[], strategy: PruneStrategy): Memory[] {\n const maxPerActor = strategy.maxPerActor ?? 100;\n const grouped = new Map<string, Memory[]>();\n for (const m of memories) {\n const list = grouped.get(m.actorId) || [];\n list.push(m);\n grouped.set(m.actorId, list);\n }\n\n const kept: Memory[] = [];\n for (const [, actorMemories] of grouped) {\n const sorted = [...actorMemories].sort((a, b) => b.importance - a.importance);\n kept.push(...sorted.slice(0, maxPerActor));\n }\n return kept;\n }\n\n /** Remove memories of specified types. Opposite of filtering — removes the matches. */\n private removeByType(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.memoryTypes || strategy.memoryTypes.length === 0) return memories;\n return memories.filter((m) => !strategy.memoryTypes!.includes(m.memoryType));\n }\n\n /** Remove memories matching the predicate. Predicate returns true = should be removed. */\n private removeCustom(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.shouldRemove) return memories;\n return memories.filter((m) => !strategy.shouldRemove!(m));\n }\n}\n","import type { Memory, CompiledContext } from \"../types.js\";\nimport type { ContextOptions } from \"../interfaces.js\";\n\nexport class ContextCompiler {\n /**\n * Estimate token count from text using a blended heuristic.\n * Combines word-based (prose) and character-based (code/json) estimates,\n * taking the max to handle arbitrary content types.\n */\n private estimateTokens(text: string): number {\n const charEst = Math.ceil(text.length / 4);\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n const wordEst = Math.ceil(words.length * 1.3);\n return Math.max(charEst, Math.max(1, wordEst));\n }\n\n /**\n * Truncate text to fit within a token budget, preserving whole words.\n * Appends \"...\" when content is cut. Falls back to character-based\n * truncation for text with few/no word boundaries.\n */\n private truncateToTokens(text: string, maxTokens: number): string {\n if (this.estimateTokens(text) <= maxTokens) return text;\n\n const words = text.split(/\\s+/);\n const targetWords = Math.max(1, Math.floor(maxTokens / 1.3));\n let currentTokens = 0;\n let i = 0;\n for (; i < words.length && i < targetWords; i++) {\n currentTokens += this.estimateTokens(words[i]);\n if (currentTokens > maxTokens) break;\n }\n if (i >= words.length) return text;\n if (i > 0) return words.slice(0, i).join(\" \") + \"...\";\n\n // Single long word (e.g., JSON): fall back to character-based cut\n const charLimit = maxTokens * 4;\n return text.slice(0, charLimit) + \"...\";\n }\n\n compile(memories: Memory[], options: ContextOptions): CompiledContext {\n const maxTokens = options.maxTokens ?? 2000;\n\n const relevant = memories.filter((m) => {\n if (options.memoryTypes && options.memoryTypes.length > 0) {\n return options.memoryTypes.includes(m.memoryType);\n }\n return true;\n });\n\n const sortedRecent = [...relevant].sort(\n (a, b) => b.createdAt.getTime() - a.createdAt.getTime()\n );\n\n const sortedImportant = this.deduplicate(\n [...relevant]\n .filter((m) => m.importance >= 0.5)\n .sort((a, b) => b.importance - a.importance)\n );\n\n const { recentMemories, importantMemories, systemPrompt } =\n this.assembleTokenBudgeted(sortedRecent, sortedImportant, maxTokens);\n\n const tokenEstimate = this.estimateTokens(systemPrompt);\n\n return { systemPrompt, recentMemories, importantMemories, tokenEstimate };\n }\n\n private assembleTokenBudgeted(\n recent: Memory[],\n important: Memory[],\n maxTokens: number\n ): { recentMemories: Memory[]; importantMemories: Memory[]; systemPrompt: string } {\n const includedImportant: Memory[] = [];\n const includedRecent: Memory[] = [];\n const seen = new Set<string>();\n let usedTokens = 0;\n\n // Add important memories first (signal over recency)\n for (const m of important) {\n if (seen.has(m.id)) continue;\n const prefix = `- `;\n const suffix = ` (${m.memoryType}, importance: ${m.importance.toFixed(2)})\\n`;\n const overhead = this.estimateTokens(prefix + suffix);\n let tokens = this.estimateTokens(m.content) + overhead;\n const remaining = Math.floor(maxTokens * 0.6) - usedTokens;\n if (remaining <= 0) break;\n if (tokens > remaining) {\n const contentBudget = Math.max(0, remaining - overhead);\n if (contentBudget > 0) {\n const truncatedContent = this.truncateToTokens(m.content, contentBudget);\n includedImportant.push({ ...m, content: truncatedContent });\n tokens = this.estimateTokens(truncatedContent) + overhead;\n usedTokens += tokens;\n seen.add(m.id);\n }\n } else {\n includedImportant.push(m);\n usedTokens += tokens;\n seen.add(m.id);\n }\n }\n\n // Add recent memories until budget is full\n for (const m of recent) {\n if (seen.has(m.id)) continue;\n const prefix = `- `;\n const suffix = `\\n`;\n const overhead = this.estimateTokens(prefix + suffix);\n let tokens = this.estimateTokens(m.content) + overhead;\n const remaining = maxTokens - usedTokens;\n if (remaining <= 0) break;\n if (tokens > remaining) {\n const contentBudget = Math.max(0, remaining - overhead);\n if (contentBudget > 0) {\n const truncatedContent = this.truncateToTokens(m.content, contentBudget);\n includedRecent.push({ ...m, content: truncatedContent });\n tokens = this.estimateTokens(truncatedContent) + overhead;\n usedTokens += tokens;\n seen.add(m.id);\n }\n } else {\n includedRecent.push(m);\n usedTokens += tokens;\n seen.add(m.id);\n }\n }\n\n const parts: string[] = [];\n if (includedImportant.length > 0) {\n parts.push(\"## Important Memories\");\n for (const m of includedImportant) {\n parts.push(`- ${m.content} (${m.memoryType}, importance: ${m.importance.toFixed(2)})`);\n }\n }\n if (includedRecent.length > 0) {\n parts.push(\"\\n## Recent Interactions\");\n for (const m of includedRecent) {\n parts.push(`- ${m.content}`);\n }\n }\n\n return { recentMemories: includedRecent, importantMemories: includedImportant, systemPrompt: parts.join(\"\\n\") };\n }\n\n private deduplicate(memories: Memory[]): Memory[] {\n const seen = new Set<string>();\n const result: Memory[] = [];\n for (const m of memories) {\n const key = m.content.toLowerCase().trim();\n if (!seen.has(key)) {\n seen.add(key);\n result.push(m);\n }\n }\n return result;\n }\n}\n","import type { Memory, CompiledContext } from \"../types.js\";\nimport type {\n StorageProvider,\n EmbeddingProvider,\n LLMProvider,\n MemoryStoreInput,\n MemoryRetrieveQuery,\n MemoryCountFilter,\n ContextOptions,\n SummarizeOptions,\n PruneStrategy,\n} from \"../interfaces.js\";\nimport { Summarizer } from \"./Summarizer.js\";\nimport { Pruner } from \"./Pruner.js\";\nimport { ContextCompiler } from \"./ContextCompiler.js\";\nimport { notFound, validationError } from \"../errors.js\";\n\nexport interface MemoryStoreConfig {\n storage: StorageProvider;\n embedding?: EmbeddingProvider;\n llm?: LLMProvider;\n embedOnStore?: boolean;\n summarizationPrompt?: string;\n}\n\nconst EMBEDDING_BATCH_SIZE = 2048;\n\nexport class MemoryStore {\n private storage: StorageProvider;\n private embedding?: EmbeddingProvider;\n private summarizer?: Summarizer;\n private pruner: Pruner;\n private compiler: ContextCompiler;\n private embedOnStore: boolean;\n\n constructor(config: MemoryStoreConfig) {\n this.storage = config.storage;\n this.embedding = config.embedding;\n this.embedOnStore = config.embedOnStore ?? true;\n if (config.llm) {\n this.summarizer = new Summarizer(config.llm, config.summarizationPrompt);\n }\n this.pruner = new Pruner();\n this.compiler = new ContextCompiler();\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n // On conflict \"append\": deduplicate by content hash, update existing instead\n if (input.onConflict === \"append\") {\n const hash = this._hashContent(input.actorId, input.content);\n const existing = await this.storage.retrieve({ actorId: input.actorId, limit: 1000 });\n const match = existing.find(\n (m) => this._hashContent(m.actorId, m.content) === hash\n );\n if (match) {\n // Upsert: update existing instead of creating duplicate\n const mergedTags = [...new Set([...(match.tags ?? []), ...(input.tags ?? [])])];\n const updated = await this.storage.store({\n id: match.id,\n actorId: match.actorId,\n content: match.content,\n memoryType: match.memoryType,\n importance: input.importance ?? match.importance,\n emotionalValence: input.emotionalValence ?? match.emotionalValence,\n tags: mergedTags,\n embedding: match.embedding,\n sourceId: input.sourceId ?? match.sourceId,\n metadata: { ...match.metadata, ...input.metadata },\n expiresAt: input.expiresAt ?? match.expiresAt,\n });\n return updated;\n }\n }\n\n let withEmbedding = input;\n if (this.embedding && this.embedOnStore) {\n const embeddings = await this.embedding.embed([input.content]);\n withEmbedding = { ...input, embedding: embeddings[0] };\n }\n const { onConflict: _, ...clean } = withEmbedding;\n return this.storage.store(clean);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n // Handle onConflict: \"append\" inputs individually (they need dedup checks)\n const appendInputs = inputs.filter((i) => i.onConflict === \"append\");\n const normalInputs = inputs.filter((i) => i.onConflict !== \"append\");\n\n const results: Memory[] = [];\n\n // Process append inputs one-by-one through store() for dedup\n for (const input of appendInputs) {\n results.push(await this.store(input));\n }\n\n if (normalInputs.length === 0) return results;\n\n if (this.embedding && this.embedOnStore) {\n for (let i = 0; i < normalInputs.length; i += EMBEDDING_BATCH_SIZE) {\n const batch = normalInputs.slice(i, i + EMBEDDING_BATCH_SIZE);\n const texts = batch.map((inp) => inp.content);\n const embeddings = await this.embedding!.embed(texts);\n const enriched = batch.map((input, j) => ({ ...input, embedding: embeddings[j] }));\n const stored = await this.storage.storeBatch(enriched);\n results.push(...stored);\n }\n } else {\n const stored = await this.storage.storeBatch(normalInputs);\n results.push(...stored);\n }\n\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n return this.storage.get(id);\n }\n\n async delete(id: string): Promise<void> {\n return this.storage.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n return this.storage.deleteMany(ids);\n }\n\n async touch(id: string): Promise<void> {\n const memory = await this.storage.get(id);\n if (!memory) throw notFound(\"Memory\", id);\n if (this.storage.touch) {\n return this.storage.touch(id);\n }\n // legacy fallback: storage doesn't support in-place touch\n await this.storage.delete(id);\n await this.storage.store({\n actorId: memory.actorId,\n content: memory.content,\n memoryType: memory.memoryType,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n embedding: memory.embedding,\n sourceId: memory.sourceId,\n metadata: memory.metadata,\n expiresAt: memory.expiresAt,\n });\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n return this.storage.count(filter);\n }\n\n async retrieve(query: MemoryRetrieveQuery): Promise<Memory[]> {\n let embedding: number[] | undefined;\n if (this.embedding && query.query && (query.strategy === \"semantic\" || query.strategy === \"hybrid\")) {\n const vecs = await this.embedding.embed([query.query]);\n embedding = vecs[0];\n }\n return this.storage.retrieve(query, embedding);\n }\n\n async compileContext(options: ContextOptions): Promise<CompiledContext> {\n const maxTokens = options.maxTokens ?? 2000;\n // Fetch up to 50 memories; compiler will truncate to meet token budget\n const memories = await this.storage.retrieve({ actorId: options.actorId, limit: 50 });\n return this.compiler.compile(memories, { ...options, maxTokens });\n }\n\n async summarize(\n options: SummarizeOptions,\n onError?: (err: Error) => void\n ): Promise<{ summary: Memory; deletedCount: number }> {\n if (!this.summarizer) {\n throw validationError(\"No LLM configured for summarization\");\n }\n\n const allMemories = await this.storage.retrieve({\n actorId: options.actorId,\n memoryTypes: options.memoryTypes ?? [\"interaction\"],\n limit: 1000,\n strategy: \"recent\",\n });\n\n let toSummarize = allMemories;\n if (options.olderThan) {\n toSummarize = toSummarize.filter((m) => m.createdAt < options.olderThan!);\n }\n if (options.skipMostRecent) {\n // Sort chronological (oldest first), skip most recent N, keep the rest\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, Math.max(0, sorted.length - options.skipMostRecent));\n }\n if (options.targetCount && toSummarize.length > options.targetCount) {\n // Keep only the oldest targetCount (most stale, best to summarize)\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, options.targetCount);\n }\n\n if (toSummarize.length === 0) {\n throw validationError(\"No memories to summarize\");\n }\n\n let summaryContent: string;\n try {\n const result = await this.summarizer.summarize(toSummarize, options);\n summaryContent = result.summaryContent;\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n\n const summary: Memory = await this.storage.store({\n actorId: options.actorId ?? toSummarize[0].actorId,\n content: summaryContent,\n memoryType: \"summary\",\n importance: Math.max(...toSummarize.map((m) => m.importance)),\n emotionalValence:\n toSummarize.reduce((sum, m) => sum + m.emotionalValence, 0) / toSummarize.length,\n tags: [\"summary\"],\n sourceId: toSummarize[0].id,\n });\n\n let deletedCount = 0;\n if (!options.keepOriginals) {\n const ids = toSummarize.map((m) => m.id);\n deletedCount = await this.storage.deleteMany(ids);\n }\n\n return { summary, deletedCount };\n }\n\n async prune(strategy: PruneStrategy): Promise<{ pruned: string[]; count: number }> {\n const allMemories = await this.storage.retrieve({ limit: 10000 });\n const kept = this.pruner.execute(allMemories, strategy);\n const keptIds = new Set(kept.map((k) => k.id));\n const prunedIds = allMemories.filter((m) => !keptIds.has(m.id)).map((m) => m.id);\n let count = 0;\n if (prunedIds.length > 0) {\n count = await this.storage.deleteMany(prunedIds);\n }\n return { pruned: prunedIds, count };\n }\n\n async dryRunPrune(strategy: PruneStrategy): Promise<{ wouldPrune: string[]; count: number }> {\n const allMemories = await this.storage.retrieve({ limit: 10000 });\n const kept = this.pruner.execute(allMemories, strategy);\n const keptIds = new Set(kept.map((k) => k.id));\n const wouldPrune = allMemories.filter((m) => !keptIds.has(m.id)).map((m) => m.id);\n return { wouldPrune, count: wouldPrune.length };\n }\n\n async export(): Promise<Memory[]> {\n return this.storage.retrieve({ limit: 100000 });\n }\n\n private _hashContent(actorId: string, content: string): string {\n const normalized = `${actorId}::${content.toLowerCase().trim()}`;\n // FNV-1a 64-bit — fast, low collision probability for content dedup\n let hash = 14695981039346656037n; // FNV offset basis\n for (let i = 0; i < normalized.length; i++) {\n hash ^= BigInt(normalized.charCodeAt(i));\n hash *= 1099511628211n; // FNV prime\n }\n return hash.toString(36);\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ninterface MemoryRecord extends Memory {\n _touchedAt: Date;\n}\n\nexport class InMemoryStorage implements StorageProvider {\n private memories: Map<string, MemoryRecord> = new Map();\n\n async initialize(): Promise<void> {}\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: now,\n _touchedAt: now,\n };\n this.memories.set(memory.id, memory);\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const memory = this.memories.get(id);\n if (!memory) return null;\n if (memory.expiresAt && memory.expiresAt <= new Date()) {\n this.memories.delete(id);\n return null;\n }\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n if (!this.memories.has(id)) throw notFound(\"Memory\", id);\n this.memories.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n for (const id of ids) {\n if (this.memories.has(id)) {\n this.memories.delete(id);\n count++;\n }\n }\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n let results = Array.from(this.memories.values());\n\n // Filter out expired\n const now = new Date();\n results = results.filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.actorId) {\n results = results.filter((m) => m.actorId === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((m) => m.content.toLowerCase().includes(q));\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => b._touchedAt.getTime() - a._touchedAt.getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort((a, b) => b.importance - a.importance || b._touchedAt.getTime() - a._touchedAt.getTime());\n break;\n }\n\n // Touch records on retrieval (for recency tracking in context assembly)\n for (const r of results.slice(0, query.limit ?? 10)) {\n r._touchedAt = new Date();\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const now = new Date();\n let results = Array.from(this.memories.values())\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (filter?.actorId) {\n results = results.filter((m) => m.actorId === filter.actorId);\n }\n if (filter?.memoryType) {\n results = results.filter((m) => m.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((m) => m.importance >= filter.minImportance!);\n }\n return results.length;\n }\n\n async touch(id: string): Promise<void> {\n const memory = this.memories.get(id);\n if (!memory) throw notFound(\"Memory\", id);\n memory._touchedAt = new Date();\n }\n\n async close(): Promise<void> {\n this.memories.clear();\n }\n\n getAllMemories(): Memory[] {\n return Array.from(this.memories.values());\n }\n}\n","import type { Memory, ProcessResult, MemStackSnapshot, HealthStatus } from \"./types.js\";\nimport type { MemStackConfig, ProcessInput, MemoryStoreInput, StorageProvider } from \"./interfaces.js\";\nimport { MemoryStore } from \"./memory/MemoryStore.js\";\nimport { InMemoryStorage } from \"./adapters/storage/memory.js\";\nimport { configError, validationError } from \"./errors.js\";\n\nexport class MemStack {\n readonly memory: MemoryStore;\n\n private config: MemStackConfig;\n private storage: StorageProvider;\n private processCount = 0;\n\n constructor(config: MemStackConfig) {\n if (!config.llm) {\n throw configError(\"LLM provider is required\");\n }\n\n this.config = config;\n this.storage = config.storage ?? new InMemoryStorage();\n\n this.memory = new MemoryStore({\n storage: this.storage,\n embedding: config.embedding,\n llm: config.llm,\n embedOnStore: config.defaults?.embedOnStore ?? true,\n summarizationPrompt: config.defaults?.summarizationPrompt,\n });\n }\n\n async process(input: ProcessInput): Promise<ProcessResult> {\n // Auto-enrichment: importance + tags via LLM when not provided\n let importance = input.importance;\n let tags = input.tags;\n\n const needImportance = importance === undefined && this.config.defaults?.autoImportance;\n const needTags = (!tags || tags.length === 0) && this.config.defaults?.autoTags;\n\n if (needImportance || needTags) {\n try {\n if (needImportance && needTags) {\n // Batch both into one LLM call\n const result = await this.config.llm.complete({\n system:\n \"Analyze the memory and respond with a JSON object: {\\\"importance\\\": <0.0-1.0>, \\\"tags\\\": [<array of 1-5 lowercase single-word tags>]}. Return ONLY the JSON, nothing else.\",\n user: input.content,\n maxTokens: 100,\n temperature: 0,\n });\n const parsed = this._parseEnrichmentJson(result.text);\n if (parsed.importance !== undefined) importance = parsed.importance;\n if (parsed.tags) tags = parsed.tags;\n } else if (needImportance) {\n const result = await this.config.llm.complete({\n system:\n \"Rate the importance of the following memory for an AI agent on a scale of 0.0 to 1.0, where 0.0 is trivial and 1.0 is critical. Return ONLY a single float number, nothing else.\",\n user: input.content,\n maxTokens: 10,\n temperature: 0,\n });\n const parsed = parseFloat(result.text.trim());\n importance = Number.isFinite(parsed) ? Math.max(0, Math.min(1, parsed)) : 0.5;\n } else if (needTags) {\n const result = await this.config.llm.complete({\n system:\n \"Extract 1-5 concise, lowercase, single-word tags from the following memory. Return ONLY a JSON array of strings, nothing else. Example: [\\\"combat\\\", \\\"goblin\\\", \\\"forest\\\"]\",\n user: input.content,\n maxTokens: 80,\n temperature: 0,\n });\n tags = this._parseTagsJson(result.text);\n }\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"auto-enrich\"\n );\n if (importance === undefined) importance = 0.5;\n if (!tags) tags = [];\n }\n }\n\n const memoryInput: MemoryStoreInput = {\n actorId: input.actorId,\n content: input.content,\n memoryType: input.memoryType ?? \"interaction\",\n importance: importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: tags ?? [],\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n onConflict: input.onConflict,\n };\n\n const memory = await this.memory.store(memoryInput);\n this.config.hooks?.onMemoryStored?.(memory);\n this.processCount++;\n\n // Auto-summarize if threshold is hit\n let summaryCreated: Memory | undefined;\n const threshold = this.config.defaults?.summarizationThreshold ?? 100;\n if (threshold > 0) {\n const count = await this.memory.count({ actorId: input.actorId, memoryType: \"interaction\" });\n if (count % threshold === 0 && count > 0) {\n try {\n const result = await this.memory.summarize(\n {\n actorId: input.actorId,\n memoryTypes: [\"interaction\"],\n skipMostRecent: 5,\n targetCount: Math.min(15, count),\n },\n this.config.hooks?.onError\n ? (err) => this.config.hooks!.onError!(err, \"summarize\")\n : undefined\n );\n summaryCreated = result.summary;\n this.config.hooks?.onSummaryCreated?.(result.summary, result.deletedCount);\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"summarize\"\n );\n }\n }\n }\n\n // Auto-prune if configured (throttled)\n const pruneStrategy = this.config.defaults?.pruneStrategy;\n const pruneInterval = this.config.defaults?.pruneInterval ?? 100;\n if (pruneStrategy && this.processCount % pruneInterval === 0) {\n try {\n const pruneResult = await this.memory.prune(pruneStrategy);\n if (pruneResult.count > 0) {\n this.config.hooks?.onMemoryPruned?.(pruneResult.pruned);\n }\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"prune\"\n );\n }\n }\n\n return { memory, summaryCreated };\n }\n\n async export(): Promise<MemStackSnapshot> {\n const memories = await this.memory.export();\n return {\n version: 1,\n memories,\n exportedAt: new Date().toISOString(),\n };\n }\n\n async import(snapshot: MemStackSnapshot): Promise<void> {\n if (snapshot.version !== 1) {\n throw validationError(`Unsupported snapshot version: ${snapshot.version}`);\n }\n await this.memory.storeBatch(snapshot.memories);\n }\n\n async health(): Promise<HealthStatus> {\n const status: HealthStatus = { storage: false, llm: false, embedding: false };\n\n try {\n await this.memory.count();\n status.storage = true;\n } catch { /* storage check failed */ }\n\n try {\n await this.config.llm.complete({ system: \"ok\", user: \"health\", maxTokens: 1 });\n status.llm = true;\n } catch { /* llm check failed */ }\n\n if (this.config.embedding) {\n try {\n await this.config.embedding.embed([\"health check\"]);\n status.embedding = true;\n } catch { /* embedding check failed */ }\n }\n\n return status;\n }\n\n async close(): Promise<void> {\n await this.storage.close();\n }\n\n private _parseEnrichmentJson(\n text: string\n ): { importance?: number; tags?: string[] } {\n try {\n const json = JSON.parse(this._extractJson(text)) as Record<string, unknown>;\n const result: { importance?: number; tags?: string[] } = {};\n if (typeof json.importance === \"number\" && Number.isFinite(json.importance)) {\n result.importance = Math.max(0, Math.min(1, json.importance));\n }\n if (\n Array.isArray(json.tags) &&\n json.tags.every((t: unknown) => typeof t === \"string\")\n ) {\n result.tags = (json.tags as string[]).map((t) => t.toLowerCase().trim()).slice(0, 5);\n }\n return result;\n } catch {\n return {};\n }\n }\n\n private _parseTagsJson(text: string): string[] {\n try {\n const parsed = JSON.parse(this._extractJson(text)) as unknown;\n if (Array.isArray(parsed) && parsed.every((t: unknown) => typeof t === \"string\")) {\n return (parsed as string[]).map((t) => t.toLowerCase().trim()).slice(0, 5);\n }\n } catch {\n // Fallback: try comma-separated\n }\n return text\n .split(\",\")\n .map((t) => t.replace(/[\\[\\]\"]/g, \"\").trim().toLowerCase())\n .filter((t) => t.length > 0)\n .slice(0, 5);\n }\n\n /** Strip markdown code fences and extract the JSON payload from LLM output. */\n private _extractJson(text: string): string {\n let cleaned = text.trim();\n // Remove ```json ... ``` or ``` ... ``` fences\n const fenceMatch = cleaned.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (fenceMatch) cleaned = fenceMatch[1].trim();\n return cleaned;\n }\n}\n","import { mkdir, readFile, writeFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\nexport interface DiskStorageConfig {\n /** Directory to store memory files. Default: \"./memstack-data\" */\n storageDir?: string;\n}\n\nexport class DiskStorage implements StorageProvider {\n private dir: string;\n private _writeLocks = new Map<string, Promise<void>>();\n\n constructor(config: DiskStorageConfig = {}) {\n this.dir = config.storageDir ?? \"./memstack-data\";\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: now,\n _touchedAt: now.toISOString(),\n };\n\n await this._withWriteLock(input.actorId, async () => {\n const records = await this._readFile(input.actorId);\n const existingIdx = records.findIndex((r) => r.id === memory.id);\n if (existingIdx !== -1) {\n records[existingIdx] = memory;\n } else {\n records.push(memory);\n }\n await this._writeFile(input.actorId, records);\n });\n\n return this._toExternal(memory);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const byActor = new Map<string, MemoryRecord[]>();\n const now = new Date();\n const all: MemoryRecord[] = [];\n\n for (const input of inputs) {\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: now,\n _touchedAt: now.toISOString(),\n };\n all.push(memory);\n const group = byActor.get(input.actorId) ?? [];\n group.push(memory);\n byActor.set(input.actorId, group);\n }\n\n for (const [actorId, group] of byActor) {\n await this._withWriteLock(actorId, async () => {\n const existing = await this._readFile(actorId);\n for (const mem of group) {\n const existingIdx = existing.findIndex((r) => r.id === mem.id);\n if (existingIdx !== -1) {\n existing[existingIdx] = mem;\n } else {\n existing.push(mem);\n }\n }\n await this._writeFile(actorId, existing);\n });\n }\n\n return all.map((m) => this._toExternal(m));\n }\n\n async get(id: string): Promise<Memory | null> {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._readFile(actorId);\n const record = records.find((r) => r.id === id);\n if (record) {\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n }\n return null;\n }\n\n async delete(id: string): Promise<void> {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._readFile(actorId);\n const index = records.findIndex((r) => r.id === id);\n if (index !== -1) {\n await this._withWriteLock(actorId, async () => {\n const fresh = await this._readFile(actorId);\n const i = fresh.findIndex((r) => r.id === id);\n if (i !== -1) {\n fresh.splice(i, 1);\n await this._writeFile(actorId, fresh);\n }\n });\n return;\n }\n }\n throw notFound(\"Memory\", id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const idSet = new Set(ids);\n let count = 0;\n const actorIds = await this._listActors();\n\n for (const actorId of actorIds) {\n await this._withWriteLock(actorId, async () => {\n const records = await this._readFile(actorId);\n const before = records.length;\n const filtered = records.filter((r) => !idSet.has(r.id));\n count += before - filtered.length;\n if (before !== filtered.length) {\n await this._writeFile(actorId, filtered);\n }\n });\n }\n\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n const actorIds = query.actorId ? [query.actorId] : await this._listActors();\n let results: MemoryRecord[] = [];\n\n for (const actorId of actorIds) {\n let records = await this._readFile(actorId);\n const now = new Date();\n records = records.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n records = records.filter((r) => query.memoryTypes!.includes(r.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n records = records.filter((r) => r.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n records = records.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n results.push(...records);\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) =>\n b.importance - a.importance || new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime()\n );\n break;\n }\n\n // Touch records on retrieval\n const nowStr = new Date().toISOString();\n const toTouch = results.slice(0, query.limit ?? 10);\n const touchedActors = new Set<string>();\n for (const r of toTouch) {\n r._touchedAt = nowStr;\n touchedActors.add(r.actorId);\n }\n // Persist touches back to disk\n for (const actorId of touchedActors) {\n await this._withWriteLock(actorId, async () => {\n const records = await this._readFile(actorId);\n let changed = false;\n for (const r of records) {\n const touched = toTouch.find((t) => t.id === r.id);\n if (touched) { r._touchedAt = nowStr; changed = true; }\n }\n if (changed) await this._writeFile(actorId, records);\n });\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit).map((r) => this._toExternal(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const actorIds = filter?.actorId ? [filter.actorId] : await this._listActors();\n let total = 0;\n const now = new Date();\n\n for (const actorId of actorIds) {\n let records = await this._readFile(actorId);\n records = records.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (filter?.memoryType) {\n records = records.filter((r) => r.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n records = records.filter((r) => r.importance >= filter.minImportance!);\n }\n total += records.length;\n }\n\n return total;\n }\n\n async touch(id: string): Promise<void> {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._readFile(actorId);\n const found = records.find((r) => r.id === id);\n if (found) {\n const nowStr = new Date().toISOString();\n await this._withWriteLock(actorId, async () => {\n const fresh = await this._readFile(actorId);\n const match = fresh.find((r) => r.id === id);\n if (match) {\n match._touchedAt = nowStr;\n await this._writeFile(actorId, fresh);\n }\n });\n return;\n }\n }\n throw notFound(\"Memory\", id);\n }\n\n async close(): Promise<void> {\n this._writeLocks.clear();\n }\n\n // ── Internal ──\n\n private _filePath(actorId: string): string {\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return join(this.dir, `${safe}.json`);\n }\n\n private async _readFile(actorId: string): Promise<MemoryRecord[]> {\n try {\n const raw = await readFile(this._filePath(actorId), \"utf-8\");\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as MemoryRecord[]) : [];\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to read memories for actor ${actorId}: ${(err as Error).message}`);\n }\n }\n\n private async _writeFile(actorId: string, records: MemoryRecord[]): Promise<void> {\n try {\n await writeFile(this._filePath(actorId), JSON.stringify(records, null, 2), \"utf-8\");\n } catch (err) {\n throw storageError(`Failed to write memories for actor ${actorId}: ${(err as Error).message}`);\n }\n }\n\n private async _withWriteLock(actorId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this._writeLocks.get(actorId) ?? Promise.resolve();\n let resolve!: () => void;\n const next = new Promise<void>((r) => { resolve = r; });\n this._writeLocks.set(actorId, next);\n await prev;\n try {\n await fn();\n } finally {\n resolve();\n // Clean up: only remove this entry if it hasn't been replaced by a newer lock\n if (this._writeLocks.get(actorId) === next) {\n this._writeLocks.delete(actorId);\n }\n }\n }\n\n private async _listActors(): Promise<string[]> {\n try {\n const entries = await readdir(this.dir);\n return entries.filter((e) => e.endsWith(\".json\")).map((e) => e.slice(0, -5));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to list actors: ${(err as Error).message}`);\n }\n }\n\n private _toExternal(record: MemoryRecord): Memory {\n const { _touchedAt: _, ...rest } = record;\n return {\n ...rest,\n createdAt: new Date(record.createdAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\n// Type-only import — user provides their own ioredis instance\ntype RedisClient = {\n set(key: string, value: string): Promise<unknown>;\n get(key: string): Promise<string | null>;\n mget(...keys: string[]): Promise<(string | null)[]>;\n del(key: string | string[]): Promise<number>;\n sadd(key: string, ...members: string[]): Promise<number>;\n srem(key: string, ...members: string[]): Promise<number>;\n smembers(key: string): Promise<string[]>;\n};\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\nexport interface RedisStorageConfig {\n /** An active ioredis client instance (or compatible) */\n redis: RedisClient;\n /** Key prefix. Default: \"memstack\" */\n keyPrefix?: string;\n}\n\nexport class RedisStorage implements StorageProvider {\n private redis: RedisClient;\n private prefix: string;\n\n constructor(config: RedisStorageConfig) {\n this.redis = config.redis;\n this.prefix = config.keyPrefix ?? \"memstack\";\n }\n\n async initialize(): Promise<void> {\n // Connection managed by the user's Redis client\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: now,\n _touchedAt: now.toISOString(),\n };\n\n await this.redis.set(this._memKey(memory.id), JSON.stringify(memory));\n await this.redis.sadd(this._actorKey(memory.actorId), memory.id);\n await this.redis.sadd(this._actorsSetKey(), memory.actorId);\n\n return this._toExternal(memory);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n let results: Memory[] = [];\n const now = new Date();\n\n for (const input of inputs) {\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: now,\n _touchedAt: now.toISOString(),\n };\n\n await this.redis.set(this._memKey(memory.id), JSON.stringify(memory));\n await this.redis.sadd(this._actorKey(memory.actorId), memory.id);\n await this.redis.sadd(this._actorsSetKey(), memory.actorId);\n results.push(this._toExternal(memory));\n }\n\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) return null;\n\n const record = JSON.parse(raw) as MemoryRecord;\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n\n async delete(id: string): Promise<void> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) throw notFound(\"Memory\", id);\n\n const record = JSON.parse(raw) as MemoryRecord;\n await this.redis.del(this._memKey(id));\n await this.redis.srem(this._actorKey(record.actorId), id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n const byActor = new Map<string, string[]>();\n\n for (const id of ids) {\n const raw = await this.redis.get(this._memKey(id));\n if (raw) {\n const record = JSON.parse(raw) as MemoryRecord;\n const list = byActor.get(record.actorId) ?? [];\n list.push(id);\n byActor.set(record.actorId, list);\n }\n }\n\n for (const [actorId, memIds] of byActor) {\n await this.redis.del(memIds.map((id) => this._memKey(id)));\n await this.redis.srem(this._actorKey(actorId), ...memIds);\n count += memIds.length;\n }\n\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n let allRecords: MemoryRecord[] = [];\n\n if (query.actorId) {\n allRecords = await this._getActorRecords(query.actorId);\n } else {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._getActorRecords(actorId);\n allRecords.push(...records);\n }\n }\n\n const now = new Date();\n let results = allRecords.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((r) => query.memoryTypes!.includes(r.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((r) => r.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) =>\n b.importance - a.importance || new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime()\n );\n break;\n }\n\n // Touch records on retrieval\n const nowStr = new Date().toISOString();\n const toTouch = results.slice(0, query.limit ?? 10);\n for (const r of toTouch) {\n r._touchedAt = nowStr;\n await this.redis.set(this._memKey(r.id), JSON.stringify(r));\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit).map((r) => this._toExternal(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n let allRecords: MemoryRecord[] = [];\n\n if (filter?.actorId) {\n allRecords = await this._getActorRecords(filter.actorId);\n } else {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._getActorRecords(actorId);\n allRecords.push(...records);\n }\n }\n\n const now = new Date();\n let results = allRecords.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (filter?.memoryType) {\n results = results.filter((r) => r.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((r) => r.importance >= filter.minImportance!);\n }\n\n return results.length;\n }\n\n async close(): Promise<void> {\n // User manages connection lifecycle\n }\n\n // ── Internal ──\n\n private _actorsSetKey(): string {\n return `${this.prefix}:actors`;\n }\n\n private _actorKey(actorId: string): string {\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return `${this.prefix}:a:${safe}`;\n }\n\n private _memKey(id: string): string {\n return `${this.prefix}:m:${id}`;\n }\n\n private async _getActorRecords(actorId: string): Promise<MemoryRecord[]> {\n const ids = await this.redis.smembers(this._actorKey(actorId));\n if (ids.length === 0) return [];\n\n const keys = ids.map((id) => this._memKey(id));\n const raws = await this.redis.mget(...keys);\n\n const records: MemoryRecord[] = [];\n for (const raw of raws) {\n if (raw) {\n try {\n records.push(JSON.parse(raw) as MemoryRecord);\n } catch {\n // Skip corrupted records\n }\n }\n }\n\n return records;\n }\n\n private async _listActors(): Promise<string[]> {\n return this.redis.smembers(this._actorsSetKey());\n }\n\n private _toExternal(record: MemoryRecord): Memory {\n const { _touchedAt: _, ...rest } = record;\n return {\n ...rest,\n createdAt: new Date(record.createdAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\n// User provides their own pg Pool instance\ntype PgPool = {\n query(text: string, params?: unknown[]): Promise<{ rows: unknown[] }>;\n};\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\ninterface PgMemoryRow {\n id: string;\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string[];\n embedding: number[] | null;\n source_id: string | null;\n metadata: Record<string, unknown>;\n expires_at: string | null;\n created_at: string;\n touched_at: string;\n}\n\nexport interface PostgresStorageConfig {\n /** An active pg Pool instance */\n pool: PgPool;\n /** Table name. Default: \"memstack_memories\" */\n tableName?: string;\n /** Automatically run CREATE TABLE IF NOT EXISTS on init. Default: true */\n autoMigrate?: boolean;\n}\n\nexport class PostgresStorage implements StorageProvider {\n private pool: PgPool;\n private table: string;\n private autoMigrate: boolean;\n\n constructor(config: PostgresStorageConfig) {\n this.pool = config.pool;\n this.table = config.tableName ?? \"memstack_memories\";\n if (!/^[a-zA-Z0-9_]+$/.test(this.table)) {\n throw new Error(`Invalid table name: \"${this.table}\". Use only alphanumeric characters and underscores.`);\n }\n this.autoMigrate = config.autoMigrate ?? true;\n }\n\n async initialize(): Promise<void> {\n if (!this.autoMigrate) return;\n await this.pool.query(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n id TEXT PRIMARY KEY,\n actor_id TEXT NOT NULL,\n memory_type TEXT NOT NULL DEFAULT 'interaction',\n content TEXT NOT NULL,\n importance REAL NOT NULL DEFAULT 0.5,\n emotional_valence REAL NOT NULL DEFAULT 0,\n tags JSONB NOT NULL DEFAULT '[]',\n embedding vector(3072),\n source_id TEXT,\n metadata JSONB NOT NULL DEFAULT '{}',\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n touched_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n )\n `);\n // Indexes\n try {\n await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_actor ON ${this.table} (actor_id)`);\n await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_type ON ${this.table} (memory_type)`);\n } catch {\n // Index creation may fail; non-critical\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n await this.pool.query(\n `INSERT INTO ${this.table} (id, actor_id, memory_type, content, importance, emotional_valence, tags, embedding, source_id, metadata, expires_at, created_at, touched_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8::float8[]::vector, $9, $10, $11, $12, $13)\n ON CONFLICT (id) DO UPDATE SET\n content = EXCLUDED.content,\n importance = EXCLUDED.importance,\n emotional_valence = EXCLUDED.emotional_valence,\n tags = EXCLUDED.tags,\n embedding = EXCLUDED.embedding,\n source_id = EXCLUDED.source_id,\n metadata = EXCLUDED.metadata,\n expires_at = EXCLUDED.expires_at,\n touched_at = EXCLUDED.touched_at`,\n [\n id,\n input.actorId,\n input.memoryType ?? \"interaction\",\n input.content,\n input.importance ?? 0.5,\n input.emotionalValence ?? 0,\n JSON.stringify(input.tags ?? []),\n input.embedding ? `{${input.embedding.join(\",\")}}` : null,\n input.sourceId ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.expiresAt?.toISOString() ?? null,\n now,\n now,\n ]\n );\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const { rows } = await this.pool.query(\n `SELECT * FROM ${this.table} WHERE id = $1 AND (expires_at IS NULL OR expires_at > NOW())`,\n [id]\n );\n if (rows.length === 0) return null;\n return this._rowToMemory(rows[0] as PgMemoryRow);\n }\n\n async delete(id: string): Promise<void> {\n const { rows } = await this.pool.query(`SELECT id FROM ${this.table} WHERE id = $1`, [id]);\n if (rows.length === 0) throw notFound(\"Memory\", id);\n await this.pool.query(`DELETE FROM ${this.table} WHERE id = $1`, [id]);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(\", \");\n const { rows } = await this.pool.query(\n `DELETE FROM ${this.table} WHERE id IN (${placeholders}) RETURNING id`,\n ids\n );\n return rows.length;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > NOW())\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (query.actorId) {\n conditions.push(`actor_id = $${paramIdx++}`);\n params.push(query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n conditions.push(`memory_type = ANY($${paramIdx++})`);\n params.push(query.memoryTypes);\n }\n if (query.tags && query.tags.length > 0) {\n conditions.push(`tags ?| $${paramIdx++}`);\n params.push(query.tags);\n }\n if (query.query) {\n conditions.push(`content ILIKE $${paramIdx++}`);\n params.push(`%${query.query}%`);\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n let orderBy: string;\n switch (query.strategy) {\n case \"recent\":\n orderBy = \"touched_at DESC\";\n break;\n case \"important\":\n orderBy = \"importance DESC\";\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n if (embedding && query.query) {\n // Semantic: order by vector distance\n return this._semanticRetrieve(embedding, query, params, where);\n }\n orderBy = \"importance DESC, touched_at DESC\";\n break;\n }\n\n const limit = query.limit ?? 10;\n const sql = `SELECT * FROM ${this.table} ${where} ORDER BY ${orderBy} LIMIT $${paramIdx}`;\n params.push(limit);\n\n const { rows } = await this.pool.query(sql, params);\n\n // Touch records\n for (const row of rows.slice(0, limit)) {\n const r = row as PgMemoryRow;\n await this.pool.query(\n `UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`,\n [r.id]\n );\n }\n\n return (rows as PgMemoryRow[]).map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > NOW())\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (filter?.actorId) {\n conditions.push(`actor_id = $${paramIdx++}`);\n params.push(filter.actorId);\n }\n if (filter?.memoryType) {\n conditions.push(`memory_type = $${paramIdx++}`);\n params.push(filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(`importance >= $${paramIdx++}`);\n params.push(filter.minImportance);\n }\n\n const where = conditions.join(\" AND \");\n const { rows } = await this.pool.query(\n `SELECT COUNT(*) as count FROM ${this.table} WHERE ${where}`,\n params\n );\n return Number((rows[0] as { count: string }).count);\n }\n\n async close(): Promise<void> {\n // User manages pool lifecycle\n }\n\n // ── Internal ──\n\n private async _semanticRetrieve(\n embedding: number[],\n query: MemoryRetrieveQuery,\n params: unknown[],\n baseWhere: string\n ): Promise<Memory[]> {\n const vecParam = `{${embedding.join(\",\")}}`;\n const limit = query.limit ?? 10;\n // baseWhere already includes \"WHERE\" keyword; strip the prefix\n const conditions = baseWhere.replace(/^WHERE\\s+/i, \"\");\n const whereClause = conditions\n ? `WHERE ${conditions} AND embedding IS NOT NULL`\n : `WHERE embedding IS NOT NULL`;\n const sql = `\n SELECT *,\n (embedding <-> $${params.length + 1}::float8[]::vector) AS distance\n FROM ${this.table}\n ${whereClause}\n ORDER BY distance ASC\n LIMIT $${params.length + 2}\n `;\n params.push(vecParam);\n params.push(limit);\n\n const { rows } = await this.pool.query(sql, params);\n\n for (const row of rows.slice(0, limit)) {\n const r = row as PgMemoryRow;\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [r.id]);\n }\n\n return (rows as PgMemoryRow[]).map((r) => this._rowToMemory(r));\n }\n\n private _rowToMemory(row: PgMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: Array.isArray(row.tags) ? row.tags : [],\n embedding: row.embedding ?? undefined,\n sourceId: row.source_id ?? undefined,\n metadata: row.metadata ?? {},\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OpenAILLMConfig {\n apiKey: string;\n baseURL?: string;\n defaultModel?: string;\n defaultTemperature?: number;\n defaultMaxTokens?: number;\n}\n\nexport class OpenAILLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: OpenAILLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.openai.com/v1\";\n this.defaultModel = config.defaultModel ?? \"gpt-4o-mini\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `OpenAI API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n text: data.choices[0]?.message?.content ?? \"\",\n tokens: {\n prompt: data.usage?.prompt_tokens ?? 0,\n completion: data.usage?.completion_tokens ?? 0,\n total: data.usage?.total_tokens ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `LLM request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n\n async *completeStream(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): AsyncIterable<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n let response: Response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n } catch (err) {\n throw new MemStackError(\"LLM_ERROR\", `OpenAI streaming request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `OpenAI streaming error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new MemStackError(\"LLM_ERROR\", \"No response body for streaming\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let promptTokens = 0;\n let completionTokens = 0;\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 || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data) as {\n choices?: { delta?: { content?: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n const content = parsed.choices?.[0]?.delta?.content ?? \"\";\n if (parsed.usage) {\n promptTokens = parsed.usage.prompt_tokens;\n completionTokens = parsed.usage.completion_tokens;\n }\n\n if (content) {\n yield {\n text: content,\n tokens: { prompt: promptTokens, completion: completionTokens, total: promptTokens + completionTokens },\n };\n }\n } catch {\n // Skip unparseable chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface AnthropicLLMConfig {\n apiKey: string;\n baseURL?: string;\n defaultModel?: string;\n defaultMaxTokens?: number;\n}\n\nexport class AnthropicLLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultMaxTokens: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private sdk: any;\n\n constructor(config: AnthropicLLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.anthropic.com\";\n this.defaultModel = config.defaultModel ?? \"claude-sonnet-4-5-20250929\";\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n if (!this.sdk) {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.sdk = new Anthropic({ apiKey: this.apiKey, baseURL: this.baseURL });\n }\n\n const response = await this.sdk.messages.create({\n model,\n system: request.system,\n messages: [{ role: \"user\", content: request.user }],\n max_tokens: maxTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n const text = response.content.length > 0 && \"text\" in response.content[0]\n ? (response.content[0] as { text: string }).text\n : \"\";\n\n return {\n text,\n tokens: {\n prompt: response.usage?.input_tokens ?? 0,\n completion: response.usage?.output_tokens ?? 0,\n total: (response.usage?.input_tokens ?? 0) + (response.usage?.output_tokens ?? 0),\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Anthropic request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n}\n","import type { EmbeddingProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OpenAIEmbeddingConfig {\n apiKey: string;\n baseURL?: string;\n model?: string;\n}\n\nexport class OpenAIEmbeddingAdapter implements EmbeddingProvider {\n private apiKey: string;\n private baseURL: string;\n private model: string;\n readonly dimensions: number;\n\n constructor(config: OpenAIEmbeddingConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.openai.com/v1\";\n this.model = config.model ?? \"text-embedding-3-small\";\n this.dimensions = this.model === \"text-embedding-3-large\" ? 3072 : 1536;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n if (texts.length > 2048) {\n throw new MemStackError(\"VALIDATION_ERROR\", `Max 2048 texts per batch, got ${texts.length}`);\n }\n\n try {\n const response = await fetch(`${this.baseURL}/embeddings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"EMBEDDING_ERROR\", `OpenAI Embedding error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n data: { embedding: number[]; index: number }[];\n };\n\n return data.data\n .sort((a, b) => a.index - b.index)\n .map((item) => item.embedding);\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"EMBEDDING_ERROR\",\n `Embedding request failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true }\n );\n }\n }\n}\n","import type { EmbeddingProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface CohereEmbeddingConfig {\n /** Cohere API key */\n apiKey: string;\n /** Model name. Default: \"embed-english-v3.0\" (1024 dims) */\n model?: string;\n /** Base URL. Default: \"https://api.cohere.ai/v1\" */\n baseURL?: string;\n}\n\nconst DIMENSIONS: Record<string, number> = {\n \"embed-english-v3.0\": 1024,\n \"embed-multilingual-v3.0\": 1024,\n \"embed-english-light-v3.0\": 384,\n \"embed-multilingual-light-v3.0\": 384,\n \"embed-english-v2.0\": 4096,\n \"embed-multilingual-v2.0\": 768,\n};\n\nexport class CohereEmbeddingAdapter implements EmbeddingProvider {\n private apiKey: string;\n private baseURL: string;\n private model: string;\n readonly dimensions: number;\n\n constructor(config: CohereEmbeddingConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.cohere.ai/v1\";\n this.model = config.model ?? \"embed-english-v3.0\";\n this.dimensions = DIMENSIONS[this.model] ?? 1024;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n if (texts.length > 96) {\n throw new MemStackError(\"VALIDATION_ERROR\", `Cohere max 96 texts per batch, got ${texts.length}`);\n }\n\n try {\n const response = await fetch(`${this.baseURL}/embed`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n texts,\n input_type: \"search_document\",\n embedding_types: [\"float\"],\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"EMBEDDING_ERROR\", `Cohere Embedding error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n embeddings: { float?: number[][] };\n };\n\n return data.embeddings?.float ?? [];\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"EMBEDDING_ERROR\",\n `Cohere embedding request failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true }\n );\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OllamaLLMConfig {\n /** Ollama server URL. Default: \"http://localhost:11434\" */\n baseURL?: string;\n /** Default model name. Default: \"llama3.2\" */\n defaultModel?: string;\n /** Default temperature. Default: 0.7 */\n defaultTemperature?: number;\n /** Default max tokens. Default: 1024 */\n defaultMaxTokens?: number;\n}\n\nexport class OllamaLLMAdapter implements LLMProvider {\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: OllamaLLMConfig = {}) {\n this.baseURL = config.baseURL ?? \"http://localhost:11434\";\n this.defaultModel = config.defaultModel ?? \"llama3.2\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n options: { temperature, num_predict: maxTokens },\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Ollama API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n message?: { content: string };\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n const promptTokens = data.prompt_eval_count ?? 0;\n const completionTokens = data.eval_count ?? 0;\n\n return {\n text: data.message?.content ?? \"\",\n tokens: {\n prompt: promptTokens,\n completion: completionTokens,\n total: promptTokens + completionTokens,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Ollama request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface GroqLLMConfig {\n /** Groq API key */\n apiKey: string;\n /** Base URL. Default: \"https://api.groq.com/openai/v1\" */\n baseURL?: string;\n /** Default model. Default: \"llama-3.3-70b-versatile\" */\n defaultModel?: string;\n /** Default temperature. Default: 0.7 */\n defaultTemperature?: number;\n /** Default max tokens. Default: 1024 */\n defaultMaxTokens?: number;\n}\n\nexport class GroqLLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: GroqLLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.groq.com/openai/v1\";\n this.defaultModel = config.defaultModel ?? \"llama-3.3-70b-versatile\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Groq API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n text: data.choices[0]?.message?.content ?? \"\",\n tokens: {\n prompt: data.usage?.prompt_tokens ?? 0,\n completion: data.usage?.completion_tokens ?? 0,\n total: data.usage?.total_tokens ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Groq request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n\n async *completeStream(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): AsyncIterable<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n let response: Response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n } catch (err) {\n throw new MemStackError(\"LLM_ERROR\", `Groq streaming request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Groq streaming error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new MemStackError(\"LLM_ERROR\", \"No response body for streaming\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let promptTokens = 0;\n let completionTokens = 0;\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 || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data) as {\n choices?: { delta?: { content?: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n x_groq?: { usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number } };\n };\n\n const content = parsed.choices?.[0]?.delta?.content ?? \"\";\n const usage = parsed.usage ?? parsed.x_groq?.usage;\n if (usage) {\n promptTokens = usage.prompt_tokens;\n completionTokens = usage.completion_tokens;\n }\n\n if (content) {\n yield {\n text: content,\n tokens: { prompt: promptTokens, completion: completionTokens, total: promptTokens + completionTokens },\n };\n }\n } catch {\n // Skip unparseable chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n"]}
|