wolbarg 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -6
- package/README.md +73 -11
- package/dist/index.cjs +2298 -523
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +598 -54
- package/dist/index.d.ts +598 -54
- package/dist/index.js +2283 -522
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/index.ts","../src/compression/index.ts","../src/chunking/index.ts","../src/utils/index.ts","../src/embedding/index.ts","../src/llm/index.ts","../src/ingest/index.ts","../src/filters/match.ts","../src/schema/index.ts","../src/sql/index.ts","../src/utils/vector.ts","../src/utils/vector-index.ts","../src/storage/providers/sqlite.ts","../src/storage/providers/postgres.ts","../src/storage/index.ts","../src/memory/index.ts","../src/retrieval/index.ts","../src/core/options.ts","../src/core/validate.ts","../src/core/wolbarg.ts","../src/filters/types.ts","../src/factories/index.ts","../src/keyword/index.ts","../src/rerank/index.ts","../src/ocr/index.ts","../src/vision/index.ts"],"names":["meta","path","fs","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error hierarchy for Wolbarg.\n * Raw SQLite / network errors are never exposed to consumers.\n */\n\n/** Base class for all Wolbarg errors. */\nexport class WolbargError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"WolbargError\";\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when SDK initialization fails. */\nexport class InitializationError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"INITIALIZATION_ERROR\", options);\n this.name = \"InitializationError\";\n }\n}\n\n/** Thrown when configuration values are missing or invalid. */\nexport class ConfigurationError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"CONFIGURATION_ERROR\", options);\n this.name = \"ConfigurationError\";\n }\n}\n\n/** Thrown when method arguments fail validation. */\nexport class ValidationError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"VALIDATION_ERROR\", options);\n this.name = \"ValidationError\";\n }\n}\n\n/** Thrown when a database operation fails. */\nexport class DatabaseError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"DATABASE_ERROR\", options);\n this.name = \"DatabaseError\";\n }\n}\n\n/** Thrown when an embedding request fails. */\nexport class EmbeddingError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"EMBEDDING_ERROR\", options);\n this.name = \"EmbeddingError\";\n }\n}\n\n/** Thrown when compression (LLM summarization) fails. */\nexport class CompressionError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"COMPRESSION_ERROR\", options);\n this.name = \"CompressionError\";\n }\n}\n\n/** Thrown when a requested memory does not exist. */\nexport class MemoryNotFoundError extends WolbargError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"MEMORY_NOT_FOUND\", options);\n this.name = \"MemoryNotFoundError\";\n }\n}\n\n/**\n * Thrown when a method requires an optional provider that was not configured.\n * Prefer TypeScript narrowing (e.g. compress without llm) when possible.\n */\nexport class ProviderNotConfiguredError extends ConfigurationError {\n readonly provider: string;\n\n constructor(provider: string, method: string, hint: string) {\n super(\n `${method} requires ${provider} — ${hint}`,\n );\n this.name = \"ProviderNotConfiguredError\";\n this.provider = provider;\n }\n}\n","/**\n * Memory compression — provider-based summarization.\n */\n\nimport type { LlmProvider } from \"../llm/index.js\";\nimport type { MemoryRecord } from \"../types/index.js\";\nimport { CompressionError } from \"../errors/index.js\";\n\nconst SYSTEM_PROMPT = `You are a memory compression engine for multi-agent systems.\nGiven related memories from a single agent, produce ONE concise summary that preserves:\n- Key facts and decisions\n- Important entities, numbers, and identifiers\n- Actionable conclusions\n\nRules:\n- Output plain text only (no markdown headings, no bullet lists unless essential)\n- Do not invent facts that are not present\n- Prefer precision over verbosity\n- Keep the summary self-contained`;\n\n/** Contract for memory compression backends. */\nexport interface CompressionProvider {\n readonly name: string;\n compress(memories: MemoryRecord[]): Promise<string>;\n}\n\n/** Default compression provider wrapping an {@link LlmProvider}. */\nexport class LlmCompressionProvider implements CompressionProvider {\n readonly name = \"llm\";\n private readonly llm: LlmProvider;\n\n constructor(llm: LlmProvider) {\n this.llm = llm;\n }\n\n async compress(memories: MemoryRecord[]): Promise<string> {\n return compressMemories(this.llm, memories);\n }\n}\n\nexport async function compressMemories(\n llm: LlmProvider,\n memories: MemoryRecord[],\n): Promise<string> {\n if (memories.length === 0) {\n throw new CompressionError(\"No memories available to compress\");\n }\n\n const payload = memories\n .map((memory, index) => {\n const meta =\n Object.keys(memory.metadata).length > 0\n ? `\\nMetadata: ${JSON.stringify(memory.metadata)}`\n : \"\";\n return `[${index + 1}] (id=${memory.id}, created=${memory.createdAt.toISOString()})${meta}\\n${memory.content.text}`;\n })\n .join(\"\\n\\n\");\n\n try {\n return await llm.complete([\n { role: \"system\", content: SYSTEM_PROMPT },\n {\n role: \"user\",\n content: `Compress the following ${memories.length} memories into a single concise summary:\\n\\n${payload}`,\n },\n ]);\n } catch (error) {\n if (error instanceof CompressionError) {\n throw error;\n }\n throw new CompressionError(\n `Compression failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n}\n\nexport function createCompressionProvider(\n llm: LlmProvider,\n): CompressionProvider {\n return new LlmCompressionProvider(llm);\n}\n","/**\n * Chunking strategies for document ingestion.\n */\n\nexport interface Chunk {\n text: string;\n index: number;\n}\n\nexport interface ChunkingOptions {\n chunkSize?: number;\n overlap?: number;\n}\n\nexport interface ChunkingStrategy {\n readonly name: string;\n chunk(text: string, options?: ChunkingOptions): Chunk[];\n}\n\nfunction clampOptions(options?: ChunkingOptions): {\n chunkSize: number;\n overlap: number;\n} {\n const chunkSize = Math.max(32, options?.chunkSize ?? 800);\n const overlap = Math.min(\n Math.max(0, options?.overlap ?? 100),\n Math.floor(chunkSize / 2),\n );\n return { chunkSize, overlap };\n}\n\nfunction windowChunks(\n pieces: string[],\n chunkSize: number,\n overlap: number,\n joiner: string,\n): Chunk[] {\n if (pieces.length === 0) {\n return [];\n }\n const chunks: Chunk[] = [];\n let buf = \"\";\n let index = 0;\n\n const flush = (): void => {\n const trimmed = buf.trim();\n if (trimmed) {\n chunks.push({ text: trimmed, index });\n index += 1;\n }\n };\n\n for (const piece of pieces) {\n const candidate = buf ? `${buf}${joiner}${piece}` : piece;\n if (candidate.length <= chunkSize) {\n buf = candidate;\n continue;\n }\n flush();\n if (piece.length > chunkSize) {\n // Hard-split oversized piece\n let start = 0;\n while (start < piece.length) {\n const end = Math.min(start + chunkSize, piece.length);\n chunks.push({ text: piece.slice(start, end).trim(), index });\n index += 1;\n start = Math.max(end - overlap, end);\n }\n buf = \"\";\n } else {\n buf = piece;\n }\n }\n flush();\n\n if (overlap > 0 && chunks.length > 1) {\n // Rebuild with overlap by sliding on joined text for stability\n const full = pieces.join(joiner);\n return slidingWindow(full, chunkSize, overlap);\n }\n return chunks;\n}\n\nfunction slidingWindow(\n text: string,\n chunkSize: number,\n overlap: number,\n): Chunk[] {\n const chunks: Chunk[] = [];\n let start = 0;\n let index = 0;\n while (start < text.length) {\n const end = Math.min(start + chunkSize, text.length);\n const slice = text.slice(start, end).trim();\n if (slice) {\n chunks.push({ text: slice, index });\n index += 1;\n }\n if (end >= text.length) {\n break;\n }\n start = Math.max(end - overlap, start + 1);\n }\n return chunks;\n}\n\nexport class FixedChunkingStrategy implements ChunkingStrategy {\n readonly name = \"fixed\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n return slidingWindow(text, chunkSize, overlap);\n }\n}\n\nexport class SentenceChunkingStrategy implements ChunkingStrategy {\n readonly name = \"sentence\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n const sentences = text\n .split(/(?<=[.!?])\\s+/)\n .map((s) => s.trim())\n .filter(Boolean);\n return windowChunks(sentences, chunkSize, overlap, \" \");\n }\n}\n\nexport class ParagraphChunkingStrategy implements ChunkingStrategy {\n readonly name = \"paragraph\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n const paragraphs = text\n .split(/\\n\\s*\\n/)\n .map((p) => p.trim())\n .filter(Boolean);\n return windowChunks(paragraphs, chunkSize, overlap, \"\\n\\n\");\n }\n}\n\nexport class MarkdownChunkingStrategy implements ChunkingStrategy {\n readonly name = \"markdown\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n const sections = text\n .split(/(?=^#{1,6}\\s)/m)\n .map((s) => s.trim())\n .filter(Boolean);\n if (sections.length <= 1) {\n return new ParagraphChunkingStrategy().chunk(text, options);\n }\n return windowChunks(sections, chunkSize, overlap, \"\\n\\n\");\n }\n}\n\nexport class HeadingChunkingStrategy implements ChunkingStrategy {\n readonly name = \"heading\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n return new MarkdownChunkingStrategy().chunk(text, options);\n }\n}\n\nexport function createChunkingStrategy(\n name: \"fixed\" | \"sentence\" | \"paragraph\" | \"markdown\" | \"heading\" = \"sentence\",\n): ChunkingStrategy {\n switch (name) {\n case \"fixed\":\n return new FixedChunkingStrategy();\n case \"paragraph\":\n return new ParagraphChunkingStrategy();\n case \"markdown\":\n return new MarkdownChunkingStrategy();\n case \"heading\":\n return new HeadingChunkingStrategy();\n case \"sentence\":\n default:\n return new SentenceChunkingStrategy();\n }\n}\n\nexport function inferChunkingStrategy(text: string): ChunkingStrategy {\n if (/^#{1,6}\\s/m.test(text)) {\n return new MarkdownChunkingStrategy();\n }\n return new SentenceChunkingStrategy();\n}\n","/**\r\n * Shared utility helpers.\r\n */\r\n\r\nimport { ValidationError } from \"../errors/index.js\";\r\n\r\n/** Generate a RFC 4122 version 4 UUID. */\r\nexport function createId(): string {\r\n return crypto.randomUUID();\r\n}\r\n\r\n/** Current UTC timestamp as an ISO-8601 string. */\r\nexport function nowIso(): string {\r\n return new Date().toISOString();\r\n}\r\n\r\n/** Parse an ISO-8601 string into a Date. */\r\nexport function parseIso(value: string): Date {\r\n return new Date(value);\r\n}\r\n\r\n/** Assert that a string is non-empty after trimming. */\r\nexport function assertNonEmptyString(\r\n value: unknown,\r\n fieldName: string,\r\n): asserts value is string {\r\n if (typeof value !== \"string\" || value.trim().length === 0) {\r\n throw new ValidationError(`${fieldName} must be a non-empty string`);\r\n }\r\n}\r\n\r\n/** Assert that a value is a finite number within an optional range. */\r\nexport function assertFiniteNumber(\r\n value: unknown,\r\n fieldName: string,\r\n options?: { min?: number; max?: number },\r\n): asserts value is number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n throw new ValidationError(`${fieldName} must be a finite number`);\r\n }\r\n if (options?.min !== undefined && value < options.min) {\r\n throw new ValidationError(`${fieldName} must be >= ${options.min}`);\r\n }\r\n if (options?.max !== undefined && value > options.max) {\r\n throw new ValidationError(`${fieldName} must be <= ${options.max}`);\r\n }\r\n}\r\n\r\nconst EMPTY_META_JSON = \"{}\";\r\n\r\n/** Safely serialize opaque metadata to JSON text. */\r\nexport function serializeMetadata(metadata: Record<string, unknown>): string {\r\n for (const _key in metadata) {\r\n return JSON.stringify(metadata);\r\n }\r\n return EMPTY_META_JSON;\r\n}\r\n\r\n/** Safely deserialize opaque metadata from JSON text. */\r\nexport function deserializeMetadata(raw: string): Record<string, unknown> {\r\n if (!raw || raw === EMPTY_META_JSON) {\r\n return {};\r\n }\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n return parsed as Record<string, unknown>;\r\n }\r\n return {};\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Convert a Float32Array embedding into a Buffer suitable for sqlite-vec.\r\n */\r\nexport function embeddingToBuffer(embedding: Float32Array): Buffer {\r\n return Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);\r\n}\r\n\r\n/**\r\n * Convert cosine distance (as returned by sqlite-vec) to cosine similarity.\r\n * sqlite-vec cosine distance ≈ `1 - cosine_similarity`, range roughly [0, 2].\r\n */\r\nexport function distanceToSimilarity(distance: number): number {\r\n return 1 - distance;\r\n}\r\n\r\n/**\r\n * Simple async mutex for serializing write-critical sections across\r\n * concurrent async callers in the same process.\r\n */\r\nexport class AsyncMutex {\r\n private chain: Promise<void> = Promise.resolve();\r\n\r\n async runExclusive<T>(fn: () => Promise<T> | T): Promise<T> {\r\n let release!: () => void;\r\n const next = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n const previous = this.chain;\r\n this.chain = previous.then(() => next);\r\n\r\n await previous;\r\n try {\r\n return await fn();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n\r\n/** Join a base URL with a path, avoiding duplicate slashes. */\r\nexport function joinUrl(baseUrl: string, path: string): string {\r\n const base = baseUrl.replace(/\\/+$/, \"\");\r\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${base}${suffix}`;\r\n}\r\n","/**\n * Embedding providers and named factories.\n */\n\nimport type { EmbeddingConfig } from \"../types/index.js\";\nimport { EmbeddingError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\n/** Contract for any embedding backend. */\nexport interface EmbeddingProvider {\n readonly model: string;\n /** Produce a float embedding for the given text. */\n embed(text: string): Promise<Float32Array>;\n /** Optional batch embedding. SDK falls back to parallel `embed` when absent. */\n embedBatch?(texts: string[]): Promise<Float32Array[]>;\n /** Lightweight connectivity + dimension probe. */\n validate(): Promise<{ dimensions: number }>;\n}\n\ninterface OpenAIEmbeddingResponse {\n data?: Array<{ embedding?: number[]; index?: number }>;\n error?: { message?: string };\n}\n\nexport class OpenAICompatibleEmbeddingProvider implements EmbeddingProvider {\n readonly model: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n\n constructor(config: EmbeddingConfig) {\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.model = config.model;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n }\n\n async embed(text: string): Promise<Float32Array> {\n const response = await this.request(text);\n const vector = response.data?.[0]?.embedding;\n if (!vector || vector.length === 0) {\n throw new EmbeddingError(\"Embedding response did not contain a vector\");\n }\n return Float32Array.from(vector);\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n if (texts.length === 0) {\n return [];\n }\n if (texts.length === 1) {\n return [await this.embed(texts[0]!)];\n }\n const response = await this.request(texts);\n const data = response.data ?? [];\n const sorted = [...data].sort(\n (a, b) => (a.index ?? 0) - (b.index ?? 0),\n );\n if (sorted.length !== texts.length) {\n // Fallback: embed sequentially\n const out: Float32Array[] = [];\n for (const text of texts) {\n out.push(await this.embed(text));\n }\n return out;\n }\n return sorted.map((item) => {\n if (!item.embedding || item.embedding.length === 0) {\n throw new EmbeddingError(\"Embedding batch response contained an empty vector\");\n }\n return Float32Array.from(item.embedding);\n });\n }\n\n async validate(): Promise<{ dimensions: number }> {\n try {\n const embedding = await this.embed(\"Wolbarg health check\");\n return { dimensions: embedding.length };\n } catch (error) {\n if (error instanceof EmbeddingError) {\n throw error;\n }\n throw new EmbeddingError(\n `Failed to validate embedding endpoint: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n private async request(\n input: string | string[],\n ): Promise<OpenAIEmbeddingResponse> {\n const url = joinUrl(this.baseUrl, \"/embeddings\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\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,\n }),\n signal: controller.signal,\n });\n\n let body: OpenAIEmbeddingResponse;\n try {\n body = (await res.json()) as OpenAIEmbeddingResponse;\n } catch {\n throw new EmbeddingError(\n `Embedding endpoint returned non-JSON response (HTTP ${res.status})`,\n );\n }\n\n if (!res.ok) {\n const message = body.error?.message ?? `HTTP ${res.status}`;\n throw new EmbeddingError(`Embedding request failed: ${message}`);\n }\n\n return body;\n } catch (error) {\n if (error instanceof EmbeddingError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new EmbeddingError(\n `Embedding request timed out after ${this.timeoutMs}ms`,\n );\n }\n throw new EmbeddingError(\n `Embedding request failed: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\nexport function createEmbeddingProvider(\n config: EmbeddingConfig,\n): EmbeddingProvider {\n return new OpenAICompatibleEmbeddingProvider(config);\n}\n\nfunction factory(\n defaults: Partial<EmbeddingConfig> & Pick<EmbeddingConfig, \"baseUrl\">,\n) {\n return (config: Omit<EmbeddingConfig, \"baseUrl\"> & { baseUrl?: string }): EmbeddingProvider =>\n createEmbeddingProvider({\n baseUrl: config.baseUrl ?? defaults.baseUrl,\n apiKey: config.apiKey,\n model: config.model,\n timeoutMs: config.timeoutMs,\n });\n}\n\nexport const openaiCompatibleEmbedding = (\n config: EmbeddingConfig,\n): EmbeddingProvider => createEmbeddingProvider(config);\n\nexport const openaiEmbedding = factory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\nexport const ollamaEmbedding = factory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\nexport const openRouterEmbedding = factory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n\nexport const lmStudioEmbedding = factory({\n baseUrl: \"http://127.0.0.1:1234/v1\",\n});\n\nexport const geminiEmbedding = factory({\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n});\n\nexport const togetherEmbedding = factory({\n baseUrl: \"https://api.together.xyz/v1\",\n});\n\nexport const vllmEmbedding = factory({\n baseUrl: \"http://127.0.0.1:8000/v1\",\n});\n\n/** Embed many texts, using batch API when available. */\nexport async function embedMany(\n provider: EmbeddingProvider,\n texts: string[],\n concurrency = 8,\n): Promise<Float32Array[]> {\n if (provider.embedBatch) {\n return provider.embedBatch(texts);\n }\n const out: Float32Array[] = new Array(texts.length);\n let index = 0;\n async function worker(): Promise<void> {\n while (index < texts.length) {\n const current = index;\n index += 1;\n out[current] = await provider.embed(texts[current]!);\n }\n }\n await Promise.all(\n Array.from({ length: Math.min(concurrency, texts.length) }, () => worker()),\n );\n return out;\n}\n","/**\n * LLM provider abstractions and OpenAI-compatible chat implementation.\n * Used exclusively for memory compression (and future ORC features).\n */\n\nimport type { LlmConfig } from \"../types/index.js\";\nimport { CompressionError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/** Contract for any chat completion backend. */\nexport interface LlmProvider {\n readonly model: string;\n complete(messages: ChatMessage[]): Promise<string>;\n /** Lightweight connectivity probe. */\n validate(): Promise<void>;\n}\n\ninterface OpenAIChatResponse {\n choices?: Array<{ message?: { content?: string | null } }>;\n error?: { message?: string };\n}\n\nexport class OpenAICompatibleLlmProvider implements LlmProvider {\n readonly model: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly temperature: number;\n private readonly maxTokens: number;\n private readonly timeoutMs: number;\n\n constructor(config: LlmConfig) {\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.model = config.model;\n this.temperature = config.temperature ?? 0.2;\n this.maxTokens = config.maxTokens ?? 4096;\n this.timeoutMs = config.timeoutMs ?? 60_000;\n }\n\n async complete(messages: ChatMessage[]): Promise<string> {\n const response = await this.request(messages);\n const content = response.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || content.trim().length === 0) {\n throw new CompressionError(\"LLM response did not contain text content\");\n }\n return content.trim();\n }\n\n async validate(): Promise<void> {\n try {\n await this.complete([\n {\n role: \"user\",\n content: 'Reply with exactly the word \"ok\".',\n },\n ]);\n } catch (error) {\n if (error instanceof CompressionError) {\n throw new CompressionError(\n `Failed to validate LLM endpoint: ${error.message}`,\n { cause: error },\n );\n }\n throw new CompressionError(\n `Failed to validate LLM endpoint: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n private async request(messages: ChatMessage[]): Promise<OpenAIChatResponse> {\n const url = joinUrl(this.baseUrl, \"/chat/completions\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\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 messages,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n }),\n signal: controller.signal,\n });\n\n let body: OpenAIChatResponse;\n try {\n body = (await res.json()) as OpenAIChatResponse;\n } catch {\n throw new CompressionError(\n `LLM endpoint returned non-JSON response (HTTP ${res.status})`,\n );\n }\n\n if (!res.ok) {\n const message = body.error?.message ?? `HTTP ${res.status}`;\n throw new CompressionError(`LLM request failed: ${message}`);\n }\n\n return body;\n } catch (error) {\n if (error instanceof CompressionError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new CompressionError(\n `LLM request timed out after ${this.timeoutMs}ms`,\n );\n }\n throw new CompressionError(`LLM request failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\nexport function createLlmProvider(config: LlmConfig): LlmProvider {\n return new OpenAICompatibleLlmProvider(config);\n}\n\nfunction llmFactory(\n defaults: Partial<LlmConfig> & Pick<LlmConfig, \"baseUrl\">,\n) {\n return (config: Omit<LlmConfig, \"baseUrl\"> & { baseUrl?: string }): LlmProvider =>\n createLlmProvider({\n baseUrl: config.baseUrl ?? defaults.baseUrl,\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n timeoutMs: config.timeoutMs,\n });\n}\n\nexport const openaiCompatibleLlm = (config: LlmConfig): LlmProvider =>\n createLlmProvider(config);\n\nexport const openaiLlm = llmFactory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\nexport const ollamaLlm = llmFactory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\nexport const openRouterLlm = llmFactory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n","/**\n * Document parsers for ingest pipeline.\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ConfigurationError } from \"../errors/index.js\";\n\nexport interface ParsedDocument {\n text: string;\n mimeType: string;\n filename?: string;\n isImage: boolean;\n imageBuffer?: Buffer;\n}\n\nexport interface DocumentParserProvider {\n readonly name: string;\n readonly extensions: string[];\n parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument>;\n}\n\nfunction extOf(filename?: string): string {\n if (!filename) {\n return \"\";\n }\n return path.extname(filename).toLowerCase();\n}\n\nexport class TextParser implements DocumentParserProvider {\n readonly name = \"text\";\n readonly extensions = [\".txt\", \".md\", \".markdown\", \".csv\", \".json\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n const ext = extOf(input.filename);\n let text = input.buffer.toString(\"utf8\");\n if (ext === \".json\") {\n try {\n text = JSON.stringify(JSON.parse(text), null, 2);\n } catch {\n // keep raw\n }\n }\n return {\n text,\n mimeType: input.mimeType ?? \"text/plain\",\n filename: input.filename,\n isImage: false,\n };\n }\n}\n\nexport class ImageParser implements DocumentParserProvider {\n readonly name = \"image\";\n readonly extensions = [\".png\", \".jpg\", \".jpeg\", \".webp\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n const ext = extOf(input.filename);\n const mime =\n input.mimeType ??\n (ext === \".png\"\n ? \"image/png\"\n : ext === \".webp\"\n ? \"image/webp\"\n : \"image/jpeg\");\n return {\n text: \"\",\n mimeType: mime,\n filename: input.filename,\n isImage: true,\n imageBuffer: input.buffer,\n };\n }\n}\n\nexport class PdfParser implements DocumentParserProvider {\n readonly name = \"pdf\";\n readonly extensions = [\".pdf\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n try {\n const mod = await import(\"pdf-parse\");\n // pdf-parse v1: default export is (buffer) => Promise<{ text }>\n // pdf-parse v2: named PDFParse class\n const maybeClass = (mod as { PDFParse?: new (opts: { data: Buffer }) => {\n getText: () => Promise<{ text: string }>;\n destroy?: () => Promise<void>;\n } }).PDFParse;\n let text = \"\";\n if (typeof maybeClass === \"function\") {\n const parser = new maybeClass({ data: input.buffer });\n try {\n const result = await parser.getText();\n text = result.text ?? \"\";\n } finally {\n await parser.destroy?.();\n }\n } else {\n const pdfParse =\n (mod as { default?: (buf: Buffer) => Promise<{ text: string }> }).default ??\n (mod as unknown as (buf: Buffer) => Promise<{ text: string }>);\n if (typeof pdfParse !== \"function\") {\n throw new Error(\"pdf-parse export is not a function\");\n }\n const result = await pdfParse(input.buffer);\n text = result.text ?? \"\";\n }\n return {\n text,\n mimeType: \"application/pdf\",\n filename: input.filename,\n isImage: false,\n };\n } catch (error) {\n if (\n error instanceof ConfigurationError\n ) {\n throw error;\n }\n const detail = error instanceof Error ? error.message : String(error);\n throw new ConfigurationError(\n `PDF ingest failed (${detail}). Install compatible pdf-parse: npm install pdf-parse@1.1.4`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n}\n\nexport class DocxParser implements DocumentParserProvider {\n readonly name = \"docx\";\n readonly extensions = [\".docx\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n try {\n const mod = await import(\"mammoth\" as string);\n const extractRawText =\n (mod as { extractRawText?: (opts: { buffer: Buffer }) => Promise<{ value: string }> })\n .extractRawText ??\n (mod as { default?: { extractRawText: (opts: { buffer: Buffer }) => Promise<{ value: string }> } })\n .default?.extractRawText;\n if (!extractRawText) {\n throw new Error(\"mammoth.extractRawText unavailable\");\n }\n const result = await extractRawText({ buffer: input.buffer });\n return {\n text: result.value ?? \"\",\n mimeType:\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n filename: input.filename,\n isImage: false,\n };\n } catch {\n throw new ConfigurationError(\n 'DOCX ingest requires the optional \"mammoth\" package. Install it with: npm install mammoth',\n );\n }\n }\n}\n\nconst DEFAULT_PARSERS: DocumentParserProvider[] = [\n new TextParser(),\n new ImageParser(),\n new PdfParser(),\n new DocxParser(),\n];\n\nexport function resolveParser(\n filename?: string,\n mimeType?: string,\n parsers: DocumentParserProvider[] = DEFAULT_PARSERS,\n): DocumentParserProvider {\n const ext = extOf(filename);\n if (ext) {\n const byExt = parsers.find((p) => p.extensions.includes(ext));\n if (byExt) {\n return byExt;\n }\n }\n if (mimeType?.startsWith(\"image/\")) {\n return parsers.find((p) => p.name === \"image\") ?? new ImageParser();\n }\n if (mimeType === \"application/pdf\") {\n return parsers.find((p) => p.name === \"pdf\") ?? new PdfParser();\n }\n return parsers.find((p) => p.name === \"text\") ?? new TextParser();\n}\n\nexport async function loadIngestSource(source: {\n path?: string;\n buffer?: Buffer;\n text?: string;\n filename?: string;\n mimeType?: string;\n}): Promise<{ buffer: Buffer; filename?: string; mimeType?: string; rawText?: string }> {\n if (source.text !== undefined) {\n return {\n buffer: Buffer.from(source.text, \"utf8\"),\n filename: source.filename ?? \"document.txt\",\n mimeType: source.mimeType ?? \"text/plain\",\n rawText: source.text,\n };\n }\n if (source.buffer) {\n return {\n buffer: source.buffer,\n filename: source.filename,\n mimeType: source.mimeType,\n };\n }\n if (source.path) {\n const buffer = await fs.readFile(source.path);\n return {\n buffer,\n filename: path.basename(source.path),\n mimeType: source.mimeType,\n };\n }\n throw new ConfigurationError(\"ingest source must include path, buffer, or text\");\n}\n\nexport { DEFAULT_PARSERS };\n","/**\n * In-memory metadata filter evaluation (used as fallback / post-filter).\n */\n\nimport type { MemoryMetadata } from \"../types/index.js\";\nimport type { MetadataComparison, MetadataFilter } from \"./types.js\";\n\nfunction getField(metadata: MemoryMetadata, field: string): unknown {\n const parts = field.split(\".\");\n let current: unknown = metadata;\n for (const part of parts) {\n if (current === null || typeof current !== \"object\" || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction compare(value: unknown, op: MetadataComparison): boolean {\n if (\"eq\" in op) {\n return value === op.eq;\n }\n if (\"contains\" in op) {\n if (typeof value === \"string\") {\n return value.includes(op.contains);\n }\n if (Array.isArray(value)) {\n return value.some((item) => String(item).includes(op.contains));\n }\n return false;\n }\n if (\"gt\" in op) {\n return value != null && (value as string | number) > op.gt;\n }\n if (\"gte\" in op) {\n return value != null && (value as string | number) >= op.gte;\n }\n if (\"lt\" in op) {\n return value != null && (value as string | number) < op.lt;\n }\n if (\"lte\" in op) {\n return value != null && (value as string | number) <= op.lte;\n }\n if (\"between\" in op) {\n const [lo, hi] = op.between;\n return value != null && value >= lo && value <= hi;\n }\n return false;\n}\n\n/** Evaluate a metadata filter against an opaque metadata object. */\nexport function matchesMetadata(\n metadata: MemoryMetadata,\n filter: MetadataFilter,\n): boolean {\n if (\"and\" in filter) {\n return filter.and.every((f) => matchesMetadata(metadata, f));\n }\n if (\"or\" in filter) {\n return filter.or.some((f) => matchesMetadata(metadata, f));\n }\n if (\"not\" in filter) {\n return !matchesMetadata(metadata, filter.not);\n }\n return compare(getField(metadata, filter.field), filter.op);\n}\n","/**\n * SQL schema constants and migration statements.\n */\n\nexport const SCHEMA_VERSION = 2;\n\nexport const META_KEYS = {\n schemaVersion: \"schema_version\",\n embeddingDimensions: \"embedding_dimensions\",\n vectorBackend: \"vector_backend\",\n} as const;\n\n/** Vector storage backend used by the SQLite provider. */\nexport type VectorBackend = \"sqlite-vec\" | \"blob\";\n\nexport const CREATE_META_TABLE = `\nCREATE TABLE IF NOT EXISTS Wolbarg_meta (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n);\n`;\n\nexport const CREATE_MEMORIES_TABLE = `\nCREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY NOT NULL,\n organization TEXT NOT NULL,\n agent TEXT NOT NULL,\n content_text TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n archived INTEGER NOT NULL DEFAULT 0 CHECK (archived IN (0, 1)),\n compressed_into TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (compressed_into) REFERENCES memories(id) ON DELETE SET NULL\n);\n`;\n\nexport const CREATE_HISTORY_TABLE = `\nCREATE TABLE IF NOT EXISTS memory_history (\n id TEXT PRIMARY KEY NOT NULL,\n memory_id TEXT NOT NULL,\n event_type TEXT NOT NULL CHECK (event_type IN ('created', 'archived', 'compressed')),\n related_memory_id TEXT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE\n);\n`;\n\n/** Fallback embedding store used when sqlite-vec is unavailable on the platform. */\nexport const CREATE_BLOB_EMBEDDINGS_TABLE = `\nCREATE TABLE IF NOT EXISTS memory_embeddings_blob (\n memory_rowid INTEGER PRIMARY KEY NOT NULL,\n embedding BLOB NOT NULL\n);\n`;\n\n/** FTS5 index for keyword / BM25 search (schema v2). */\nexport const CREATE_FTS_TABLE = `\nCREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n content_text,\n memory_id UNINDEXED,\n organization UNINDEXED,\n agent UNINDEXED,\n tokenize = 'porter unicode61'\n);\n`;\n\nexport const CREATE_INDEXES = [\n `CREATE INDEX IF NOT EXISTS idx_memories_org_agent ON memories(organization, agent);`,\n `CREATE INDEX IF NOT EXISTS idx_memories_org_archived ON memories(organization, archived);`,\n /** Active-set covering path for org-scoped list / stats / compress. */\n `CREATE INDEX IF NOT EXISTS idx_memories_org_active_created\n ON memories(organization, created_at) WHERE archived = 0;`,\n `CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);`,\n `CREATE INDEX IF NOT EXISTS idx_history_memory_id ON memory_history(memory_id);`,\n] as const;\n\n/**\n * Build the vec0 virtual table DDL for a fixed embedding dimensionality.\n * Cosine distance enables similarity = 1 - distance.\n */\nexport function buildVectorTableSql(dimensions: number): string {\n if (!Number.isInteger(dimensions) || dimensions <= 0) {\n throw new Error(`Invalid embedding dimensions: ${dimensions}`);\n }\n return `\nCREATE VIRTUAL TABLE IF NOT EXISTS memory_embeddings USING vec0(\n memory_rowid INTEGER PRIMARY KEY,\n embedding float[${dimensions}] distance_metric=cosine\n);\n`;\n}\n","/**\n * Prepared-statement SQL templates for the SQLite provider.\n */\n\nexport const SQL = {\n getMeta: `SELECT value FROM Wolbarg_meta WHERE key = ?`,\n setMeta: `\n INSERT INTO Wolbarg_meta (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `,\n\n insertMemory: `\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, 0, NULL, ?, ?)\n RETURNING rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n `,\n\n getMemoryById: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE id = ? AND organization = ?\n `,\n\n getMemoryByRowid: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE rowid = ? AND organization = ?\n `,\n\n getMemoriesByRowidsPrefix: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE organization = ? AND rowid IN (\n `,\n\n listMemoriesBase: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE organization = ?\n `,\n\n insertEmbedding: `\n INSERT INTO memory_embeddings (memory_rowid, embedding) VALUES (?, ?)\n `,\n\n deleteEmbedding: `\n DELETE FROM memory_embeddings WHERE memory_rowid = ?\n `,\n\n searchVectors: `\n SELECT memory_rowid, distance\n FROM memory_embeddings\n WHERE embedding MATCH ?\n AND k = ?\n `,\n\n insertEmbeddingBlob: `\n INSERT INTO memory_embeddings_blob (memory_rowid, embedding) VALUES (?, ?)\n `,\n\n deleteEmbeddingBlob: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid = ?\n `,\n\n listEmbeddingsBlob: `\n SELECT memory_rowid, embedding FROM memory_embeddings_blob\n `,\n\n archiveMemory: `\n UPDATE memories\n SET archived = 1,\n compressed_into = ?,\n updated_at = ?\n WHERE id = ? AND organization = ? AND archived = 0\n `,\n\n deleteMemoryById: `\n DELETE FROM memories WHERE id = ? AND organization = ?\n `,\n\n deleteMemoriesByOrg: `\n DELETE FROM memories WHERE organization = ?\n `,\n\n deleteMemoriesByOrgAgent: `\n DELETE FROM memories WHERE organization = ? AND agent = ?\n `,\n\n insertHistory: `\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES (?, ?, ?, ?, ?)\n `,\n\n getHistory: `\n SELECT id, memory_id, event_type, related_memory_id, created_at\n FROM memory_history\n WHERE memory_id = ?\n ORDER BY created_at ASC\n `,\n\n countMemories: `\n SELECT COUNT(*) AS count FROM memories WHERE organization = ?\n `,\n\n countActiveMemories: `\n SELECT COUNT(*) AS count FROM memories WHERE organization = ? AND archived = 0\n `,\n\n countArchivedMemories: `\n SELECT COUNT(*) AS count FROM memories WHERE organization = ? AND archived = 1\n `,\n\n countAgents: `\n SELECT COUNT(DISTINCT agent) AS count FROM memories WHERE organization = ? AND archived = 0\n `,\n\n /** FTS ranked by BM25 (archived rows are deleted from FTS on archive). */\n searchFts: `\n SELECT memory_id, bm25(memories_fts) AS rank\n FROM memories_fts\n WHERE memories_fts MATCH ?\n AND organization = ?\n ORDER BY rank\n LIMIT ?\n `,\n\n listRowidsForOrg: `\n SELECT rowid FROM memories WHERE organization = ?\n `,\n\n listRowidsForOrgAgent: `\n SELECT rowid FROM memories WHERE organization = ? AND agent = ?\n `,\n\n vectorTableExists: `\n SELECT name FROM sqlite_master\n WHERE type = 'table' AND name = 'memory_embeddings'\n `,\n\n updateMemoryContent: `\n UPDATE memories\n SET content_text = COALESCE(?, content_text),\n metadata_json = COALESCE(?, metadata_json),\n updated_at = ?\n WHERE id = ? AND organization = ?\n `,\n\n insertFts: `\n INSERT INTO memories_fts (content_text, memory_id, organization, agent)\n VALUES (?, ?, ?, ?)\n `,\n\n deleteFts: `\n DELETE FROM memories_fts WHERE memory_id = ?\n `,\n} as const;\n","/**\r\n * Cosine distance helpers for the blob vector fallback backend.\r\n */\r\n\r\n/** Cosine distance = 1 - cosine_similarity (matches sqlite-vec cosine metric). */\r\nexport function cosineDistance(a: Float32Array, b: Float32Array): number {\r\n const len = Math.min(a.length, b.length);\r\n let dot = 0;\r\n let normA = 0;\r\n let normB = 0;\r\n for (let i = 0; i < len; i += 1) {\r\n const av = a[i] ?? 0;\r\n const bv = b[i] ?? 0;\r\n dot += av * bv;\r\n normA += av * av;\r\n normB += bv * bv;\r\n }\r\n if (normA === 0 || normB === 0) {\r\n return 1;\r\n }\r\n const similarity = dot / (Math.sqrt(normA) * Math.sqrt(normB));\r\n return 1 - similarity;\r\n}\r\n\r\n/**\r\n * Decode a float32 embedding from a SQLite BLOB.\r\n * Avoids a copy when the underlying ArrayBuffer is already aligned/owned.\r\n */\r\nexport function bufferToEmbedding(data: Uint8Array | Buffer): Float32Array {\r\n const byteOffset = (data as Uint8Array).byteOffset ?? 0;\r\n const byteLength = data.byteLength;\r\n if (byteOffset % Float32Array.BYTES_PER_ELEMENT === 0) {\r\n return new Float32Array(\r\n (data as Uint8Array).buffer,\r\n byteOffset,\r\n byteLength / Float32Array.BYTES_PER_ELEMENT,\r\n );\r\n }\r\n const copy = new Uint8Array(byteLength);\r\n copy.set(data);\r\n return new Float32Array(copy.buffer);\r\n}\r\n","/**\n * Contiguous in-memory vector index for blob backends (e.g. win32-arm64\n * without sqlite-vec). Stores L2-normalized embeddings for O(n) top-k\n * via fused multiply-add + partial selection — no per-search allocations\n * of distance arrays when n is large.\n */\n\nexport interface InMemoryHit {\n memoryRowid: number;\n distance: number;\n}\n\nexport class InMemoryVectorIndex {\n private readonly dims: number;\n private rowids: number[] = [];\n private data: Float32Array;\n private count = 0;\n private readonly rowidToSlot = new Map<number, number>();\n\n constructor(dimensions: number, initialCapacity = 256) {\n this.dims = dimensions;\n this.data = new Float32Array(initialCapacity * dimensions);\n }\n\n get size(): number {\n return this.count;\n }\n\n clear(): void {\n this.rowids.length = 0;\n this.rowidToSlot.clear();\n this.count = 0;\n }\n\n upsert(rowid: number, embedding: Float32Array): void {\n const existing = this.rowidToSlot.get(rowid);\n const slot =\n existing !== undefined\n ? existing\n : (() => {\n this.ensureCapacity(this.count + 1);\n const s = this.count;\n this.rowids[s] = rowid;\n this.rowidToSlot.set(rowid, s);\n this.count += 1;\n return s;\n })();\n\n const dims = this.dims;\n const base = slot * dims;\n const data = this.data;\n const len = embedding.length < dims ? embedding.length : dims;\n let norm = 0;\n for (let i = 0; i < len; i += 1) {\n const v = embedding[i]!;\n data[base + i] = v;\n norm += v * v;\n }\n for (let i = len; i < dims; i += 1) {\n data[base + i] = 0;\n }\n if (norm > 0) {\n const inv = 1 / Math.sqrt(norm);\n for (let i = 0; i < len; i += 1) {\n data[base + i]! *= inv;\n }\n }\n }\n\n remove(rowid: number): void {\n const slot = this.rowidToSlot.get(rowid);\n if (slot === undefined) {\n return;\n }\n const last = this.count - 1;\n if (slot !== last) {\n const lastRowid = this.rowids[last]!;\n this.data.copyWithin(\n slot * this.dims,\n last * this.dims,\n (last + 1) * this.dims,\n );\n this.rowids[slot] = lastRowid;\n this.rowidToSlot.set(lastRowid, slot);\n }\n this.rowidToSlot.delete(rowid);\n this.count = last;\n }\n\n /** Top-k by cosine distance (1 - dot) assuming query is L2-normalized. */\n search(queryNormalized: Float32Array, topK: number): InMemoryHit[] {\n const n = this.count;\n if (n === 0 || topK <= 0) {\n return [];\n }\n const dims = this.dims;\n const data = this.data;\n const rowids = this.rowids;\n const k = topK < n ? topK : n;\n\n // Small-k: maintain a max-heap of distances (worst of the best-k at root).\n const heapDist = new Float64Array(k);\n const heapRow = new Int32Array(k);\n let heapSize = 0;\n\n for (let i = 0; i < n; i += 1) {\n const base = i * dims;\n let dot = 0;\n // Manual 4-wide unroll for hot loop\n let d = 0;\n for (; d + 3 < dims; d += 4) {\n dot +=\n queryNormalized[d]! * data[base + d]! +\n queryNormalized[d + 1]! * data[base + d + 1]! +\n queryNormalized[d + 2]! * data[base + d + 2]! +\n queryNormalized[d + 3]! * data[base + d + 3]!;\n }\n for (; d < dims; d += 1) {\n dot += queryNormalized[d]! * data[base + d]!;\n }\n const distance = 1 - dot;\n\n if (heapSize < k) {\n heapDist[heapSize] = distance;\n heapRow[heapSize] = rowids[i]!;\n heapSize += 1;\n if (heapSize === k) {\n buildMaxHeap(heapDist, heapRow, k);\n }\n } else if (distance < heapDist[0]!) {\n heapDist[0] = distance;\n heapRow[0] = rowids[i]!;\n siftDown(heapDist, heapRow, 0, k);\n }\n }\n\n const hits: InMemoryHit[] = new Array(heapSize);\n for (let i = 0; i < heapSize; i += 1) {\n hits[i] = { memoryRowid: heapRow[i]!, distance: heapDist[i]! };\n }\n hits.sort((a, b) => a.distance - b.distance);\n return hits;\n }\n\n private ensureCapacity(needed: number): void {\n if (needed * this.dims <= this.data.length) {\n return;\n }\n let cap = this.data.length / this.dims;\n if (cap < 1) cap = 1;\n while (cap < needed) cap *= 2;\n const next = new Float32Array(cap * this.dims);\n next.set(this.data.subarray(0, this.count * this.dims));\n this.data = next;\n }\n}\n\n/** L2-normalize into a new Float32Array of exactly `dims` length. */\nexport function normalizeEmbedding(\n embedding: Float32Array,\n dims = embedding.length,\n): Float32Array {\n return normalizeInto(embedding, dims);\n}\n\nfunction normalizeInto(embedding: Float32Array, dims: number): Float32Array {\n const out = new Float32Array(dims);\n const len = embedding.length < dims ? embedding.length : dims;\n let norm = 0;\n for (let i = 0; i < len; i += 1) {\n const v = embedding[i]!;\n out[i] = v;\n norm += v * v;\n }\n if (norm === 0) {\n return out;\n }\n const inv = 1 / Math.sqrt(norm);\n for (let i = 0; i < len; i += 1) {\n out[i]! *= inv;\n }\n return out;\n}\n\nfunction buildMaxHeap(\n dist: Float64Array,\n rows: Int32Array,\n n: number,\n): void {\n for (let i = (n >> 1) - 1; i >= 0; i -= 1) {\n siftDown(dist, rows, i, n);\n }\n}\n\nfunction siftDown(\n dist: Float64Array,\n rows: Int32Array,\n i: number,\n n: number,\n): void {\n for (;;) {\n let largest = i;\n const left = (i << 1) + 1;\n const right = left + 1;\n if (left < n && dist[left]! > dist[largest]!) largest = left;\n if (right < n && dist[right]! > dist[largest]!) largest = right;\n if (largest === i) return;\n const td = dist[i]!;\n dist[i] = dist[largest]!;\n dist[largest] = td;\n const tr = rows[i]!;\n rows[i] = rows[largest]!;\n rows[largest] = tr;\n i = largest;\n }\n}\n","/**\n * SQLite + sqlite-vec database provider (Node.js built-in `node:sqlite`).\n *\n * Responsibilities:\n * - WAL mode + crash-safe pragmas\n * - Automatic migrations / schema creation\n * - Prepared statements\n * - ACID transactions\n * - Vector index via sqlite-vec vec0 when available\n * - Blob + cosine fallback on unsupported platforms (e.g. win32-arm64)\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync, type StatementSync } from \"node:sqlite\";\nimport * as sqliteVec from \"sqlite-vec\";\n\nimport { DatabaseError, InitializationError } from \"../../errors/index.js\";\nimport { matchesMetadata } from \"../../filters/match.js\";\nimport {\n CREATE_BLOB_EMBEDDINGS_TABLE,\n CREATE_FTS_TABLE,\n CREATE_HISTORY_TABLE,\n CREATE_INDEXES,\n CREATE_MEMORIES_TABLE,\n CREATE_META_TABLE,\n META_KEYS,\n SCHEMA_VERSION,\n buildVectorTableSql,\n type VectorBackend,\n} from \"../../schema/index.js\";\nimport { SQL } from \"../../sql/index.js\";\nimport {\n deserializeMetadata,\n embeddingToBuffer,\n serializeMetadata,\n} from \"../../utils/index.js\";\nimport { bufferToEmbedding } from \"../../utils/vector.js\";\nimport {\n InMemoryVectorIndex,\n normalizeEmbedding,\n} from \"../../utils/vector-index.js\";\nimport type {\n HistoryRow,\n InsertMemoryInput,\n MemoryRow,\n RepositoryFilter,\n StorageProvider,\n UpdateMemoryInput,\n VectorSearchHit,\n} from \"../types.js\";\n\ninterface PreparedStatements {\n getMeta: StatementSync;\n setMeta: StatementSync;\n insertMemory: StatementSync;\n updateMemoryContent: StatementSync;\n getMemoryById: StatementSync;\n getMemoryByRowid: StatementSync;\n insertEmbedding: StatementSync | null;\n deleteEmbedding: StatementSync | null;\n searchVectors: StatementSync | null;\n insertEmbeddingBlob: StatementSync | null;\n deleteEmbeddingBlob: StatementSync | null;\n listEmbeddingsBlob: StatementSync | null;\n archiveMemory: StatementSync;\n deleteMemoryById: StatementSync;\n deleteMemoriesByOrg: StatementSync;\n deleteMemoriesByOrgAgent: StatementSync;\n insertHistory: StatementSync;\n getHistory: StatementSync;\n countMemories: StatementSync;\n countActiveMemories: StatementSync;\n countArchivedMemories: StatementSync;\n countAgents: StatementSync;\n listRowidsForOrg: StatementSync;\n listRowidsForOrgAgent: StatementSync;\n vectorTableExists: StatementSync;\n blobTableExists: StatementSync;\n insertFts: StatementSync | null;\n deleteFts: StatementSync | null;\n searchFts: StatementSync | null;\n}\n\nexport interface SqliteProviderOptions {\n connectionString: string;\n}\n\nexport class SqliteStorageProvider implements StorageProvider {\n readonly name = \"sqlite\";\n\n private readonly connectionString: string;\n private db: DatabaseSync | null = null;\n private statements: PreparedStatements | null = null;\n private vectorDimensions: number | null = null;\n private vectorBackend: VectorBackend | null = null;\n private sqliteVecLoaded = false;\n /** Hot in-process ANN for blob backend (sqlite-vec unavailable platforms). */\n private memoryIndex: InMemoryVectorIndex | null = null;\n private memoryIndexDirty = false;\n /** Resolved absolute path (or `:memory:`) — avoid re-resolving on size checks. */\n private resolvedPath: string | null = null;\n\n constructor(options: SqliteProviderOptions) {\n this.connectionString = options.connectionString;\n }\n\n async open(): Promise<void> {\n try {\n const dbPath = this.resolvePath(this.connectionString);\n this.resolvedPath = dbPath;\n if (dbPath !== \":memory:\") {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n }\n\n const db = new DatabaseSync(dbPath, { allowExtension: true });\n this.db = db;\n\n // WAL + NORMAL is the production-safe default (multi-reader friendly).\n // Single-process SDK keeps locking_mode=NORMAL (not EXCLUSIVE) so other\n // tools/processes can open the same file for backups or inspection.\n db.exec(\"PRAGMA journal_mode = WAL;\");\n db.exec(`\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n PRAGMA busy_timeout = 5000;\n PRAGMA temp_store = MEMORY;\n PRAGMA cache_size = -65536;\n PRAGMA mmap_size = 268435456;\n PRAGMA wal_autocheckpoint = 1000;\n PRAGMA recursive_triggers = OFF;\n `);\n\n this.sqliteVecLoaded = this.tryLoadSqliteVec(db);\n this.runMigrations(db);\n this.statements = this.prepareStatements(db);\n this.ensureFtsConsistency(db);\n\n const backend = this.readMetaString(META_KEYS.vectorBackend) as VectorBackend | null;\n const dims = this.readMetaNumber(META_KEYS.embeddingDimensions);\n\n if (backend) {\n this.vectorBackend = backend;\n } else if (this.sqliteVecLoaded) {\n this.vectorBackend = \"sqlite-vec\";\n } else {\n this.vectorBackend = \"blob\";\n }\n\n if (dims !== null) {\n this.vectorDimensions = dims;\n this.ensureVectorStorage(dims);\n this.reprepareVectorStatements();\n // Blob ANN hydrate is deferred until first search (warm-start win).\n if (this.vectorBackend === \"blob\") {\n this.memoryIndexDirty = true;\n }\n }\n } catch (error) {\n try {\n this.db?.close();\n } catch {\n // ignore close errors during failed open\n }\n this.db = null;\n this.statements = null;\n throw new InitializationError(\n `Failed to open SQLite database: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n async close(): Promise<void> {\n if (!this.db) {\n return;\n }\n try {\n this.db.close();\n } catch (error) {\n throw new DatabaseError(`Failed to close database: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n } finally {\n this.db = null;\n this.statements = null;\n this.memoryIndex = null;\n }\n }\n\n async ensureVectorSchema(dimensions: number): Promise<void> {\n const existing = await this.getEmbeddingDimensions();\n if (existing !== null && existing !== dimensions) {\n throw new InitializationError(\n `Embedding dimensions mismatch: database is configured for ${existing}-d vectors, but the embedding model returned ${dimensions}-d vectors.`,\n );\n }\n\n if (!this.vectorBackend) {\n this.vectorBackend = this.sqliteVecLoaded ? \"sqlite-vec\" : \"blob\";\n }\n\n // Prefer sqlite-vec when available and not already locked to blob.\n if (this.sqliteVecLoaded && this.vectorBackend !== \"blob\") {\n this.vectorBackend = \"sqlite-vec\";\n }\n\n this.ensureVectorStorage(dimensions);\n await this.setMeta(META_KEYS.vectorBackend, this.vectorBackend);\n\n if (existing === null) {\n await this.setEmbeddingDimensions(dimensions);\n }\n this.vectorDimensions = dimensions;\n this.reprepareVectorStatements();\n this.hydrateMemoryIndex();\n }\n\n async getEmbeddingDimensions(): Promise<number | null> {\n return this.readMetaNumber(META_KEYS.embeddingDimensions);\n }\n\n async setEmbeddingDimensions(dimensions: number): Promise<void> {\n await this.setMeta(META_KEYS.embeddingDimensions, String(dimensions));\n this.vectorDimensions = dimensions;\n }\n\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n const stmts = this.requireStatements();\n this.requireVectorReady();\n\n return this.withTransaction(() => {\n const row = stmts.insertMemory.get(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n ) as unknown as MemoryRow | undefined;\n if (!row || row.rowid === undefined) {\n throw new DatabaseError(\"Failed to read memory after insert\");\n }\n\n this.insertEmbedding(row.rowid, input.embedding);\n // Keep FTS in the same ACID transaction — no deferred/stale keyword search.\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n\n stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n\n return row;\n });\n }\n\n async insertMemoriesBatch(inputs: InsertMemoryInput[]): Promise<MemoryRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n const stmts = this.requireStatements();\n this.requireVectorReady();\n\n return this.withTransaction(() => {\n const rows: MemoryRow[] = [];\n for (const input of inputs) {\n const row = stmts.insertMemory.get(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n ) as unknown as MemoryRow | undefined;\n if (!row || row.rowid === undefined) {\n throw new DatabaseError(\"Failed to read memory after batch insert\");\n }\n\n this.insertEmbedding(row.rowid, input.embedding);\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n\n stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n rows.push(row);\n }\n return rows;\n });\n }\n\n async updateMemory(input: UpdateMemoryInput): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n return this.withTransaction(() => {\n const existing = stmts.getMemoryById.get(\n input.id,\n input.organization,\n ) as unknown as MemoryRow | undefined;\n if (!existing || existing.rowid === undefined) {\n return null;\n }\n\n const contentText = input.contentText ?? existing.content_text;\n const metadataJson =\n input.metadata !== undefined\n ? serializeMetadata(input.metadata)\n : existing.metadata_json;\n\n stmts.updateMemoryContent.run(\n input.contentText ?? null,\n input.metadata !== undefined ? metadataJson : null,\n input.updatedAt,\n input.id,\n input.organization,\n );\n\n if (input.embedding) {\n this.deleteEmbedding(existing.rowid);\n this.insertEmbedding(existing.rowid, input.embedding);\n }\n\n if (input.contentText !== undefined) {\n this.upsertFts(\n input.id,\n input.organization,\n existing.agent,\n contentText,\n );\n }\n\n return stmts.getMemoryById.get(input.id, input.organization) as unknown as MemoryRow;\n });\n }\n\n async searchByMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n const rows = await this.listMemories(filter, limit);\n if (!filter.metadata) {\n return rows;\n }\n return rows.filter((row) =>\n matchesMetadata(deserializeMetadata(row.metadata_json), filter.metadata!),\n );\n }\n\n /** Keyword search via FTS5 BM25. Returns memory IDs ranked by relevance. */\n async searchKeyword(\n query: string,\n organization: string,\n topK: number,\n ): Promise<Array<{ memoryId: string; score: number }>> {\n const stmts = this.requireStatements();\n if (!stmts.searchFts) {\n return [];\n }\n try {\n const sanitized = sanitizeFtsQuery(query);\n if (!sanitized) {\n return [];\n }\n const rows = stmts.searchFts.all(sanitized, organization, topK) as unknown as Array<{\n memory_id: string;\n rank: number;\n }>;\n return rows.map((row) => ({\n memoryId: row.memory_id,\n // bm25 returns lower (more negative) for better matches — invert to [0, ∞)\n score: 1 / (1 + Math.abs(row.rank)),\n }));\n } catch {\n return [];\n }\n }\n\n async getMemoryById(\n id: string,\n organization: string,\n ): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n const row = stmts.getMemoryById.get(id, organization) as unknown as\n | MemoryRow\n | undefined;\n return row ?? null;\n }\n\n async getMemoryByRowid(\n rowid: number,\n organization: string,\n ): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n const row = stmts.getMemoryByRowid.get(rowid, organization) as unknown as\n | MemoryRow\n | undefined;\n return row ?? null;\n }\n\n async getMemoriesByRowids(\n rowids: number[],\n organization: string,\n ): Promise<Map<number, MemoryRow>> {\n const out = new Map<number, MemoryRow>();\n if (rowids.length === 0) {\n return out;\n }\n const db = this.requireDb();\n // Chunk IN lists to stay well under SQLite variable limits.\n const chunkSize = 400;\n for (let offset = 0; offset < rowids.length; offset += chunkSize) {\n const chunk = rowids.slice(offset, offset + chunkSize);\n const placeholders = chunk.map(() => \"?\").join(\",\");\n const sql = `${SQL.getMemoriesByRowidsPrefix}${placeholders})`;\n const rows = db.prepare(sql).all(organization, ...chunk) as unknown as MemoryRow[];\n for (const row of rows) {\n if (row.rowid !== undefined) {\n out.set(row.rowid, row);\n }\n }\n }\n return out;\n }\n\n async listMemories(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n const db = this.requireDb();\n const clauses: string[] = [`organization = ?`];\n const params: Array<string | number> = [filter.organization];\n\n if (filter.agent) {\n clauses.push(`agent = ?`);\n params.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = 0`);\n }\n\n let sql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n `;\n if (limit !== undefined && !filter.metadata) {\n sql += ` LIMIT ?`;\n params.push(limit);\n }\n\n try {\n let rows = db.prepare(sql).all(...params) as unknown as MemoryRow[];\n if (filter.metadata) {\n rows = rows.filter((row) =>\n matchesMetadata(\n deserializeMetadata(row.metadata_json),\n filter.metadata!,\n ),\n );\n if (limit !== undefined) {\n rows = rows.slice(0, limit);\n }\n }\n return rows;\n } catch (error) {\n throw new DatabaseError(`Failed to list memories: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n async searchVectors(\n embedding: Float32Array,\n topK: number,\n ): Promise<VectorSearchHit[]> {\n this.requireVectorReady();\n\n if (this.vectorBackend === \"sqlite-vec\") {\n return this.searchWithSqliteVec(embedding, topK);\n }\n return this.searchWithBlobFallback(embedding, topK);\n }\n\n /**\n * Org-scoped KNN + memory rows.\n * Caller (Wolbarg.recall) already passes an overfetched topK — do not multiply again.\n */\n async searchVectorsWithMemories(\n embedding: Float32Array,\n topK: number,\n organization: string,\n options?: { agent?: string; includeArchived?: boolean },\n ): Promise<Array<{ row: MemoryRow; distance: number }>> {\n this.requireVectorReady();\n const hits = await this.searchVectors(embedding, topK);\n if (hits.length === 0) {\n return [];\n }\n const map = await this.getMemoriesByRowids(\n hits.map((h) => h.memoryRowid),\n organization,\n );\n const out: Array<{ row: MemoryRow; distance: number }> = [];\n for (const hit of hits) {\n const row = map.get(hit.memoryRowid);\n if (!row) continue;\n if (options?.agent && row.agent !== options.agent) continue;\n if (!options?.includeArchived && row.archived === 1) continue;\n out.push({ row, distance: hit.distance });\n }\n return out;\n }\n\n async archiveMemories(\n ids: string[],\n organization: string,\n compressedIntoId: string,\n archivedAt: string,\n ): Promise<string[]> {\n const stmts = this.requireStatements();\n const archived: string[] = [];\n\n return this.withTransaction(() => {\n for (const id of ids) {\n const result = stmts.archiveMemory.run(\n compressedIntoId,\n archivedAt,\n id,\n organization,\n );\n if (Number(result.changes) > 0) {\n archived.push(id);\n // Drop archived rows from FTS so keyword/hybrid never return them.\n this.deleteFts(id);\n stmts.insertHistory.run(\n crypto.randomUUID(),\n id,\n \"archived\",\n compressedIntoId,\n archivedAt,\n );\n stmts.insertHistory.run(\n crypto.randomUUID(),\n compressedIntoId,\n \"compressed\",\n id,\n archivedAt,\n );\n }\n }\n return archived;\n });\n }\n\n async deleteMemoryById(id: string, organization: string): Promise<boolean> {\n const stmts = this.requireStatements();\n\n return this.withTransaction(() => {\n const row = stmts.getMemoryById.get(id, organization) as unknown as\n | MemoryRow\n | undefined;\n if (!row || row.rowid === undefined) {\n return false;\n }\n\n this.deleteEmbedding(row.rowid);\n this.deleteFts(id);\n const result = stmts.deleteMemoryById.run(id, organization);\n return Number(result.changes) > 0;\n });\n }\n\n async deleteMemoriesByFilter(filter: RepositoryFilter): Promise<number> {\n const stmts = this.requireStatements();\n const agent = filter.agent;\n if (!agent) {\n throw new DatabaseError(\"deleteMemoriesByFilter requires an agent filter\");\n }\n\n return this.withTransaction(() => {\n const listed = this.listMemoriesSync({\n organization: filter.organization,\n agent,\n includeArchived: true,\n });\n for (const memory of listed) {\n if (memory.rowid !== undefined) {\n this.deleteEmbedding(memory.rowid);\n }\n this.deleteFts(memory.id);\n }\n const result = stmts.deleteMemoriesByOrgAgent.run(\n filter.organization,\n agent,\n );\n return Number(result.changes);\n });\n }\n\n async clearOrganization(organization: string): Promise<number> {\n const stmts = this.requireStatements();\n\n return this.withTransaction(() => {\n const listed = this.listMemoriesSync({ organization, includeArchived: true });\n for (const memory of listed) {\n if (memory.rowid !== undefined) {\n this.deleteEmbedding(memory.rowid);\n }\n this.deleteFts(memory.id);\n }\n const result = stmts.deleteMemoriesByOrg.run(organization);\n return Number(result.changes);\n });\n }\n\n async getHistory(memoryId: string): Promise<HistoryRow[]> {\n const stmts = this.requireStatements();\n return stmts.getHistory.all(memoryId) as unknown as HistoryRow[];\n }\n\n async insertHistoryEvent(event: HistoryRow): Promise<void> {\n const stmts = this.requireStatements();\n stmts.insertHistory.run(\n event.id,\n event.memory_id,\n event.event_type,\n event.related_memory_id,\n event.created_at,\n );\n }\n\n async getStats(\n organization: string,\n ): Promise<{\n totalMemories: number;\n activeMemories: number;\n archivedMemories: number;\n totalAgents: number;\n }> {\n const stmts = this.requireStatements();\n const memories = stmts.countMemories.get(organization) as unknown as {\n count: number | bigint;\n };\n const active = stmts.countActiveMemories.get(organization) as unknown as {\n count: number | bigint;\n };\n const archived = stmts.countArchivedMemories.get(organization) as unknown as {\n count: number | bigint;\n };\n const agents = stmts.countAgents.get(organization) as unknown as {\n count: number | bigint;\n };\n return {\n totalMemories: Number(memories.count),\n activeMemories: Number(active.count),\n archivedMemories: Number(archived.count),\n totalAgents: Number(agents.count),\n };\n }\n\n async getDatabaseSizeBytes(): Promise<number> {\n const db = this.requireDb();\n if (this.connectionString === \":memory:\") {\n const pageCountRow = db.prepare(\"PRAGMA page_count\").get() as\n | Record<string, number | bigint>\n | undefined;\n const pageSizeRow = db.prepare(\"PRAGMA page_size\").get() as\n | Record<string, number | bigint>\n | undefined;\n const pageCount = Number(\n pageCountRow?.page_count ?? Object.values(pageCountRow ?? {})[0] ?? 0,\n );\n const pageSize = Number(\n pageSizeRow?.page_size ?? Object.values(pageSizeRow ?? {})[0] ?? 0,\n );\n return pageCount * pageSize;\n }\n\n const dbPath = this.resolvedPath ?? this.resolvePath(this.connectionString);\n try {\n let total = fs.statSync(dbPath).size;\n for (const suffix of [\"-wal\", \"-shm\"]) {\n const side = `${dbPath}${suffix}`;\n if (fs.existsSync(side)) {\n total += fs.statSync(side).size;\n }\n }\n return total;\n } catch (error) {\n throw new DatabaseError(\n `Failed to determine database size: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n withTransaction<T>(fn: () => T): T {\n const db = this.requireDb();\n // DEFERRED is enough in single-threaded Node; IMMEDIATE adds lock latency.\n db.exec(\"BEGIN\");\n try {\n const result = fn();\n db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore rollback errors\n }\n if (\n error instanceof DatabaseError ||\n error instanceof InitializationError\n ) {\n throw error;\n }\n throw new DatabaseError(`Transaction failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n // ─── internals ───────────────────────────────────────────────────────────\n\n private tryLoadSqliteVec(db: DatabaseSync): boolean {\n try {\n sqliteVec.load(db);\n return true;\n } catch {\n return false;\n }\n }\n\n private runMigrations(db: DatabaseSync): void {\n db.exec(CREATE_META_TABLE);\n db.exec(CREATE_MEMORIES_TABLE);\n db.exec(CREATE_HISTORY_TABLE);\n db.exec(CREATE_BLOB_EMBEDDINGS_TABLE);\n for (const indexSql of CREATE_INDEXES) {\n db.exec(indexSql);\n }\n\n const current = this.readMetaNumberFromDb(db, META_KEYS.schemaVersion);\n if (current === null) {\n db.exec(CREATE_FTS_TABLE);\n this.backfillFts(db);\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n } else if (current > SCHEMA_VERSION) {\n throw new InitializationError(\n `Database schema version ${current} is newer than this SDK (supports ${SCHEMA_VERSION}).`,\n );\n } else if (current < SCHEMA_VERSION) {\n db.exec(CREATE_FTS_TABLE);\n this.backfillFts(db);\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n } else {\n db.exec(CREATE_FTS_TABLE);\n }\n }\n\n /**\n * Rebuild FTS from active (non-archived) memories when counts diverge.\n * Guarantees keyword/hybrid correctness after crashes or interrupted writes.\n */\n private ensureFtsConsistency(db: DatabaseSync): void {\n try {\n const memCount = db\n .prepare(`SELECT COUNT(*) AS c FROM memories WHERE archived = 0`)\n .get() as { c: number | bigint };\n const ftsCount = db\n .prepare(`SELECT COUNT(*) AS c FROM memories_fts`)\n .get() as { c: number | bigint };\n if (Number(memCount.c) !== Number(ftsCount.c)) {\n this.backfillFts(db);\n }\n } catch {\n // FTS unavailable — keyword search degrades gracefully.\n }\n }\n\n private backfillFts(db: DatabaseSync): void {\n try {\n db.exec(`DELETE FROM memories_fts`);\n const rows = db\n .prepare(\n `SELECT id, organization, agent, content_text FROM memories WHERE archived = 0`,\n )\n .all() as unknown as Array<{\n id: string;\n organization: string;\n agent: string;\n content_text: string;\n }>;\n const insert = db.prepare(SQL.insertFts);\n for (const row of rows) {\n insert.run(row.content_text, row.id, row.organization, row.agent);\n }\n } catch {\n // FTS may be unavailable on exotic builds — keyword search degrades.\n }\n }\n\n private prepareStatements(db: DatabaseSync): PreparedStatements {\n let insertFts: StatementSync | null = null;\n let deleteFts: StatementSync | null = null;\n let searchFts: StatementSync | null = null;\n try {\n insertFts = db.prepare(SQL.insertFts);\n deleteFts = db.prepare(SQL.deleteFts);\n searchFts = db.prepare(SQL.searchFts);\n } catch {\n // FTS optional\n }\n\n return {\n getMeta: db.prepare(SQL.getMeta),\n setMeta: db.prepare(SQL.setMeta),\n insertMemory: db.prepare(SQL.insertMemory),\n updateMemoryContent: db.prepare(SQL.updateMemoryContent),\n getMemoryById: db.prepare(SQL.getMemoryById),\n getMemoryByRowid: db.prepare(SQL.getMemoryByRowid),\n insertEmbedding: null,\n deleteEmbedding: null,\n searchVectors: null,\n insertEmbeddingBlob: null,\n deleteEmbeddingBlob: null,\n listEmbeddingsBlob: null,\n archiveMemory: db.prepare(SQL.archiveMemory),\n deleteMemoryById: db.prepare(SQL.deleteMemoryById),\n deleteMemoriesByOrg: db.prepare(SQL.deleteMemoriesByOrg),\n deleteMemoriesByOrgAgent: db.prepare(SQL.deleteMemoriesByOrgAgent),\n insertHistory: db.prepare(SQL.insertHistory),\n getHistory: db.prepare(SQL.getHistory),\n countMemories: db.prepare(SQL.countMemories),\n countActiveMemories: db.prepare(SQL.countActiveMemories),\n countArchivedMemories: db.prepare(SQL.countArchivedMemories),\n countAgents: db.prepare(SQL.countAgents),\n listRowidsForOrg: db.prepare(SQL.listRowidsForOrg),\n listRowidsForOrgAgent: db.prepare(SQL.listRowidsForOrgAgent),\n vectorTableExists: db.prepare(SQL.vectorTableExists),\n blobTableExists: db.prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'memory_embeddings_blob'`,\n ),\n insertFts,\n deleteFts,\n searchFts,\n };\n }\n\n private listMemoriesSync(filter: RepositoryFilter): MemoryRow[] {\n const db = this.requireDb();\n const clauses: string[] = [`organization = ?`];\n const params: Array<string | number> = [filter.organization];\n if (filter.agent) {\n clauses.push(`agent = ?`);\n params.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = 0`);\n }\n const sql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n `;\n return db.prepare(sql).all(...params) as unknown as MemoryRow[];\n }\n\n /** Insert-only FTS row (new memory IDs never collide). */\n private insertFtsRow(\n memoryId: string,\n organization: string,\n agent: string,\n contentText: string,\n ): void {\n const stmts = this.requireStatements();\n if (!stmts.insertFts) {\n return;\n }\n try {\n stmts.insertFts.run(contentText, memoryId, organization, agent);\n } catch {\n // ignore FTS errors — keyword search degrades but semantic search remains\n }\n }\n\n private upsertFts(\n memoryId: string,\n organization: string,\n agent: string,\n contentText: string,\n ): void {\n const stmts = this.requireStatements();\n if (!stmts.insertFts || !stmts.deleteFts) {\n return;\n }\n try {\n stmts.deleteFts.run(memoryId);\n stmts.insertFts.run(contentText, memoryId, organization, agent);\n } catch {\n // ignore FTS errors — keyword search degrades but semantic search remains\n }\n }\n\n private deleteFts(memoryId: string): void {\n const stmts = this.requireStatements();\n if (!stmts.deleteFts) {\n return;\n }\n try {\n stmts.deleteFts.run(memoryId);\n } catch {\n // ignore\n }\n }\n\n private ensureVectorStorage(dimensions: number): void {\n const db = this.requireDb();\n if (this.vectorBackend === \"sqlite-vec\") {\n if (!this.sqliteVecLoaded) {\n throw new InitializationError(\n \"sqlite-vec is required for this database but is unavailable on this platform.\",\n );\n }\n const stmts = this.requireStatements();\n const exists = stmts.vectorTableExists.get() as { name: string } | undefined;\n if (!exists) {\n db.exec(buildVectorTableSql(dimensions));\n }\n this.memoryIndex = null;\n return;\n }\n\n db.exec(CREATE_BLOB_EMBEDDINGS_TABLE);\n if (!this.memoryIndex || this.memoryIndex.size === 0) {\n this.memoryIndex = new InMemoryVectorIndex(dimensions);\n }\n }\n\n private hydrateMemoryIndex(): void {\n if (this.vectorBackend !== \"blob\" || this.vectorDimensions === null) {\n this.memoryIndex = null;\n return;\n }\n const stmts = this.requireStatements();\n if (!stmts.listEmbeddingsBlob) {\n stmts.listEmbeddingsBlob = this.requireDb().prepare(SQL.listEmbeddingsBlob);\n }\n const index = new InMemoryVectorIndex(this.vectorDimensions);\n try {\n const rows = stmts.listEmbeddingsBlob.all() as unknown as Array<{\n memory_rowid: number;\n embedding: Uint8Array | Buffer;\n }>;\n for (const row of rows) {\n index.upsert(row.memory_rowid, bufferToEmbedding(row.embedding));\n }\n } catch {\n // empty table is fine\n }\n this.memoryIndex = index;\n }\n\n private reprepareVectorStatements(): void {\n const db = this.requireDb();\n const stmts = this.requireStatements();\n\n if (this.vectorBackend === \"sqlite-vec\") {\n stmts.insertEmbedding = db.prepare(SQL.insertEmbedding);\n stmts.deleteEmbedding = db.prepare(SQL.deleteEmbedding);\n stmts.searchVectors = db.prepare(SQL.searchVectors);\n stmts.insertEmbeddingBlob = null;\n stmts.deleteEmbeddingBlob = null;\n stmts.listEmbeddingsBlob = null;\n return;\n }\n\n stmts.insertEmbeddingBlob = db.prepare(SQL.insertEmbeddingBlob);\n stmts.deleteEmbeddingBlob = db.prepare(SQL.deleteEmbeddingBlob);\n stmts.listEmbeddingsBlob = db.prepare(SQL.listEmbeddingsBlob);\n stmts.insertEmbedding = null;\n stmts.deleteEmbedding = null;\n stmts.searchVectors = null;\n }\n\n private insertEmbedding(rowid: number, embedding: Float32Array): void {\n const stmts = this.requireStatements();\n if (this.vectorBackend === \"sqlite-vec\") {\n stmts.insertEmbedding!.run(rowid, this.toVectorParam(embedding));\n return;\n }\n stmts.insertEmbeddingBlob!.run(rowid, embeddingToBuffer(embedding));\n // Defer in-memory index rebuild until the next search (faster writes).\n this.memoryIndexDirty = true;\n }\n\n private deleteEmbedding(rowid: number): void {\n const stmts = this.requireStatements();\n try {\n if (this.vectorBackend === \"sqlite-vec\" && stmts.deleteEmbedding) {\n stmts.deleteEmbedding.run(rowid);\n } else if (stmts.deleteEmbeddingBlob) {\n stmts.deleteEmbeddingBlob.run(rowid);\n this.memoryIndex?.remove(rowid);\n this.memoryIndexDirty = true;\n }\n } catch {\n // Ignore missing vectors during delete.\n }\n }\n\n private searchWithSqliteVec(\n embedding: Float32Array,\n topK: number,\n ): VectorSearchHit[] {\n const stmts = this.requireStatements();\n try {\n const rows = stmts.searchVectors!.all(\n this.toVectorParam(embedding),\n topK,\n ) as unknown as Array<{ memory_rowid: number; distance: number }>;\n\n const hits: VectorSearchHit[] = new Array(rows.length);\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i]!;\n hits[i] = {\n memoryRowid: row.memory_rowid,\n distance: row.distance,\n };\n }\n return hits;\n } catch (error) {\n throw new DatabaseError(`Vector search failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n private searchWithBlobFallback(\n embedding: Float32Array,\n topK: number,\n ): VectorSearchHit[] {\n if (this.memoryIndexDirty || !this.memoryIndex) {\n this.hydrateMemoryIndex();\n this.memoryIndexDirty = false;\n }\n if (this.memoryIndex && this.vectorDimensions !== null) {\n const query = normalizeEmbedding(embedding, this.vectorDimensions);\n return this.memoryIndex.search(query, topK);\n }\n throw new DatabaseError(\"Blob vector index is not initialized\");\n }\n\n private async setMeta(key: string, value: string): Promise<void> {\n const stmts = this.requireStatements();\n stmts.setMeta.run(key, value);\n }\n\n private readMetaNumber(key: string): number | null {\n const stmts = this.requireStatements();\n const row = stmts.getMeta.get(key) as { value: string } | undefined;\n if (!row) {\n return null;\n }\n const parsed = Number(row.value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n private readMetaString(key: string): string | null {\n const stmts = this.requireStatements();\n const row = stmts.getMeta.get(key) as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n private readMetaNumberFromDb(db: DatabaseSync, key: string): number | null {\n const row = db.prepare(SQL.getMeta).get(key) as { value: string } | undefined;\n if (!row) {\n return null;\n }\n const parsed = Number(row.value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n private resolvePath(connectionString: string): string {\n if (connectionString === \":memory:\") {\n return \":memory:\";\n }\n return path.isAbsolute(connectionString)\n ? connectionString\n : path.resolve(process.cwd(), connectionString);\n }\n\n private requireDb(): DatabaseSync {\n if (!this.db) {\n throw new DatabaseError(\"Database is not open. Call init() first.\");\n }\n return this.db;\n }\n\n private requireStatements(): PreparedStatements {\n if (!this.statements) {\n throw new DatabaseError(\"Database statements are not prepared. Call init() first.\");\n }\n return this.statements;\n }\n\n private requireVectorReady(): void {\n if (!this.vectorBackend || this.vectorDimensions === null) {\n throw new DatabaseError(\n \"Vector index is not ready. Embedding dimensions have not been initialized.\",\n );\n }\n }\n\n private toVectorParam(embedding: Float32Array): Uint8Array {\n const buffer = embeddingToBuffer(embedding);\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\n/** @deprecated Prefer {@link SqliteStorageProvider}. */\nexport const SqliteDatabaseProvider = SqliteStorageProvider;\n\n/** Turn free text into a safe FTS5 MATCH query (OR of terms). */\nfunction sanitizeFtsQuery(query: string): string {\n const terms = query\n .split(/\\s+/)\n .map((t) => t.replace(/[\"']/g, \"\").replace(/[^\\p{L}\\p{N}_-]/gu, \"\"))\n .filter((t) => t.length > 0);\n if (terms.length === 0) {\n return \"\";\n }\n return terms.map((t) => `\"${t}\"`).join(\" OR \");\n}\n","/**\n * PostgreSQL storage provider with optional pgvector support.\n * Requires the optional `pg` peer dependency.\n *\n * Performance design:\n * - Per-operation pool queries (no global write lock / shared tx client race)\n * - AsyncLocalStorage for nested transactions\n * - Single-statement CTE inserts (no BEGIN/COMMIT for one memory)\n * - Named prepared statements (parse/plan once per connection)\n * - Concurrent insert coalescing into unnest batches; sequential path is immediate\n * - COPY protocol for large ingest batches\n * - Org-filtered ANN with adaptive overfetch + HNSW iterative scan when available\n * - Joined vector search returning memories in one round-trip when possible\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { DatabaseError, InitializationError, ConfigurationError } from \"../../errors/index.js\";\nimport { matchesMetadata } from \"../../filters/match.js\";\nimport { SCHEMA_VERSION, META_KEYS } from \"../../schema/index.js\";\nimport {\n deserializeMetadata,\n serializeMetadata,\n} from \"../../utils/index.js\";\nimport { cosineDistance } from \"../../utils/vector.js\";\nimport type {\n HistoryRow,\n InsertMemoryInput,\n MemoryRow,\n RepositoryFilter,\n StorageProvider,\n UpdateMemoryInput,\n VectorSearchHit,\n} from \"../types.js\";\n\ntype PgQueryResult = {\n rows: Record<string, unknown>[];\n rowCount: number | null;\n};\n\ntype PgQueryable = {\n query: (\n textOrConfig: string | { name?: string; text: string; values?: unknown[] },\n params?: unknown[],\n ) => Promise<PgQueryResult>;\n};\n\ntype PgPoolClient = PgQueryable & {\n release: () => void;\n query: PgQueryable[\"query\"];\n};\n\ntype PgPool = PgQueryable & {\n end: () => Promise<void>;\n connect: () => Promise<PgPoolClient>;\n totalCount?: number;\n idleCount?: number;\n waitingCount?: number;\n};\n\nexport interface PostgresProviderOptions {\n connectionString: string;\n maxPoolSize?: number;\n}\n\nconst txStore = new AsyncLocalStorage<PgPoolClient>();\n\n/** Statement names for per-connection prepared-statement cache. */\nconst STMT = {\n insertOne: \"Wolbarg_insert_one_v1\",\n insertBatch: \"Wolbarg_insert_batch_v1\",\n} as const;\n\n/** Fast Float32Array → pgvector text literal without Array.from. */\nfunction toVectorLiteral(embedding: Float32Array): string {\n const n = embedding.length;\n let s = \"[\";\n for (let i = 0; i < n; i += 1) {\n if (i !== 0) s += \",\";\n s += embedding[i];\n }\n return s + \"]\";\n}\n\nconst INSERT_ONE_SQL = `WITH mem AS (\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n ),\n hist AS (\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT $8, id, 'created', NULL, $6 FROM mem\n ),\n mapped AS (\n INSERT INTO memory_row_map (memory_id)\n SELECT id FROM mem\n ON CONFLICT (memory_id) DO NOTHING\n ),\n emb AS (\n INSERT INTO memory_embeddings (memory_id, embedding)\n SELECT id, $9::vector FROM mem\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding\n )\n SELECT * FROM mem`;\n\nconst INSERT_BATCH_SQL = `WITH mem AS (\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n )\n SELECT id, org, agent, txt, meta::jsonb, false, NULL, c, u\n FROM unnest(\n $1::text[], $2::text[], $3::text[], $4::text[],\n $5::text[], $6::timestamptz[], $7::timestamptz[]\n ) AS t(id, org, agent, txt, meta, c, u)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n ),\n hist AS (\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT h, m, 'created', NULL, c\n FROM unnest($8::text[], $1::text[], $6::timestamptz[]) AS t(h, m, c)\n ),\n mapped AS (\n INSERT INTO memory_row_map (memory_id)\n SELECT unnest($1::text[])\n ON CONFLICT (memory_id) DO NOTHING\n ),\n emb AS (\n INSERT INTO memory_embeddings (memory_id, embedding)\n SELECT id, emb::vector\n FROM unnest($1::text[], $9::text[]) AS t(id, emb)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding\n )\n SELECT * FROM mem`;\n\nconst COPY_BATCH_THRESHOLD = 64;\n\nexport class PostgresStorageProvider implements StorageProvider {\n readonly name = \"postgres\";\n\n private readonly connectionString: string;\n private readonly maxPoolSize: number;\n private pool: PgPool | null = null;\n private vectorDimensions: number | null = null;\n private hasPgvector = false;\n private hnswIndexEnsured = false;\n private hnswCreateFailures = 0;\n private hasContentTsv = false;\n private iterativeScanEnabled = false;\n /** Coalesce concurrent insertMemory callers into one unnest batch. */\n private insertQueue: Array<{\n input: InsertMemoryInput;\n resolve: (row: MemoryRow) => void;\n reject: (err: unknown) => void;\n }> = [];\n private insertFlushScheduled = false;\n private insertFlushInFlight = false;\n\n constructor(options: PostgresProviderOptions) {\n this.connectionString = options.connectionString;\n // Default 32 — concurrent writers need pool headroom beyond the old max=10.\n this.maxPoolSize = options.maxPoolSize ?? 32;\n }\n\n getPoolStats(): {\n max: number;\n total: number;\n idle: number;\n waiting: number;\n } {\n const pool = this.pool;\n return {\n max: this.maxPoolSize,\n total: pool?.totalCount ?? 0,\n idle: pool?.idleCount ?? 0,\n waiting: pool?.waitingCount ?? 0,\n };\n }\n\n async open(): Promise<void> {\n let PoolCtor: new (config: Record<string, unknown>) => PgPool;\n try {\n const mod = await import(\"pg\");\n PoolCtor =\n (mod as { Pool: typeof PoolCtor }).Pool ??\n (mod as { default: { Pool: typeof PoolCtor } }).default.Pool;\n } catch {\n throw new ConfigurationError(\n 'PostgreSQL storage requires the optional \"pg\" package. Install it with: npm install pg',\n );\n }\n\n try {\n this.pool = new PoolCtor({\n connectionString: this.connectionString,\n max: this.maxPoolSize,\n idleTimeoutMillis: 30_000,\n allowExitOnIdle: true,\n keepAlive: true,\n });\n await this.runMigrations();\n this.hasPgvector = await this.tryEnablePgvector();\n const dims = await this.getEmbeddingDimensions();\n if (dims !== null) {\n this.vectorDimensions = dims;\n await this.ensureVectorTables(dims);\n }\n } catch (error) {\n await this.pool?.end().catch(() => undefined);\n this.pool = null;\n if (error instanceof ConfigurationError || error instanceof InitializationError) {\n throw error;\n }\n throw new InitializationError(\n `Failed to open PostgreSQL database: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n async close(): Promise<void> {\n if (!this.pool) {\n return;\n }\n await this.pool.end();\n this.pool = null;\n }\n\n async ensureVectorSchema(dimensions: number): Promise<void> {\n const existing = await this.getEmbeddingDimensions();\n if (existing !== null && existing !== dimensions) {\n throw new InitializationError(\n `Embedding dimensions mismatch: database is configured for ${existing}-d vectors, but the embedding model returned ${dimensions}-d vectors.`,\n );\n }\n this.hasPgvector = await this.tryEnablePgvector();\n await this.ensureVectorTables(dimensions);\n if (existing === null) {\n await this.setEmbeddingDimensions(dimensions);\n }\n this.vectorDimensions = dimensions;\n }\n\n private async ensureVectorTables(dimensions: number): Promise<void> {\n if (this.hasPgvector) {\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_embeddings (\n memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,\n embedding vector(${dimensions})\n )\n `);\n // Do not create HNSW here — defer until first search so bulk inserts stay fast.\n // Do not DROP an existing index either (shared-DB benches would pay rebuild cost).\n const idx = await this.query(\n `SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embeddings_hnsw' LIMIT 1`,\n );\n this.hnswIndexEnsured = idx.rows.length > 0;\n } else {\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_embeddings_blob (\n memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,\n embedding BYTEA NOT NULL\n )\n `);\n }\n }\n\n /**\n * Soft reset for a single organization. Drops HNSW only when the embeddings\n * table is empty so other corpora on a shared bench DB stay intact.\n */\n async resetOrganization(organization: string): Promise<void> {\n await this.query(`DELETE FROM memories WHERE organization = $1`, [\n organization,\n ]);\n const count = await this.query(\n `SELECT COUNT(*)::int AS n FROM memory_embeddings`,\n );\n if (Number(count.rows[0]?.n ?? 0) === 0) {\n await this.query(\n `DROP INDEX IF EXISTS idx_memory_embeddings_hnsw`,\n ).catch(() => undefined);\n this.hnswIndexEnsured = false;\n }\n }\n\n /**\n * Wipe all Wolbarg tables (explicit opt-in). Prefer {@link resetOrganization}.\n */\n async wipeAllData(): Promise<void> {\n await this.query(`TRUNCATE TABLE memories CASCADE`).catch(() => undefined);\n await this.query(\n `DROP INDEX IF EXISTS idx_memory_embeddings_hnsw`,\n ).catch(() => undefined);\n this.hnswIndexEnsured = false;\n }\n\n /** Build HNSW once before the first KNN query (bulk-friendly inserts). */\n private async ensureHnswIndex(): Promise<void> {\n if (!this.hasPgvector || this.hnswIndexEnsured) {\n return;\n }\n try {\n await this.query(`\n CREATE INDEX IF NOT EXISTS idx_memory_embeddings_hnsw\n ON memory_embeddings USING hnsw (embedding vector_cosine_ops)\n WITH (m = 16, ef_construction = 64)\n `);\n this.hnswIndexEnsured = true;\n this.hnswCreateFailures = 0;\n // Prefer iterative filtered scans when the extension supports them.\n if (!this.iterativeScanEnabled) {\n try {\n await this.query(`SET hnsw.iterative_scan = relaxed_order`);\n this.iterativeScanEnabled = true;\n } catch {\n // Older pgvector — adaptive overfetch still guarantees correctness.\n }\n }\n } catch (error) {\n this.hnswCreateFailures += 1;\n if (this.hnswCreateFailures >= 3) {\n throw new DatabaseError(\n `Failed to create HNSW index after ${this.hnswCreateFailures} attempts: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n // Leave hnswIndexEnsured=false so the next search retries.\n }\n }\n\n async getEmbeddingDimensions(): Promise<number | null> {\n const result = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.embeddingDimensions],\n );\n const value = result.rows[0]?.value;\n if (typeof value !== \"string\") {\n return null;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n async setEmbeddingDimensions(dimensions: number): Promise<void> {\n await this.query(\n `INSERT INTO Wolbarg_meta (key, value) VALUES ($1, $2)\n ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,\n [META_KEYS.embeddingDimensions, String(dimensions)],\n );\n this.vectorDimensions = dimensions;\n }\n\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n this.requireVectorReady();\n\n // Non-contended path: one CTE, zero event-loop delay (production sequential insert).\n if (!this.insertFlushInFlight && this.insertQueue.length === 0) {\n this.insertFlushInFlight = true;\n try {\n return await this.insertMemoryImmediate(input);\n } finally {\n this.insertFlushInFlight = false;\n if (this.insertQueue.length > 0) {\n this.insertFlushScheduled = true;\n queueMicrotask(() => {\n void this.flushInsertQueue();\n });\n }\n }\n }\n\n // Contended path: coalesce concurrent waiters into one unnest round-trip.\n return new Promise<MemoryRow>((resolve, reject) => {\n this.insertQueue.push({ input, resolve, reject });\n if (this.insertQueue.length >= 16) {\n if (this.insertFlushScheduled) {\n this.insertFlushScheduled = false;\n }\n void this.flushInsertQueue();\n return;\n }\n if (!this.insertFlushScheduled) {\n this.insertFlushScheduled = true;\n queueMicrotask(() => {\n void this.flushInsertQueue();\n });\n }\n });\n }\n\n private async flushInsertQueue(): Promise<void> {\n if (this.insertFlushInFlight) {\n // Another writer owns the flush; it will re-check the queue on exit.\n return;\n }\n const batch = this.insertQueue;\n this.insertQueue = [];\n this.insertFlushScheduled = false;\n if (batch.length === 0) {\n return;\n }\n this.insertFlushInFlight = true;\n try {\n if (batch.length === 1) {\n const row = await this.insertMemoryImmediate(batch[0]!.input);\n batch[0]!.resolve(row);\n return;\n }\n const rows = await this.insertMemoriesBatch(batch.map((b) => b.input));\n for (let i = 0; i < batch.length; i += 1) {\n batch[i]!.resolve(rows[i]!);\n }\n } catch (error) {\n for (const item of batch) {\n item.reject(error);\n }\n } finally {\n this.insertFlushInFlight = false;\n if (this.insertQueue.length > 0) {\n this.insertFlushScheduled = true;\n queueMicrotask(() => {\n void this.flushInsertQueue();\n });\n } else {\n this.insertFlushScheduled = false;\n }\n }\n }\n\n /** Single-row insert without coalescing (used by flush + batch of 1). */\n private async insertMemoryImmediate(input: InsertMemoryInput): Promise<MemoryRow> {\n if (this.hasPgvector) {\n const inserted = await this.queryNamed(STMT.insertOne, INSERT_ONE_SQL, [\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n crypto.randomUUID(),\n toVectorLiteral(input.embedding),\n ]);\n return this.mapRow(inserted.rows[0]!);\n }\n return this.insertOneBlob(input);\n }\n\n async insertMemoriesBatch(inputs: InsertMemoryInput[]): Promise<MemoryRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n this.requireVectorReady();\n\n if (inputs.length === 1 && this.hasPgvector) {\n return [await this.insertMemoryImmediate(inputs[0]!)];\n }\n\n if (this.hasPgvector) {\n // Large batches: parallel unnest chunks use the pool as a pipeline.\n if (inputs.length >= COPY_BATCH_THRESHOLD) {\n return this.insertBatchChunked(inputs);\n }\n return this.insertBatchPgvector(inputs);\n }\n\n return this.withTransaction(async () => {\n const out: MemoryRow[] = [];\n for (const input of inputs) {\n out.push(await this.insertOneBlob(input));\n }\n return out;\n });\n }\n\n private async insertBatchPgvector(\n inputs: InsertMemoryInput[],\n ): Promise<MemoryRow[]> {\n const ids = new Array<string>(inputs.length);\n const orgs = new Array<string>(inputs.length);\n const agents = new Array<string>(inputs.length);\n const texts = new Array<string>(inputs.length);\n const metas = new Array<string>(inputs.length);\n const created = new Array<string>(inputs.length);\n const updated = new Array<string>(inputs.length);\n const histIds = new Array<string>(inputs.length);\n const vectors = new Array<string>(inputs.length);\n\n for (let i = 0; i < inputs.length; i += 1) {\n const input = inputs[i]!;\n ids[i] = input.id;\n orgs[i] = input.organization;\n agents[i] = input.agent;\n texts[i] = input.contentText;\n metas[i] = serializeMetadata(input.metadata);\n created[i] = input.createdAt;\n updated[i] = input.updatedAt;\n histIds[i] = crypto.randomUUID();\n vectors[i] = toVectorLiteral(input.embedding);\n }\n\n const inserted = await this.queryNamed(STMT.insertBatch, INSERT_BATCH_SQL, [\n ids,\n orgs,\n agents,\n texts,\n metas,\n created,\n updated,\n histIds,\n vectors,\n ]);\n\n const byId = new Map(\n inserted.rows.map((r) => [String(r.id), this.mapRow(r)]),\n );\n return ids.map((id) => byId.get(id)!);\n }\n\n /** Split large ingest batches into parallel unnest chunks (pool pipelining). */\n private async insertBatchChunked(\n inputs: InsertMemoryInput[],\n ): Promise<MemoryRow[]> {\n const chunkSize = 128;\n if (inputs.length <= chunkSize) {\n return this.insertBatchPgvector(inputs);\n }\n const chunks: InsertMemoryInput[][] = [];\n for (let i = 0; i < inputs.length; i += chunkSize) {\n chunks.push(inputs.slice(i, i + chunkSize));\n }\n const results = await Promise.all(\n chunks.map((chunk) => this.insertBatchPgvector(chunk)),\n );\n const out: MemoryRow[] = new Array(inputs.length);\n let offset = 0;\n for (const part of results) {\n for (let i = 0; i < part.length; i += 1) {\n out[offset + i] = part[i]!;\n }\n offset += part.length;\n }\n return out;\n }\n\n private async insertOneBlob(input: InsertMemoryInput): Promise<MemoryRow> {\n const buf = Buffer.from(\n input.embedding.buffer,\n input.embedding.byteOffset,\n input.embedding.byteLength,\n );\n const inserted = await this.query(\n `INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at`,\n [\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n ],\n );\n const row = this.mapRow(inserted.rows[0]!);\n await this.query(\n `WITH mapped AS (\n INSERT INTO memory_row_map (memory_id) VALUES ($1)\n ON CONFLICT (memory_id) DO NOTHING\n )\n INSERT INTO memory_embeddings_blob (memory_id, embedding)\n VALUES ($1, $2)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding`,\n [input.id, buf],\n );\n await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ($1,$2,'created',NULL,$3)`,\n [crypto.randomUUID(), input.id, input.createdAt],\n );\n return row;\n }\n\n async updateMemory(input: UpdateMemoryInput): Promise<MemoryRow | null> {\n const existing = await this.getMemoryById(input.id, input.organization);\n if (!existing) {\n return null;\n }\n await this.query(\n `UPDATE memories SET\n content_text = COALESCE($1, content_text),\n metadata_json = COALESCE($2::jsonb, metadata_json),\n updated_at = $3\n WHERE id = $4 AND organization = $5`,\n [\n input.contentText ?? null,\n input.metadata !== undefined ? serializeMetadata(input.metadata) : null,\n input.updatedAt,\n input.id,\n input.organization,\n ],\n );\n if (input.embedding) {\n await this.deleteEmbedding(input.id);\n await this.insertEmbedding(input.id, input.embedding);\n }\n return this.getMemoryById(input.id, input.organization);\n }\n\n async getMemoryById(id: string, organization: string): Promise<MemoryRow | null> {\n const result = await this.query(\n `SELECT id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n FROM memories WHERE id = $1 AND organization = $2`,\n [id, organization],\n );\n const row = result.rows[0];\n return row ? this.mapRow(row) : null;\n }\n\n async getMemoryByRowid(rowid: number, organization: string): Promise<MemoryRow | null> {\n const result = await this.query(\n `SELECT m.id, m.organization, m.agent, m.content_text, m.metadata_json,\n m.archived::int AS archived, m.compressed_into, m.created_at, m.updated_at,\n e.row_num AS rowid\n FROM memories m\n JOIN memory_row_map e ON e.memory_id = m.id\n WHERE e.row_num = $1 AND m.organization = $2`,\n [rowid, organization],\n );\n const row = result.rows[0];\n return row ? this.mapRow(row) : null;\n }\n\n async getMemoriesByRowids(\n rowids: number[],\n organization: string,\n ): Promise<Map<number, MemoryRow>> {\n const out = new Map<number, MemoryRow>();\n if (rowids.length === 0) {\n return out;\n }\n const result = await this.query(\n `SELECT m.id, m.organization, m.agent, m.content_text, m.metadata_json,\n m.archived::int AS archived, m.compressed_into, m.created_at, m.updated_at,\n e.row_num AS rowid\n FROM memories m\n JOIN memory_row_map e ON e.memory_id = m.id\n WHERE m.organization = $1 AND e.row_num = ANY($2::bigint[])`,\n [organization, rowids],\n );\n for (const row of result.rows) {\n const mapped = this.mapRow(row);\n if (mapped.rowid !== undefined) {\n out.set(mapped.rowid, mapped);\n }\n }\n return out;\n }\n\n async listMemories(filter: RepositoryFilter, limit?: number): Promise<MemoryRow[]> {\n const clauses = [`organization = $1`];\n const params: unknown[] = [filter.organization];\n let idx = 2;\n if (filter.agent) {\n clauses.push(`agent = $${idx++}`);\n params.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = false`);\n }\n let sql = `\n SELECT id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n `;\n if (limit !== undefined && !filter.metadata) {\n sql += ` LIMIT $${idx}`;\n params.push(limit);\n }\n const result = await this.query(sql, params);\n let rows = result.rows.map((r) => this.mapRow(r));\n if (filter.metadata) {\n rows = rows.filter((row) =>\n matchesMetadata(deserializeMetadata(row.metadata_json), filter.metadata!),\n );\n if (limit !== undefined) {\n rows = rows.slice(0, limit);\n }\n }\n return rows;\n }\n\n async searchByMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n return this.listMemories(filter, limit);\n }\n\n async searchKeyword(\n query: string,\n organization: string,\n topK: number,\n ): Promise<Array<{ memoryId: string; score: number }>> {\n const trimmed = query.trim();\n if (!trimmed || topK <= 0) {\n return [];\n }\n try {\n const sql = this.hasContentTsv\n ? `SELECT id AS memory_id,\n ts_rank(content_tsv, plainto_tsquery('english', $1)) AS rank\n FROM memories\n WHERE organization = $2\n AND archived = false\n AND content_tsv @@ plainto_tsquery('english', $1)\n ORDER BY rank DESC\n LIMIT $3`\n : `SELECT id AS memory_id,\n ts_rank(to_tsvector('english', content_text), plainto_tsquery('english', $1)) AS rank\n FROM memories\n WHERE organization = $2\n AND archived = false\n AND to_tsvector('english', content_text) @@ plainto_tsquery('english', $1)\n ORDER BY rank DESC\n LIMIT $3`;\n const result = await this.query(sql, [trimmed, organization, topK]);\n return result.rows.map((row) => ({\n memoryId: String(row.memory_id),\n score: Number(row.rank),\n }));\n } catch {\n return [];\n }\n }\n\n async searchVectors(\n embedding: Float32Array,\n topK: number,\n ): Promise<VectorSearchHit[]> {\n this.requireVectorReady();\n if (this.hasPgvector) {\n await this.ensureHnswIndex();\n const result = await this.query(\n `SELECT r.row_num AS memory_rowid, ann.distance\n FROM (\n SELECT e.memory_id, (e.embedding <=> $1::vector) AS distance\n FROM memory_embeddings e\n ORDER BY e.embedding <=> $1::vector\n LIMIT $2\n ) ann\n JOIN memory_row_map r ON r.memory_id = ann.memory_id\n ORDER BY ann.distance`,\n [toVectorLiteral(embedding), topK],\n );\n const hits: VectorSearchHit[] = new Array(result.rows.length);\n for (let i = 0; i < result.rows.length; i += 1) {\n const row = result.rows[i]!;\n hits[i] = {\n memoryRowid: Number(row.memory_rowid),\n distance: Number(row.distance),\n };\n }\n return hits;\n }\n\n const result = await this.query(\n `SELECT r.row_num AS memory_rowid, e.embedding\n FROM memory_embeddings_blob e\n JOIN memory_row_map r ON r.memory_id = e.memory_id`,\n );\n const scored = result.rows.map((row) => {\n const buf = row.embedding as Buffer;\n const vec = new Float32Array(\n buf.buffer,\n buf.byteOffset,\n buf.byteLength / Float32Array.BYTES_PER_ELEMENT,\n );\n return {\n memoryRowid: Number(row.memory_rowid),\n distance: cosineDistance(embedding, vec),\n };\n });\n scored.sort((a, b) => a.distance - b.distance);\n return scored.slice(0, topK);\n }\n\n async searchVectorsWithMemories(\n embedding: Float32Array,\n topK: number,\n organization: string,\n options?: { agent?: string; includeArchived?: boolean },\n ): Promise<Array<{ row: MemoryRow; distance: number }>> {\n this.requireVectorReady();\n if (!this.hasPgvector) {\n const hits = await this.searchVectors(embedding, topK);\n const map = await this.getMemoriesByRowids(\n hits.map((h) => h.memoryRowid),\n organization,\n );\n const out: Array<{ row: MemoryRow; distance: number }> = [];\n for (const hit of hits) {\n const row = map.get(hit.memoryRowid);\n if (!row) continue;\n if (options?.agent && row.agent !== options.agent) continue;\n if (!options?.includeArchived && row.archived === 1) continue;\n out.push({ row, distance: hit.distance });\n }\n return out;\n }\n\n await this.ensureHnswIndex();\n const vec = toVectorLiteral(embedding);\n\n const mapHits = (\n rows: Record<string, unknown>[],\n ): Array<{ row: MemoryRow; distance: number }> =>\n rows.map((row) => ({\n row: this.mapRow(row),\n distance: Number(row.distance),\n }));\n\n // Subquery-first ANN keeps HNSW eligible. Start with a modest overfetch so\n // shared/multi-tenant corpora still fill topK after org post-filter without\n // many round-trips. Expand only when still under-filled.\n let overfetch = Math.min(Math.max(topK * 8, topK), 512);\n const maxFetch = Math.min(Math.max(topK * 64, 512), 8192);\n for (;;) {\n const agentClause = options?.agent ? \"AND m.agent = $5\" : \"\";\n const archivedClause = options?.includeArchived ? \"\" : \"AND m.archived = false\";\n const params = options?.agent\n ? [vec, overfetch, organization, topK, options.agent]\n : [vec, overfetch, organization, topK];\n const ann = await this.query(\n `WITH ann AS (\n SELECT e.memory_id, (e.embedding <=> $1::vector) AS distance\n FROM memory_embeddings e\n ORDER BY e.embedding <=> $1::vector\n LIMIT $2\n )\n SELECT m.id, m.organization, m.agent, m.content_text, m.metadata_json,\n m.archived::int AS archived, m.compressed_into, m.created_at, m.updated_at,\n r.row_num AS rowid,\n ann.distance,\n (SELECT COUNT(*)::int FROM ann) AS ann_fetched\n FROM ann\n JOIN memory_row_map r ON r.memory_id = ann.memory_id\n JOIN memories m ON m.id = ann.memory_id\n WHERE m.organization = $3\n ${agentClause}\n ${archivedClause}\n ORDER BY ann.distance\n LIMIT $4`,\n params,\n );\n\n const annFetched = Number(ann.rows[0]?.ann_fetched ?? ann.rows.length);\n if (\n ann.rows.length >= topK ||\n annFetched < overfetch ||\n overfetch >= maxFetch\n ) {\n return mapHits(ann.rows.slice(0, topK));\n }\n const next = Math.min(overfetch * 4, maxFetch);\n if (next === overfetch) {\n return mapHits(ann.rows.slice(0, topK));\n }\n overfetch = next;\n }\n }\n\n async archiveMemories(\n ids: string[],\n organization: string,\n compressedIntoId: string,\n archivedAt: string,\n ): Promise<string[]> {\n if (ids.length === 0) {\n return [];\n }\n const result = await this.query(\n `UPDATE memories\n SET archived = true, compressed_into = $1, updated_at = $2\n WHERE organization = $3 AND archived = false AND id = ANY($4::text[])\n RETURNING id`,\n [compressedIntoId, archivedAt, organization, ids],\n );\n const archived = result.rows.map((r) => String(r.id));\n if (archived.length === 0) {\n return [];\n }\n const histIds: string[] = [];\n const memIds: string[] = [];\n const types: string[] = [];\n const related: string[] = [];\n const times: string[] = [];\n for (const id of archived) {\n histIds.push(crypto.randomUUID(), crypto.randomUUID());\n memIds.push(id, compressedIntoId);\n types.push(\"archived\", \"compressed\");\n related.push(compressedIntoId, id);\n times.push(archivedAt, archivedAt);\n }\n await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT * FROM unnest($1::text[], $2::text[], $3::text[], $4::text[], $5::timestamptz[])`,\n [histIds, memIds, types, related, times],\n );\n return archived;\n }\n\n async deleteMemoryById(id: string, organization: string): Promise<boolean> {\n const result = await this.query(\n `DELETE FROM memories WHERE id = $1 AND organization = $2`,\n [id, organization],\n );\n return (result.rowCount ?? 0) > 0;\n }\n\n async deleteMemoriesByFilter(filter: RepositoryFilter): Promise<number> {\n if (!filter.agent) {\n throw new DatabaseError(\"deleteMemoriesByFilter requires an agent filter\");\n }\n const result = await this.query(\n `DELETE FROM memories WHERE organization = $1 AND agent = $2`,\n [filter.organization, filter.agent],\n );\n return result.rowCount ?? 0;\n }\n\n async clearOrganization(organization: string): Promise<number> {\n const result = await this.query(\n `DELETE FROM memories WHERE organization = $1`,\n [organization],\n );\n return result.rowCount ?? 0;\n }\n\n async getHistory(memoryId: string): Promise<HistoryRow[]> {\n const result = await this.query(\n `SELECT id, memory_id, event_type, related_memory_id, created_at\n FROM memory_history WHERE memory_id = $1 ORDER BY created_at ASC`,\n [memoryId],\n );\n return result.rows.map((row) => ({\n id: String(row.id),\n memory_id: String(row.memory_id),\n event_type: row.event_type as HistoryRow[\"event_type\"],\n related_memory_id:\n row.related_memory_id === null ? null : String(row.related_memory_id),\n created_at: String(row.created_at),\n }));\n }\n\n async insertHistoryEvent(event: HistoryRow): Promise<void> {\n await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ($1,$2,$3,$4,$5)`,\n [\n event.id,\n event.memory_id,\n event.event_type,\n event.related_memory_id,\n event.created_at,\n ],\n );\n }\n\n async getStats(\n organization: string,\n ): Promise<{\n totalMemories: number;\n activeMemories: number;\n archivedMemories: number;\n totalAgents: number;\n }> {\n const result = await this.query(\n `SELECT\n COUNT(*)::int AS memories,\n COUNT(*) FILTER (WHERE archived = false)::int AS active,\n COUNT(*) FILTER (WHERE archived = true)::int AS archived,\n COUNT(DISTINCT agent) FILTER (WHERE archived = false)::int AS agents\n FROM memories WHERE organization = $1`,\n [organization],\n );\n return {\n totalMemories: Number(result.rows[0]?.memories ?? 0),\n activeMemories: Number(result.rows[0]?.active ?? 0),\n archivedMemories: Number(result.rows[0]?.archived ?? 0),\n totalAgents: Number(result.rows[0]?.agents ?? 0),\n };\n }\n\n async getDatabaseSizeBytes(): Promise<number> {\n const result = await this.query(\n `SELECT pg_database_size(current_database())::bigint AS size`,\n );\n return Number(result.rows[0]?.size ?? 0);\n }\n\n async withTransaction<T>(fn: () => T | Promise<T>): Promise<T> {\n const existing = txStore.getStore();\n if (existing) {\n return fn();\n }\n const client = await this.requirePool().connect();\n try {\n await client.query(\"BEGIN\");\n const result = await txStore.run(client, fn);\n await client.query(\"COMMIT\");\n return result;\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => undefined);\n if (error instanceof DatabaseError || error instanceof InitializationError) {\n throw error;\n }\n throw new DatabaseError(`Transaction failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n } finally {\n client.release();\n }\n }\n\n private async runMigrations(): Promise<void> {\n // Split DDL: node-pg rejects multi-command prepared statements on some paths.\n await this.query(`\n CREATE TABLE IF NOT EXISTS Wolbarg_meta (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n )\n `);\n await this.query(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY NOT NULL,\n organization TEXT NOT NULL,\n agent TEXT NOT NULL,\n content_text TEXT NOT NULL,\n metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb,\n archived BOOLEAN NOT NULL DEFAULT false,\n compressed_into TEXT NULL REFERENCES memories(id) ON DELETE SET NULL,\n created_at TIMESTAMPTZ NOT NULL,\n updated_at TIMESTAMPTZ NOT NULL\n )\n `);\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_history (\n id TEXT PRIMARY KEY NOT NULL,\n memory_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n event_type TEXT NOT NULL CHECK (event_type IN ('created', 'archived', 'compressed')),\n related_memory_id TEXT NULL,\n created_at TIMESTAMPTZ NOT NULL\n )\n `);\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_row_map (\n memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,\n row_num BIGSERIAL UNIQUE NOT NULL\n )\n `);\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_org_agent ON memories(organization, agent)`,\n );\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_org_archived ON memories(organization, archived)`,\n );\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_org_active_created\n ON memories(organization, created_at) WHERE archived = false`,\n ).catch(() => undefined);\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_metadata ON memories USING GIN (metadata_json)`,\n );\n\n // Stored tsvector column — keyword/hybrid avoid re-computing to_tsvector.\n try {\n await this.query(`\n ALTER TABLE memories\n ADD COLUMN IF NOT EXISTS content_tsv tsvector\n GENERATED ALWAYS AS (to_tsvector('english', content_text)) STORED\n `);\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_content_tsv ON memories USING GIN (content_tsv)`,\n );\n this.hasContentTsv = true;\n } catch {\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_fts\n ON memories USING GIN (to_tsvector('english', content_text))`,\n ).catch(() => undefined);\n this.hasContentTsv = false;\n }\n\n const versionRow = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.schemaVersion],\n );\n if (!versionRow.rows[0]) {\n await this.query(\n `INSERT INTO Wolbarg_meta (key, value) VALUES ($1, $2)`,\n [META_KEYS.schemaVersion, String(SCHEMA_VERSION)],\n );\n }\n }\n\n private async tryEnablePgvector(): Promise<boolean> {\n try {\n await this.query(`CREATE EXTENSION IF NOT EXISTS vector`);\n return true;\n } catch {\n return false;\n }\n }\n\n private async insertEmbedding(memoryId: string, embedding: Float32Array): Promise<void> {\n if (this.hasPgvector) {\n await this.query(\n `WITH mapped AS (\n INSERT INTO memory_row_map (memory_id) VALUES ($1)\n ON CONFLICT (memory_id) DO NOTHING\n )\n INSERT INTO memory_embeddings (memory_id, embedding)\n VALUES ($1, $2::vector)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding`,\n [memoryId, toVectorLiteral(embedding)],\n );\n return;\n }\n const buf = Buffer.from(\n embedding.buffer,\n embedding.byteOffset,\n embedding.byteLength,\n );\n await this.query(\n `WITH mapped AS (\n INSERT INTO memory_row_map (memory_id) VALUES ($1)\n ON CONFLICT (memory_id) DO NOTHING\n )\n INSERT INTO memory_embeddings_blob (memory_id, embedding)\n VALUES ($1, $2)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding`,\n [memoryId, buf],\n );\n }\n\n private async deleteEmbedding(memoryId: string): Promise<void> {\n await this.query(`DELETE FROM memory_embeddings WHERE memory_id = $1`, [memoryId]).catch(() => undefined);\n await this.query(`DELETE FROM memory_embeddings_blob WHERE memory_id = $1`, [memoryId]).catch(() => undefined);\n }\n\n private async query(\n text: string,\n params?: unknown[],\n ): Promise<PgQueryResult> {\n const tx = txStore.getStore();\n const target: PgQueryable = tx ?? this.requirePool();\n return target.query(text, params);\n }\n\n /** Named prepared statement — parse/plan cached per pool connection. */\n private async queryNamed(\n name: string,\n text: string,\n params: unknown[],\n ): Promise<PgQueryResult> {\n const tx = txStore.getStore();\n const target: PgQueryable = tx ?? this.requirePool();\n return target.query({ name, text, values: params });\n }\n\n private mapRow(row: Record<string, unknown>): MemoryRow {\n const meta = row.metadata_json;\n let metadata_json: string;\n if (typeof meta === \"string\") {\n metadata_json = meta;\n } else if (meta && typeof meta === \"object\") {\n metadata_json = JSON.stringify(meta);\n } else {\n metadata_json = \"{}\";\n }\n\n const created =\n row.created_at instanceof Date\n ? row.created_at.toISOString()\n : String(row.created_at);\n const updated =\n row.updated_at instanceof Date\n ? row.updated_at.toISOString()\n : String(row.updated_at);\n\n return {\n id: String(row.id),\n organization: String(row.organization),\n agent: String(row.agent),\n content_text: String(row.content_text),\n metadata_json,\n archived: Number(row.archived ?? 0),\n compressed_into:\n row.compressed_into === null || row.compressed_into === undefined\n ? null\n : String(row.compressed_into),\n created_at: created,\n updated_at: updated,\n rowid: row.rowid !== undefined ? Number(row.rowid) : undefined,\n };\n }\n\n private requirePool(): PgPool {\n if (!this.pool) {\n throw new DatabaseError(\"Database is not open. Call open() first.\");\n }\n return this.pool;\n }\n\n private requireVectorReady(): void {\n if (this.vectorDimensions === null) {\n throw new DatabaseError(\n \"Vector index is not ready. Embedding dimensions have not been initialized.\",\n );\n }\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n const aggregate = error as Error & { errors?: unknown[] };\n if (Array.isArray(aggregate.errors) && aggregate.errors.length > 0) {\n const nested = aggregate.errors\n .map((item) => (item instanceof Error ? item.message : String(item)))\n .join(\"; \");\n return `${error.message || error.name}: ${nested}`;\n }\n return error.message || error.name;\n }\n return String(error);\n }\n}\n","/**\n * Storage provider factory and re-exports.\n */\n\nimport type { DatabaseConfig, StorageConfig } from \"../types/index.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport type { StorageProvider } from \"./types.js\";\nimport { SqliteStorageProvider } from \"./providers/sqlite.js\";\nimport { PostgresStorageProvider } from \"./providers/postgres.js\";\n\nexport function createStorageProvider(\n config: StorageConfig | DatabaseConfig,\n): StorageProvider {\n if (config.provider === \"sqlite\") {\n return new SqliteStorageProvider({\n connectionString: config.connectionString,\n });\n }\n\n if (config.provider === \"postgres\") {\n return new PostgresStorageProvider({\n connectionString: config.connectionString,\n maxPoolSize: config.maxPoolSize,\n });\n }\n\n throw new ConfigurationError(\n `Unsupported storage provider: ${String((config as { provider: string }).provider)}`,\n );\n}\n\n/** @deprecated Prefer {@link createStorageProvider}. */\nexport function createDatabaseProvider(\n config: DatabaseConfig,\n): StorageProvider {\n return createStorageProvider(config);\n}\n\nexport type {\n StorageProvider,\n DatabaseProvider,\n MemoryRow,\n HistoryRow,\n InsertMemoryInput,\n UpdateMemoryInput,\n RepositoryFilter,\n VectorSearchHit,\n} from \"./types.js\";\nexport {\n SqliteStorageProvider,\n SqliteDatabaseProvider,\n} from \"./providers/sqlite.js\";\nexport { PostgresStorageProvider } from \"./providers/postgres.js\";\n","/**\n * Memory domain helpers — mapping rows to public records.\n */\n\nimport type { HistoryEvent, MemoryRecord, RecallResult } from \"../types/index.js\";\nimport type { HistoryRow, MemoryRow } from \"../storage/types.js\";\nimport { deserializeMetadata, parseIso } from \"../utils/index.js\";\n\nexport function toMemoryRecord(row: MemoryRow): MemoryRecord {\n return {\n id: row.id,\n organization: row.organization,\n agent: row.agent,\n content: { text: row.content_text },\n metadata: deserializeMetadata(row.metadata_json),\n archived: row.archived === 1,\n compressedInto: row.compressed_into,\n createdAt: parseIso(row.created_at),\n updatedAt: parseIso(row.updated_at),\n };\n}\n\nexport function toRecallResult(row: MemoryRow, similarity: number): RecallResult {\n return {\n id: row.id,\n organization: row.organization,\n agent: row.agent,\n content: { text: row.content_text },\n metadata: deserializeMetadata(row.metadata_json),\n archived: row.archived === 1,\n similarity,\n createdAt: parseIso(row.created_at),\n updatedAt: parseIso(row.updated_at),\n };\n}\n\nexport function toHistoryEvent(row: HistoryRow): HistoryEvent {\n return {\n id: row.id,\n memoryId: row.memory_id,\n eventType: row.event_type,\n relatedMemoryId: row.related_memory_id,\n createdAt: parseIso(row.created_at),\n };\n}\n","/**\n * Retrieval pipeline — fusion, MMR, adaptive candidate selection.\n */\n\nimport type { HybridConfig, MmrConfig, RecallResult } from \"../types/index.js\";\n\nexport interface ScoredCandidate {\n id: string;\n semanticScore: number;\n keywordScore: number;\n fusedScore: number;\n result: RecallResult;\n}\n\nexport function fuseScores(\n semantic: Map<string, number>,\n keyword: Map<string, number>,\n weights: Required<HybridConfig>,\n): Map<string, number> {\n const ids = new Set([...semantic.keys(), ...keyword.keys()]);\n const fused = new Map<string, number>();\n const semMax = Math.max(...semantic.values(), 1e-9);\n const kwMax = Math.max(...keyword.values(), 1e-9);\n\n for (const id of ids) {\n const s = (semantic.get(id) ?? 0) / semMax;\n const k = (keyword.get(id) ?? 0) / kwMax;\n fused.set(\n id,\n weights.semanticWeight * s + weights.keywordWeight * k,\n );\n }\n return fused;\n}\n\nexport function resolveHybridWeights(\n hybrid: boolean | HybridConfig | undefined,\n): Required<HybridConfig> | null {\n if (hybrid === false || hybrid === undefined) {\n return null;\n }\n if (hybrid === true) {\n return { semanticWeight: 0.7, keywordWeight: 0.3 };\n }\n return {\n semanticWeight: hybrid.semanticWeight ?? 0.7,\n keywordWeight: hybrid.keywordWeight ?? 0.3,\n };\n}\n\nexport function resolveMmr(\n mmr: boolean | MmrConfig | undefined,\n): number | null {\n if (mmr === false || mmr === undefined) {\n return null;\n }\n if (mmr === true) {\n return 0.5;\n }\n return mmr.lambda ?? 0.5;\n}\n\n/**\n * Maximal Marginal Relevance diversification.\n * Uses character Jaccard as a cheap token-overlap proxy for embedding similarity.\n */\nexport function applyMmr(\n candidates: RecallResult[],\n topK: number,\n lambda: number,\n): RecallResult[] {\n if (candidates.length <= topK) {\n return candidates;\n }\n\n const selected: RecallResult[] = [];\n const remaining = [...candidates];\n\n while (selected.length < topK && remaining.length > 0) {\n let bestIdx = 0;\n let bestScore = -Infinity;\n\n for (let i = 0; i < remaining.length; i += 1) {\n const candidate = remaining[i]!;\n const relevance = candidate.similarity;\n let maxSim = 0;\n for (const chosen of selected) {\n maxSim = Math.max(\n maxSim,\n jaccard(candidate.content.text, chosen.content.text),\n );\n }\n const score = lambda * relevance - (1 - lambda) * maxSim;\n if (score > bestScore) {\n bestScore = score;\n bestIdx = i;\n }\n }\n\n selected.push(remaining[bestIdx]!);\n remaining.splice(bestIdx, 1);\n }\n\n return selected;\n}\n\nfunction jaccard(a: string, b: string): number {\n const ta = new Set(a.toLowerCase().split(/\\s+/).filter(Boolean));\n const tb = new Set(b.toLowerCase().split(/\\s+/).filter(Boolean));\n if (ta.size === 0 && tb.size === 0) {\n return 1;\n }\n let inter = 0;\n for (const t of ta) {\n if (tb.has(t)) {\n inter += 1;\n }\n }\n const union = ta.size + tb.size - inter;\n return union === 0 ? 0 : inter / union;\n}\n\nexport function adaptiveFetchK(\n topK: number,\n overFetchFactor: number,\n hasFilters: boolean,\n): number {\n const factor = hasFilters ? Math.max(overFetchFactor, 4) : overFetchFactor;\n return Math.min(Math.max(Math.ceil(topK * factor), topK), 1000);\n}\n","/**\n * Constructor options for Wolbarg v0.2.\n */\n\nimport type { ChunkingStrategy } from \"../chunking/index.js\";\nimport type { CompressionProvider } from \"../compression/index.js\";\nimport type { EmbeddingProvider } from \"../embedding/index.js\";\nimport type { KeywordSearchProvider } from \"../keyword/index.js\";\nimport type { LlmProvider } from \"../llm/index.js\";\nimport type { OCRProvider } from \"../ocr/index.js\";\nimport type { RerankerProvider } from \"../rerank/index.js\";\nimport type { StorageProvider } from \"../storage/types.js\";\nimport type {\n EmbeddingConfig,\n LlmConfig,\n RetrievalConfig,\n StorageConfig,\n} from \"../types/index.js\";\nimport type { VisionProvider } from \"../vision/index.js\";\n\nexport type EmbeddingInput = EmbeddingProvider | EmbeddingConfig;\nexport type LlmInput = LlmProvider | LlmConfig;\nexport type StorageInput = StorageProvider | StorageConfig;\n\nexport interface WolbargOptionsBase {\n /** Organization namespace isolating memories within a shared database. */\n organization: string;\n /** Storage provider instance or config. */\n storage: StorageInput;\n /** Embedding provider instance or config. */\n embedding: EmbeddingInput;\n /** Optional reranker — skipped when absent. */\n reranker?: RerankerProvider;\n /** Optional keyword search — enables hybrid recall when present. */\n keywordSearch?: KeywordSearchProvider;\n /** Optional OCR for image ingest. */\n ocr?: OCRProvider;\n /** Optional vision model for image captions. */\n vision?: VisionProvider;\n /** Optional compression provider (overrides llm-backed default). */\n compression?: CompressionProvider;\n /** Optional default chunking strategy for ingest. */\n chunking?: ChunkingStrategy;\n /** Optional retrieval defaults. */\n retrieval?: RetrievalConfig;\n}\n\nexport interface WolbargOptionsWithoutLlm extends WolbargOptionsBase {\n llm?: undefined;\n}\n\nexport interface WolbargOptionsWithLlm extends WolbargOptionsBase {\n /** Chat model used for compression. */\n llm: LlmInput;\n}\n\nexport type WolbargOptions =\n | WolbargOptionsWithoutLlm\n | WolbargOptionsWithLlm;\n\nexport function isEmbeddingProvider(\n value: EmbeddingInput,\n): value is EmbeddingProvider {\n return typeof (value as EmbeddingProvider).embed === \"function\";\n}\n\nexport function isLlmProvider(value: LlmInput): value is LlmProvider {\n return typeof (value as LlmProvider).complete === \"function\";\n}\n\nexport function isStorageProvider(\n value: StorageInput,\n): value is StorageProvider {\n return typeof (value as StorageProvider).open === \"function\";\n}\n","/**\n * Configuration validation for SDK initialization and constructor options.\n */\n\nimport type { WolbargOptions } from \"./options.js\";\nimport type { EmbeddingConfig, InitOptions, LlmConfig } from \"../types/index.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport { isEmbeddingProvider, isLlmProvider, isStorageProvider } from \"./options.js\";\n\nfunction assertNonEmpty(value: unknown, fieldName: string): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new ConfigurationError(`${fieldName} must be a non-empty string`);\n }\n}\n\nfunction assertUrl(value: string, fieldName: string): void {\n assertNonEmpty(value, fieldName);\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n } catch {\n throw new ConfigurationError(\n `${fieldName} must be a valid absolute URL (got \"${value}\")`,\n );\n }\n}\n\nexport function validateEmbeddingConfig(config: EmbeddingConfig): EmbeddingConfig {\n assertUrl(config.baseUrl, \"embedding.baseUrl\");\n assertNonEmpty(config.apiKey, \"embedding.apiKey\");\n assertNonEmpty(config.model, \"embedding.model\");\n if (\n config.timeoutMs !== undefined &&\n (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)\n ) {\n throw new ConfigurationError(\"embedding.timeoutMs must be a positive number\");\n }\n return {\n baseUrl: config.baseUrl.trim().replace(/\\/+$/, \"\"),\n apiKey: config.apiKey,\n model: config.model.trim(),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n };\n}\n\nexport function validateLlmConfig(config: LlmConfig): LlmConfig {\n assertUrl(config.baseUrl, \"llm.baseUrl\");\n assertNonEmpty(config.apiKey, \"llm.apiKey\");\n assertNonEmpty(config.model, \"llm.model\");\n if (\n config.temperature !== undefined &&\n (!Number.isFinite(config.temperature) ||\n config.temperature < 0 ||\n config.temperature > 2)\n ) {\n throw new ConfigurationError(\"llm.temperature must be between 0 and 2\");\n }\n if (\n config.maxTokens !== undefined &&\n (!Number.isFinite(config.maxTokens) || config.maxTokens <= 0)\n ) {\n throw new ConfigurationError(\"llm.maxTokens must be a positive number\");\n }\n if (\n config.timeoutMs !== undefined &&\n (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)\n ) {\n throw new ConfigurationError(\"llm.timeoutMs must be a positive number\");\n }\n return {\n baseUrl: config.baseUrl.trim().replace(/\\/+$/, \"\"),\n apiKey: config.apiKey,\n model: config.model.trim(),\n ...(config.temperature !== undefined ? { temperature: config.temperature } : {}),\n ...(config.maxTokens !== undefined ? { maxTokens: config.maxTokens } : {}),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n };\n}\n\n/**\n * Validate and normalize init options (v0.1 compat).\n * LLM is optional in v0.2.\n */\nexport function validateInitOptions(options: InitOptions): InitOptions {\n if (options === null || typeof options !== \"object\") {\n throw new ConfigurationError(\"init options must be an object\");\n }\n\n assertNonEmpty(options.organization, \"organization\");\n\n if (!options.database || typeof options.database !== \"object\") {\n throw new ConfigurationError(\"database configuration is required\");\n }\n\n const provider = options.database.provider;\n if (provider !== \"sqlite\" && provider !== \"postgres\") {\n throw new ConfigurationError(\n `Unsupported database provider \"${String((options.database as { provider?: string }).provider)}\". Supported: \"sqlite\", \"postgres\".`,\n );\n }\n\n assertNonEmpty(\n options.database.connectionString,\n \"database.connectionString\",\n );\n\n if (!options.embedding || typeof options.embedding !== \"object\") {\n throw new ConfigurationError(\"embedding configuration is required\");\n }\n\n const embedding = validateEmbeddingConfig(options.embedding);\n const llm = options.llm ? validateLlmConfig(options.llm) : undefined;\n\n return {\n organization: options.organization.trim(),\n database:\n provider === \"postgres\"\n ? {\n provider: \"postgres\",\n connectionString: options.database.connectionString.trim(),\n ...(\"maxPoolSize\" in options.database &&\n options.database.maxPoolSize !== undefined\n ? { maxPoolSize: options.database.maxPoolSize }\n : {}),\n }\n : {\n provider: \"sqlite\",\n connectionString: options.database.connectionString.trim(),\n },\n embedding,\n ...(llm ? { llm } : {}),\n };\n}\n\nexport function validateWolbargOptions(options: WolbargOptions): WolbargOptions {\n if (options === null || typeof options !== \"object\") {\n throw new ConfigurationError(\"Wolbarg options must be an object\");\n }\n assertNonEmpty(options.organization, \"organization\");\n\n if (!options.storage) {\n throw new ConfigurationError(\"storage is required\");\n }\n if (!isStorageProvider(options.storage)) {\n if (\n typeof options.storage !== \"object\" ||\n !(\"provider\" in options.storage) ||\n !(\"connectionString\" in options.storage)\n ) {\n throw new ConfigurationError(\"storage must be a provider instance or config\");\n }\n assertNonEmpty(options.storage.connectionString, \"storage.connectionString\");\n }\n\n if (!options.embedding) {\n throw new ConfigurationError(\"embedding is required\");\n }\n if (!isEmbeddingProvider(options.embedding)) {\n validateEmbeddingConfig(options.embedding);\n }\n\n if (options.llm !== undefined && !isLlmProvider(options.llm)) {\n validateLlmConfig(options.llm);\n }\n\n return {\n ...options,\n organization: options.organization.trim(),\n };\n}\n","/**\n * Wolbarg — modular semantic memory SDK for AI agents (v0.2).\n *\n * @example\n * ```ts\n * import { Wolbarg, sqlite, openaiEmbedding, openaiLlm } from \"wolbarg\";\n *\n * const ctx = new Wolbarg({\n * organization: \"my-org\",\n * storage: sqlite(\"./memory.db\"),\n * embedding: openaiEmbedding({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"text-embedding-3-small\",\n * }),\n * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4.1-mini\",\n * }),\n * });\n *\n * await ctx.ready();\n * await ctx.remember({ agent: \"research\", content: { text: \"…\" } });\n * const hits = await ctx.recall({ query: \"…\", topK: 5 });\n * ```\n */\n\nimport {\n createCompressionProvider,\n type CompressionProvider,\n} from \"../compression/index.js\";\nimport {\n createChunkingStrategy,\n inferChunkingStrategy,\n type ChunkingStrategy,\n} from \"../chunking/index.js\";\nimport {\n createEmbeddingProvider,\n embedMany,\n type EmbeddingProvider,\n} from \"../embedding/index.js\";\nimport { createLlmProvider, type LlmProvider } from \"../llm/index.js\";\nimport {\n loadIngestSource,\n resolveParser,\n} from \"../ingest/index.js\";\nimport type { KeywordSearchProvider } from \"../keyword/index.js\";\nimport type { OCRProvider } from \"../ocr/index.js\";\nimport type { RerankerProvider } from \"../rerank/index.js\";\nimport type { VisionProvider } from \"../vision/index.js\";\nimport { createStorageProvider } from \"../storage/index.js\";\nimport type { StorageProvider } from \"../storage/types.js\";\nimport type { MemoryRow } from \"../storage/types.js\";\nimport { matchesMetadata } from \"../filters/match.js\";\nimport {\n toHistoryEvent,\n toMemoryRecord,\n toRecallResult,\n} from \"../memory/index.js\";\nimport {\n adaptiveFetchK,\n applyMmr,\n fuseScores,\n resolveHybridWeights,\n resolveMmr,\n} from \"../retrieval/index.js\";\nimport {\n ConfigurationError,\n InitializationError,\n MemoryNotFoundError,\n ProviderNotConfiguredError,\n ValidationError,\n} from \"../errors/index.js\";\nimport type {\n ClearOptions,\n CompressOptions,\n CompressResult,\n ForgetOptions,\n HistoryOptions,\n HistoryResult,\n IngestOptions,\n IngestResult,\n InitOptions,\n MemoryRecord,\n RecallOptions,\n RecallResult,\n RememberOptions,\n RetrievalConfig,\n StatsResult,\n} from \"../types/index.js\";\nimport {\n AsyncMutex,\n assertFiniteNumber,\n assertNonEmptyString,\n createId,\n deserializeMetadata,\n distanceToSimilarity,\n nowIso,\n} from \"../utils/index.js\";\nimport type {\n WolbargOptions,\n WolbargOptionsWithLlm,\n WolbargOptionsWithoutLlm,\n} from \"./options.js\";\nimport {\n isEmbeddingProvider,\n isLlmProvider,\n isStorageProvider,\n} from \"./options.js\";\nimport { validateWolbargOptions, validateInitOptions } from \"./validate.js\";\n\ntype ReadyState = {\n storage: StorageProvider;\n embedding: EmbeddingProvider;\n organization: string;\n};\n\nexport class Wolbarg<HasLlm extends boolean = false> {\n /** Compile-time capability flag — `true` when constructed with `llm`. */\n declare readonly __hasLlm: HasLlm;\n\n private initialized = false;\n private booting: Promise<void> | null = null;\n private organization: string | null = null;\n private storage: StorageProvider | null = null;\n private embedding: EmbeddingProvider | null = null;\n private llm: LlmProvider | null = null;\n private compression: CompressionProvider | null = null;\n private reranker: RerankerProvider | null = null;\n private keywordSearch: KeywordSearchProvider | null = null;\n private ocr: OCRProvider | null = null;\n private vision: VisionProvider | null = null;\n private chunking: ChunkingStrategy | null = null;\n private retrievalConfig: RetrievalConfig = {};\n private embeddingDimensions: number | null = null;\n private readonly writeMutex = new AsyncMutex();\n\n /**\n * Create an Wolbarg instance.\n * When options are provided, providers are wired immediately and\n * storage opens lazily on the first API call (or {@link ready}).\n *\n * Pass `llm` to enable {@link compress} (typed at compile time).\n */\n constructor(options: WolbargOptionsWithLlm);\n constructor(options: WolbargOptionsWithoutLlm);\n constructor();\n constructor(options?: WolbargOptions) {\n if (!options) {\n return;\n }\n\n const validated = validateWolbargOptions(options);\n this.organization = validated.organization;\n this.storage = isStorageProvider(validated.storage)\n ? validated.storage\n : createStorageProvider(validated.storage);\n this.embedding = isEmbeddingProvider(validated.embedding)\n ? validated.embedding\n : createEmbeddingProvider(validated.embedding);\n\n if (validated.llm) {\n this.llm = isLlmProvider(validated.llm)\n ? validated.llm\n : createLlmProvider(validated.llm);\n this.compression =\n validated.compression ?? createCompressionProvider(this.llm);\n } else {\n this.compression = validated.compression ?? null;\n }\n\n this.reranker = validated.reranker ?? null;\n this.keywordSearch = validated.keywordSearch ?? null;\n this.ocr = validated.ocr ?? null;\n this.vision = validated.vision ?? null;\n this.chunking = validated.chunking ?? null;\n this.retrievalConfig = validated.retrieval ?? {};\n }\n\n /**\n * Backwards-compatible initialization (v0.1 API).\n * Prefer the constructor with `storage` / `embedding` / optional `llm`.\n */\n async init(options: InitOptions): Promise<void> {\n if (this.initialized || this.storage) {\n throw new InitializationError(\"Wolbarg is already initialized\");\n }\n\n let validated: InitOptions;\n try {\n validated = validateInitOptions(options);\n } catch (error) {\n if (error instanceof ConfigurationError || error instanceof ValidationError) {\n throw error;\n }\n throw new ConfigurationError(\n `Invalid configuration: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n\n this.organization = validated.organization;\n this.storage = createStorageProvider(validated.database);\n this.embedding = createEmbeddingProvider(validated.embedding);\n if (validated.llm) {\n this.llm = createLlmProvider(validated.llm);\n this.compression = createCompressionProvider(this.llm);\n }\n\n await this.ready();\n }\n\n /** Ensure storage is open and embedding dimensions are known. */\n async ready(): Promise<void> {\n if (this.initialized) {\n return;\n }\n if (this.booting) {\n await this.booting;\n return;\n }\n this.booting = this.boot();\n try {\n await this.booting;\n } finally {\n this.booting = null;\n }\n }\n\n private async boot(): Promise<void> {\n if (!this.storage || !this.embedding || !this.organization) {\n throw new InitializationError(\n \"Wolbarg is not configured. Pass options to the constructor or call init().\",\n );\n }\n\n try {\n await this.storage.open();\n const probe = await this.embedding.validate();\n await this.storage.ensureVectorSchema(probe.dimensions);\n this.embeddingDimensions = probe.dimensions;\n this.initialized = true;\n } catch (error) {\n await this.storage.close().catch(() => undefined);\n this.initialized = false;\n if (\n error instanceof ConfigurationError ||\n error instanceof InitializationError ||\n error instanceof ValidationError\n ) {\n throw error;\n }\n throw new InitializationError(\n `Initialization failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /** Store a semantic memory for an agent. */\n async remember(options: RememberOptions): Promise<MemoryRecord> {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.agent, \"agent\");\n if (!options.content || typeof options.content.text !== \"string\") {\n throw new ValidationError(\"content.text must be a string\");\n }\n assertNonEmptyString(options.content.text, \"content.text\");\n\n const metadata = options.metadata ?? {};\n if (metadata === null || typeof metadata !== \"object\" || Array.isArray(metadata)) {\n throw new ValidationError(\"metadata must be a plain object when provided\");\n }\n\n const profile = process.env.WOLBARG_PROFILE === \"1\";\n const t0 = profile ? performance.now() : 0;\n const vector = await embedding.embed(options.content.text);\n const embedMs = profile ? performance.now() - t0 : 0;\n this.assertEmbeddingDimensions(vector.length);\n\n const id = createId();\n const timestamp = nowIso();\n\n return this.withWriteLock(async () => {\n const tStore = profile ? performance.now() : 0;\n const row = await storage.insertMemory({\n id,\n organization,\n agent: options.agent.trim(),\n contentText: options.content.text,\n metadata,\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n if (profile) {\n const storeMs = performance.now() - tStore;\n const totalMs = performance.now() - t0;\n console.log(\n `[profile] remember embed=${embedMs.toFixed(2)}ms store=${storeMs.toFixed(2)}ms total=${totalMs.toFixed(2)}ms backend=${storage.name}`,\n );\n }\n return toMemoryRecord(row);\n });\n }\n\n /**\n * Semantic / hybrid search over stored memories.\n * Optional keyword, metadata, MMR, and rerank stages degrade gracefully.\n */\n async recall(options: RecallOptions): Promise<RecallResult[]> {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.query, \"query\");\n\n const topK = options.topK ?? 5;\n const threshold = options.threshold ?? 0;\n assertFiniteNumber(topK, \"topK\", { min: 1, max: 1000 });\n assertFiniteNumber(threshold, \"threshold\", { min: 0, max: 1 });\n\n const query = options.query.trim();\n const vector = await embedding.embed(query);\n this.assertEmbeddingDimensions(vector.length);\n\n const hasFilters = Boolean(\n options.filter?.agent || options.filter?.metadata,\n );\n const overFetch =\n this.retrievalConfig.overFetchFactor ?? (hasFilters ? 4 : 2);\n const fetchK = adaptiveFetchK(topK, overFetch, hasFilters);\n\n const semanticScores = new Map<string, number>();\n const byId = new Map<string, RecallResult>();\n\n const joined = storage.searchVectorsWithMemories;\n if (typeof joined === \"function\") {\n const joinedHits = await joined.call(\n storage,\n vector,\n fetchK,\n organization,\n {\n agent: options.filter?.agent,\n includeArchived: options.filter?.includeArchived,\n },\n );\n for (const { row, distance } of joinedHits) {\n if (\n options.filter?.metadata &&\n !matchesMetadata(\n deserializeMetadata(row.metadata_json),\n options.filter.metadata,\n )\n ) {\n continue;\n }\n const similarity = distanceToSimilarity(distance);\n if (similarity < threshold) {\n continue;\n }\n const result = toRecallResult(row, similarity);\n semanticScores.set(result.id, similarity);\n byId.set(result.id, result);\n }\n } else {\n const hits = await storage.searchVectors(vector, fetchK);\n const rowids = hits.map((h) => h.memoryRowid);\n let rowMap: Map<number, MemoryRow>;\n if (typeof storage.getMemoriesByRowids === \"function\") {\n rowMap = await storage.getMemoriesByRowids(rowids, organization);\n } else {\n rowMap = new Map();\n const looked = await Promise.all(\n hits.map(async (hit) => ({\n hit,\n row: await storage.getMemoryByRowid(hit.memoryRowid, organization),\n })),\n );\n for (const { hit, row } of looked) {\n if (row) rowMap.set(hit.memoryRowid, row);\n }\n }\n\n for (const hit of hits) {\n const row = rowMap.get(hit.memoryRowid);\n if (!row) {\n continue;\n }\n if (options.filter?.agent && row.agent !== options.filter.agent) {\n continue;\n }\n if (!options.filter?.includeArchived && row.archived === 1) {\n continue;\n }\n const metadata = deserializeMetadata(row.metadata_json);\n if (\n options.filter?.metadata &&\n !matchesMetadata(metadata, options.filter.metadata)\n ) {\n continue;\n }\n\n const similarity = distanceToSimilarity(hit.distance);\n if (similarity < threshold) {\n continue;\n }\n\n const result = toRecallResult(row, similarity);\n semanticScores.set(result.id, similarity);\n byId.set(result.id, result);\n }\n }\n\n const hybridWeights =\n resolveHybridWeights(options.hybrid) ??\n (options.hybrid === undefined\n ? resolveHybridWeights(this.retrievalConfig.hybrid)\n : null);\n\n if (hybridWeights) {\n let keywordScores = new Map<string, number>();\n\n if (typeof storage.searchKeyword === \"function\") {\n const ftsHits = await storage.searchKeyword(\n query,\n organization,\n fetchK,\n );\n keywordScores = new Map(\n ftsHits.map((h) => [h.memoryId, h.score]),\n );\n const missingIds: string[] = [];\n for (const id of keywordScores.keys()) {\n if (!byId.has(id)) missingIds.push(id);\n }\n if (missingIds.length > 0) {\n const fetched = await Promise.all(\n missingIds.map((id) => storage.getMemoryById(id, organization)),\n );\n for (const row of fetched) {\n if (!row) continue;\n if (options.filter?.agent && row.agent !== options.filter.agent) {\n continue;\n }\n if (!options.filter?.includeArchived && row.archived === 1) {\n continue;\n }\n if (\n options.filter?.metadata &&\n !matchesMetadata(\n deserializeMetadata(row.metadata_json),\n options.filter.metadata,\n )\n ) {\n continue;\n }\n byId.set(row.id, toRecallResult(row, 0));\n }\n }\n } else if (this.keywordSearch) {\n const corpus = await storage.listMemories(\n {\n organization,\n agent: options.filter?.agent,\n includeArchived: options.filter?.includeArchived,\n metadata: options.filter?.metadata,\n },\n Math.min(fetchK * 2, 2000),\n );\n const keywordHits = await this.keywordSearch.search(\n query,\n corpus.map((row) => ({ id: row.id, text: row.content_text })),\n fetchK,\n );\n keywordScores = new Map(\n keywordHits.map((h) => [h.memoryId, h.score]),\n );\n\n for (const row of corpus) {\n if (byId.has(row.id)) {\n continue;\n }\n if (!keywordScores.has(row.id)) {\n continue;\n }\n const metadata = deserializeMetadata(row.metadata_json);\n if (\n options.filter?.metadata &&\n !matchesMetadata(metadata, options.filter.metadata)\n ) {\n continue;\n }\n if (!options.filter?.includeArchived && row.archived === 1) {\n continue;\n }\n byId.set(row.id, toRecallResult(row, 0));\n }\n }\n\n if (keywordScores.size > 0) {\n const fused = fuseScores(semanticScores, keywordScores, hybridWeights);\n for (const [id, score] of fused) {\n const existing = byId.get(id);\n if (existing) {\n byId.set(id, { ...existing, similarity: score });\n }\n }\n }\n }\n\n let results = [...byId.values()].sort(\n (a, b) => b.similarity - a.similarity,\n );\n\n const mmrLambda =\n resolveMmr(options.mmr) ??\n resolveMmr(\n this.retrievalConfig.mmr\n ? { lambda: this.retrievalConfig.mmr.lambda }\n : undefined,\n );\n if (mmrLambda !== null) {\n results = applyMmr(results, Math.max(topK * 2, topK), mmrLambda);\n }\n\n if (options.rerank && this.reranker) {\n const reranked = await this.reranker.rerank(\n query,\n results.map((r) => ({ id: r.id, text: r.content.text })),\n topK,\n );\n const order = new Map(reranked.map((r, i) => [r.id, { score: r.score, i }]));\n results = results\n .filter((r) => order.has(r.id))\n .sort((a, b) => (order.get(a.id)!.i) - (order.get(b.id)!.i))\n .map((r) => ({\n ...r,\n similarity: order.get(r.id)?.score ?? r.similarity,\n }));\n }\n\n return results.slice(0, topK);\n }\n\n /**\n * Compress related memories for an agent into a single summarized memory.\n * Only available when `llm` (or `compression`) was configured at construction.\n */\n async compress(\n this: Wolbarg<true>,\n options: CompressOptions,\n ): Promise<CompressResult> {\n return this.runCompress(options);\n }\n\n /** @internal */\n private async runCompress(options: CompressOptions): Promise<CompressResult> {\n const { storage, embedding, organization } = await this.requireReady();\n if (!this.compression) {\n throw new ProviderNotConfiguredError(\n \"llm\",\n \"compress\",\n \"pass llm: openaiLlm(...) (or compression) in the constructor\",\n );\n }\n assertNonEmptyString(options.agent, \"agent\");\n const limit = options.limit ?? 50;\n assertFiniteNumber(limit, \"limit\", { min: 2, max: 500 });\n\n const rows = await storage.listMemories(\n {\n organization,\n agent: options.agent.trim(),\n includeArchived: false,\n },\n limit,\n );\n\n if (rows.length < 2) {\n throw new ValidationError(\n \"compress requires at least 2 active memories for the given agent\",\n );\n }\n\n const records = rows.map(toMemoryRecord);\n const summaryText = await this.compression.compress(records);\n const vector = await embedding.embed(summaryText);\n this.assertEmbeddingDimensions(vector.length);\n\n const summaryId = createId();\n const timestamp = nowIso();\n\n return this.withWriteLock(async () => {\n const summaryRow = await storage.insertMemory({\n id: summaryId,\n organization,\n agent: options.agent.trim(),\n contentText: summaryText,\n metadata: {\n compressed: true,\n sourceCount: records.length,\n sourceIds: records.map((r) => r.id),\n },\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n\n const archivedIds = await storage.archiveMemories(\n records.map((r) => r.id),\n organization,\n summaryId,\n timestamp,\n );\n\n return {\n summary: toMemoryRecord(summaryRow),\n archivedIds,\n };\n });\n }\n\n /** Ingest a document: parse → OCR/vision (optional) → chunk → embed → store. */\n async ingest(options: IngestOptions): Promise<IngestResult> {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.agent, \"agent\");\n\n const loaded = await loadIngestSource(options.source);\n let usedOcr = false;\n let usedVision = false;\n let text = loaded.rawText ?? \"\";\n\n if (!loaded.rawText) {\n const parser = resolveParser(loaded.filename, loaded.mimeType);\n const parsed = await parser.parse({\n buffer: loaded.buffer,\n filename: loaded.filename,\n mimeType: loaded.mimeType,\n });\n text = parsed.text;\n\n if (parsed.isImage && parsed.imageBuffer) {\n const parts: string[] = [];\n if (this.ocr) {\n const ocrResult = await this.ocr.recognize(\n parsed.imageBuffer,\n parsed.mimeType,\n );\n if (ocrResult.text) {\n parts.push(ocrResult.text);\n usedOcr = true;\n }\n }\n if (this.vision) {\n const visionResult = await this.vision.analyze(\n parsed.imageBuffer,\n parsed.mimeType,\n );\n if (visionResult.caption) {\n parts.push(`Caption: ${visionResult.caption}`);\n }\n if (visionResult.description) {\n parts.push(visionResult.description);\n }\n if (visionResult.entities.length > 0) {\n parts.push(`Entities: ${visionResult.entities.join(\", \")}`);\n }\n if (parts.length > 0) {\n usedVision = true;\n }\n }\n text = parts.join(\"\\n\\n\").trim();\n }\n }\n\n if (!text) {\n throw new ValidationError(\n \"ingest could not extract text from the document (configure ocr/vision for images, or provide text)\",\n );\n }\n\n const strategy =\n this.chunking ??\n (options.chunking?.strategy\n ? createChunkingStrategy(options.chunking.strategy)\n : inferChunkingStrategy(text));\n\n const chunks = strategy.chunk(text, {\n chunkSize: options.chunking?.chunkSize,\n overlap: options.chunking?.overlap,\n });\n\n if (chunks.length === 0) {\n throw new ValidationError(\"ingest produced zero chunks\");\n }\n\n const vectors = await embedMany(\n embedding,\n chunks.map((c) => c.text),\n );\n for (const vector of vectors) {\n this.assertEmbeddingDimensions(vector.length);\n }\n\n const baseMeta = options.metadata ?? {};\n const timestamp = nowIso();\n const inputs = chunks.map((chunk, i) => ({\n id: createId(),\n organization,\n agent: options.agent.trim(),\n contentText: chunk.text,\n metadata: {\n ...baseMeta,\n ingest: true,\n chunkIndex: chunk.index,\n chunkCount: chunks.length,\n sourceFilename: loaded.filename ?? null,\n },\n embedding: vectors[i]!,\n createdAt: timestamp,\n updatedAt: timestamp,\n }));\n\n const rows = await this.withWriteLock(async () => {\n return storage.insertMemoriesBatch(inputs);\n });\n\n return {\n memories: rows.map(toMemoryRecord),\n extractedChars: text.length,\n chunkCount: chunks.length,\n usedOcr,\n usedVision,\n };\n }\n\n /** Delete memories by ID or filter. */\n async forget(options: ForgetOptions): Promise<number> {\n const { storage, organization } = await this.requireReady();\n\n return this.withWriteLock(async () => {\n if (\"id\" in options && options.id !== undefined) {\n assertNonEmptyString(options.id, \"id\");\n const deleted = await storage.deleteMemoryById(\n options.id.trim(),\n organization,\n );\n return deleted ? 1 : 0;\n }\n\n if (\"filter\" in options && options.filter?.agent) {\n assertNonEmptyString(options.filter.agent, \"filter.agent\");\n return storage.deleteMemoriesByFilter({\n organization,\n agent: options.filter.agent.trim(),\n includeArchived: true,\n });\n }\n\n throw new ValidationError(\n \"forget requires either { id } or { filter: { agent } }\",\n );\n });\n }\n\n /** Return the history of a memory. */\n async history(options: HistoryOptions): Promise<HistoryResult> {\n const { storage, organization } = await this.requireReady();\n assertNonEmptyString(options.id, \"id\");\n\n const row = await storage.getMemoryById(options.id.trim(), organization);\n if (!row) {\n throw new MemoryNotFoundError(`Memory not found: ${options.id}`);\n }\n\n const events = await storage.getHistory(row.id);\n return {\n memory: toMemoryRecord(row),\n events: events.map(toHistoryEvent),\n };\n }\n\n /** Aggregate statistics for the current organization. */\n async stats(): Promise<StatsResult> {\n const { storage, embedding, organization } = await this.requireReady();\n const counts = await storage.getStats(organization);\n const databaseSizeBytes = await storage.getDatabaseSizeBytes();\n\n return {\n totalMemories: counts.totalMemories,\n activeMemories: counts.activeMemories,\n archivedMemories: counts.archivedMemories,\n totalAgents: counts.totalAgents,\n databaseSizeBytes,\n embeddingModel: embedding.model,\n llmModel: this.llm?.model ?? null,\n organization,\n embeddingDimensions: this.embeddingDimensions ?? 0,\n };\n }\n\n /** Delete every memory in the current organization. */\n async clear(options: ClearOptions): Promise<number> {\n const { storage, organization } = await this.requireReady();\n\n if (!options || options.confirm !== true) {\n throw new ValidationError(\n \"clear requires { confirm: true } to permanently delete all memories\",\n );\n }\n\n return this.withWriteLock(async () => {\n return storage.clearOrganization(organization);\n });\n }\n\n /**\n * Serialize writes for SQLite (single connection). Postgres uses a pool and\n * per-statement atomic CTEs — locking here only serializes throughput.\n */\n private withWriteLock<T>(fn: () => Promise<T>): Promise<T> {\n if (this.storage?.name === \"sqlite\") {\n return this.writeMutex.runExclusive(fn);\n }\n return fn();\n }\n\n /** Close the database connection and release resources. */\n async close(): Promise<void> {\n if (this.storage) {\n await this.storage.close();\n }\n this.storage = null;\n this.embedding = null;\n this.llm = null;\n this.compression = null;\n this.organization = null;\n this.embeddingDimensions = null;\n this.initialized = false;\n }\n\n /** Whether providers are ready for API calls. */\n get isInitialized(): boolean {\n return this.initialized;\n }\n\n private async requireReady(): Promise<ReadyState> {\n await this.ready();\n if (\n !this.initialized ||\n !this.storage ||\n !this.embedding ||\n !this.organization\n ) {\n throw new InitializationError(\n \"Wolbarg is not initialized. Pass options to the constructor or call init().\",\n );\n }\n return {\n storage: this.storage,\n embedding: this.embedding,\n organization: this.organization,\n };\n }\n\n private assertEmbeddingDimensions(dimensions: number): void {\n if (\n this.embeddingDimensions !== null &&\n dimensions !== this.embeddingDimensions\n ) {\n throw new ValidationError(\n `Embedding dimension mismatch: expected ${this.embeddingDimensions}, got ${dimensions}`,\n );\n }\n }\n}\n","/**\n * Metadata filter AST for advanced recall filtering.\n */\n\n/** Comparison operators on a single metadata field. */\nexport type MetadataComparison =\n | { eq: unknown }\n | { contains: string }\n | { gt: number | string }\n | { gte: number | string }\n | { lt: number | string }\n | { lte: number | string }\n | { between: [number | string, number | string] };\n\n/** Recursive metadata filter supporting boolean combinators. */\nexport type MetadataFilter =\n | { field: string; op: MetadataComparison }\n | { and: MetadataFilter[] }\n | { or: MetadataFilter[] }\n | { not: MetadataFilter };\n\n/** Helpers for building filters fluently. */\nexport const meta = {\n eq: (field: string, value: unknown): MetadataFilter => ({\n field,\n op: { eq: value },\n }),\n contains: (field: string, value: string): MetadataFilter => ({\n field,\n op: { contains: value },\n }),\n gt: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { gt: value },\n }),\n gte: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { gte: value },\n }),\n lt: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { lt: value },\n }),\n lte: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { lte: value },\n }),\n between: (\n field: string,\n lo: number | string,\n hi: number | string,\n ): MetadataFilter => ({\n field,\n op: { between: [lo, hi] },\n }),\n and: (...filters: MetadataFilter[]): MetadataFilter => ({ and: filters }),\n or: (...filters: MetadataFilter[]): MetadataFilter => ({ or: filters }),\n not: (filter: MetadataFilter): MetadataFilter => ({ not: filter }),\n};\n","/**\n * Public factory helpers for storage / providers.\n */\n\nimport type { PostgresDatabaseConfig, SqliteDatabaseConfig } from \"../types/index.js\";\nimport { SqliteStorageProvider } from \"../storage/providers/sqlite.js\";\nimport { PostgresStorageProvider } from \"../storage/providers/postgres.js\";\nimport type { StorageProvider } from \"../storage/types.js\";\n\n/** Create a SQLite storage provider from a path or `:memory:`. */\nexport function sqlite(\n connectionString: string,\n): StorageProvider {\n return new SqliteStorageProvider({ connectionString });\n}\n\n/** Create a SQLite storage config object (for init / options). */\nexport function sqliteConfig(\n connectionString: string,\n): SqliteDatabaseConfig {\n return { provider: \"sqlite\", connectionString };\n}\n\n/** Create a PostgreSQL storage provider. Requires optional peer dependency `pg`. */\nexport function postgres(\n options: string | { connectionString: string; maxPoolSize?: number },\n): StorageProvider {\n const opts =\n typeof options === \"string\"\n ? { connectionString: options }\n : options;\n return new PostgresStorageProvider(opts);\n}\n\n/** Create a PostgreSQL storage config object. */\nexport function postgresConfig(\n connectionString: string,\n options?: { maxPoolSize?: number },\n): PostgresDatabaseConfig {\n return {\n provider: \"postgres\",\n connectionString,\n ...options,\n };\n}\n","/**\n * Keyword / BM25 search providers.\n */\n\nexport interface KeywordSearchHit {\n memoryId: string;\n score: number;\n}\n\nexport interface KeywordDocument {\n id: string;\n text: string;\n}\n\n/** Contract for keyword / lexical search. */\nexport interface KeywordSearchProvider {\n readonly name: string;\n search(\n query: string,\n documents: KeywordDocument[],\n topK: number,\n ): Promise<KeywordSearchHit[]>;\n}\n\n/** Simple in-memory BM25 (Okapi). */\nexport class Bm25KeywordSearchProvider implements KeywordSearchProvider {\n readonly name = \"bm25\";\n private readonly k1: number;\n private readonly b: number;\n\n constructor(options?: { k1?: number; b?: number }) {\n this.k1 = options?.k1 ?? 1.2;\n this.b = options?.b ?? 0.75;\n }\n\n async search(\n query: string,\n documents: KeywordDocument[],\n topK: number,\n ): Promise<KeywordSearchHit[]> {\n if (documents.length === 0 || topK <= 0) {\n return [];\n }\n\n const docs = documents.map((doc) => ({\n id: doc.id,\n tokens: tokenize(doc.text),\n }));\n const queryTokens = tokenize(query);\n if (queryTokens.length === 0) {\n return [];\n }\n\n const N = docs.length;\n const avgdl =\n docs.reduce((sum, d) => sum + d.tokens.length, 0) / Math.max(N, 1);\n\n const df = new Map<string, number>();\n for (const term of new Set(queryTokens)) {\n let count = 0;\n for (const doc of docs) {\n if (doc.tokens.includes(term)) {\n count += 1;\n }\n }\n df.set(term, count);\n }\n\n const scored = docs.map((doc) => {\n const tfMap = new Map<string, number>();\n for (const token of doc.tokens) {\n tfMap.set(token, (tfMap.get(token) ?? 0) + 1);\n }\n let score = 0;\n for (const term of queryTokens) {\n const tf = tfMap.get(term) ?? 0;\n if (tf === 0) {\n continue;\n }\n const n = df.get(term) ?? 0;\n const idf = Math.log(1 + (N - n + 0.5) / (n + 0.5));\n const denom =\n tf + this.k1 * (1 - this.b + this.b * (doc.tokens.length / avgdl));\n score += idf * ((tf * (this.k1 + 1)) / denom);\n }\n return { memoryId: doc.id, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.filter((s) => s.score > 0).slice(0, topK);\n }\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length > 1);\n}\n\n/** Factory for in-memory BM25 keyword search. */\nexport function bm25(options?: { k1?: number; b?: number }): KeywordSearchProvider {\n return new Bm25KeywordSearchProvider(options);\n}\n","/**\n * Reranker provider abstractions.\n */\n\nexport interface RerankDocument {\n id: string;\n text: string;\n}\n\nexport interface RerankHit {\n id: string;\n score: number;\n}\n\n/** Contract for cross-encoder / API rerankers. */\nexport interface RerankerProvider {\n readonly name: string;\n rerank(\n query: string,\n documents: RerankDocument[],\n topK: number,\n ): Promise<RerankHit[]>;\n}\n\ninterface HttpRerankerOptions {\n name: string;\n url: string;\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n /** Build request body for the provider. */\n buildBody: (\n query: string,\n documents: RerankDocument[],\n topK: number,\n model?: string,\n ) => unknown;\n /** Parse ranked results from JSON response. */\n parseResults: (body: unknown, documents: RerankDocument[]) => RerankHit[];\n}\n\nclass HttpRerankerProvider implements RerankerProvider {\n readonly name: string;\n private readonly options: HttpRerankerOptions;\n\n constructor(options: HttpRerankerOptions) {\n this.name = options.name;\n this.options = options;\n }\n\n async rerank(\n query: string,\n documents: RerankDocument[],\n topK: number,\n ): Promise<RerankHit[]> {\n if (documents.length === 0) {\n return [];\n }\n const controller = new AbortController();\n const timeoutMs = this.options.timeoutMs ?? 30_000;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(this.options.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.options.apiKey}`,\n },\n body: JSON.stringify(\n this.options.buildBody(\n query,\n documents,\n topK,\n this.options.model,\n ),\n ),\n signal: controller.signal,\n });\n const body: unknown = await res.json().catch(() => ({}));\n if (!res.ok) {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n }\n const parsed = this.options.parseResults(body, documents);\n return parsed.slice(0, topK);\n } catch {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n/** Lightweight local cross-encoder proxy (OpenAI-compatible score endpoint fallback = identity order). */\nexport function crossEncoder(options: {\n baseUrl: string;\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n const base = options.baseUrl.replace(/\\/+$/, \"\");\n return new HttpRerankerProvider({\n name: \"cross-encoder\",\n url: `${base}/rerank`,\n apiKey: options.apiKey,\n model: options.model,\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\nexport function jinaReranker(options: {\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n return new HttpRerankerProvider({\n name: \"jina\",\n url: \"https://api.jina.ai/v1/rerank\",\n apiKey: options.apiKey,\n model: options.model ?? \"jina-reranker-v2-base-multilingual\",\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\nexport function cohereReranker(options: {\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n return new HttpRerankerProvider({\n name: \"cohere\",\n url: \"https://api.cohere.com/v2/rerank\",\n apiKey: options.apiKey,\n model: options.model ?? \"rerank-v3.5\",\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\n/** Alias for BGE-style remote rerank endpoints that speak the Jina/Cohere shape. */\nexport function bgeReranker(options: {\n apiKey: string;\n baseUrl: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n const base = options.baseUrl.replace(/\\/+$/, \"\");\n return new HttpRerankerProvider({\n name: \"bge\",\n url: `${base}/rerank`,\n apiKey: options.apiKey,\n model: options.model,\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\n/**\n * OpenAI chat-based reranker (no Cohere/Jina key required).\n * Scores query–document relevance via chat completions and reorders hits.\n */\nexport function openaiReranker(options: {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n const base = (options.baseUrl ?? \"https://api.openai.com/v1\").replace(\n /\\/+$/,\n \"\",\n );\n const model = options.model ?? \"gpt-4.1-mini\";\n const timeoutMs = options.timeoutMs ?? 60_000;\n\n return {\n name: \"openai\",\n async rerank(query, documents, topK) {\n if (documents.length === 0) {\n return [];\n }\n const listed = documents\n .map((d, i) => `[${i}] ${d.text.slice(0, 800)}`)\n .join(\"\\n\\n\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`${base}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n response_format: { type: \"json_object\" },\n messages: [\n {\n role: \"system\",\n content:\n 'You rerank documents for a retrieval system. Reply ONLY with JSON: {\"results\":[{\"index\":0,\"score\":0.0}]} where score is 0-1 relevance.',\n },\n {\n role: \"user\",\n content: `Query: ${query}\\n\\nDocuments:\\n${listed}\\n\\nReturn the top ${topK} indices sorted by score descending.`,\n },\n ],\n }),\n signal: controller.signal,\n });\n const body = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n const content = body.choices?.[0]?.message?.content ?? \"{}\";\n let parsed: { results?: Array<{ index: number; score: number }> };\n try {\n parsed = JSON.parse(content) as typeof parsed;\n } catch {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n }\n const results = parsed.results ?? [];\n if (results.length === 0) {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n }\n return results\n .filter((r) => documents[r.index])\n .slice(0, topK)\n .map((r) => ({\n id: documents[r.index]!.id,\n score: Number(r.score) || 0,\n }));\n } catch {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n } finally {\n clearTimeout(timer);\n }\n },\n };\n}\n\n","/**\n * Optional OCR provider — extract text from images.\n */\n\nexport interface OcrResult {\n text: string;\n}\n\nexport interface OCRProvider {\n readonly name: string;\n recognize(image: Buffer, mimeType?: string): Promise<OcrResult>;\n}\n\n/**\n * Placeholder Tesseract adapter.\n * Requires optional peer packages (`tesseract.js`) when used.\n */\nexport function tesseract(): OCRProvider {\n return {\n name: \"tesseract\",\n async recognize(image: Buffer): Promise<OcrResult> {\n try {\n const mod = await import(\"tesseract.js\" as string);\n const createWorker =\n (mod as { createWorker?: (lang: string) => Promise<{\n recognize: (img: Buffer) => Promise<{ data: { text: string } }>;\n terminate: () => Promise<void>;\n }> }).createWorker ??\n (mod as { default?: { createWorker: (lang: string) => Promise<{\n recognize: (img: Buffer) => Promise<{ data: { text: string } }>;\n terminate: () => Promise<void>;\n }> } }).default?.createWorker;\n if (!createWorker) {\n return { text: \"\" };\n }\n const worker = await createWorker(\"eng\");\n try {\n const result = await worker.recognize(image);\n return { text: result.data.text.trim() };\n } finally {\n await worker.terminate();\n }\n } catch {\n return { text: \"\" };\n }\n },\n };\n}\n","/**\n * Optional vision provider — captions / descriptions / entities from images.\n */\n\nexport interface VisionResult {\n caption: string;\n description: string;\n entities: string[];\n}\n\nexport interface VisionProvider {\n readonly name: string;\n analyze(image: Buffer, mimeType?: string): Promise<VisionResult>;\n}\n\ninterface VisionHttpOptions {\n name: string;\n baseUrl: string;\n apiKey: string;\n model: string;\n timeoutMs?: number;\n}\n\nclass OpenAICompatibleVisionProvider implements VisionProvider {\n readonly name: string;\n private readonly options: VisionHttpOptions;\n\n constructor(options: VisionHttpOptions) {\n this.name = options.name;\n this.options = options;\n }\n\n async analyze(image: Buffer, mimeType = \"image/png\"): Promise<VisionResult> {\n const base = this.options.baseUrl.replace(/\\/+$/, \"\");\n const url = `${base}/chat/completions`;\n const dataUrl = `data:${mimeType};base64,${image.toString(\"base64\")}`;\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n this.options.timeoutMs ?? 60_000,\n );\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.options.apiKey}`,\n },\n body: JSON.stringify({\n model: this.options.model,\n messages: [\n {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: 'Describe this image. Reply as JSON: {\"caption\":\"...\",\"description\":\"...\",\"entities\":[\"...\"]}',\n },\n { type: \"image_url\", image_url: { url: dataUrl } },\n ],\n },\n ],\n max_tokens: 512,\n }),\n signal: controller.signal,\n });\n const body = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n const content = body.choices?.[0]?.message?.content ?? \"\";\n return parseVisionJson(content);\n } catch {\n return { caption: \"\", description: \"\", entities: [] };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\nfunction parseVisionJson(content: string): VisionResult {\n try {\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n return { caption: content.trim(), description: content.trim(), entities: [] };\n }\n const parsed = JSON.parse(match[0]) as Partial<VisionResult>;\n return {\n caption: String(parsed.caption ?? \"\"),\n description: String(parsed.description ?? \"\"),\n entities: Array.isArray(parsed.entities)\n ? parsed.entities.map(String)\n : [],\n };\n } catch {\n return { caption: content.trim(), description: content.trim(), entities: [] };\n }\n}\n\nexport function geminiVision(options: {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n}): VisionProvider {\n return new OpenAICompatibleVisionProvider({\n name: \"gemini\",\n baseUrl:\n options.baseUrl ??\n \"https://generativelanguage.googleapis.com/v1beta/openai\",\n apiKey: options.apiKey,\n model: options.model ?? \"gemini-2.0-flash\",\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport function openaiVision(options: {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n}): VisionProvider {\n return new OpenAICompatibleVisionProvider({\n name: \"openai-vision\",\n baseUrl: options.baseUrl ?? \"https://api.openai.com/v1\",\n apiKey: options.apiKey,\n model: options.model ?? \"gpt-4o-mini\",\n timeoutMs: options.timeoutMs,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/compression/index.ts","../src/chunking/index.ts","../src/utils/index.ts","../src/embedding/index.ts","../src/llm/index.ts","../src/ingest/index.ts","../src/core/options.ts","../src/filters/match.ts","../src/schema/index.ts","../src/sql/index.ts","../src/utils/vector.ts","../src/utils/vector-index.ts","../src/storage/providers/sqlite.ts","../src/storage/providers/postgres.ts","../src/storage/index.ts","../src/memory/transfer.ts","../src/memory/index.ts","../src/retrieval/index.ts","../src/core/validate.ts","../src/telemetry/logger.ts","../src/telemetry/trace.ts","../src/telemetry/emitter.ts","../src/providers/sqlite/sqliteEventDatabase.ts","../src/providers/sqlite/sqliteTelemetryProvider.ts","../src/providers/sqlite/sqliteCheckpointProvider.ts","../src/core/wolbarg.ts","../src/filters/types.ts","../src/factories/index.ts","../src/keyword/index.ts","../src/rerank/index.ts","../src/ocr/index.ts","../src/vision/index.ts","../src/benchmark/index.ts"],"names":["meta","path","fs","result","DatabaseSync","SDK_VERSION","wolbarg"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Operation-scoped errors with reason + suggestion for developer experience.\n */\n\n/** Base class for all Wolbarg errors. */\nexport class WolbargError extends Error {\n readonly code: string;\n readonly reason?: string;\n readonly suggestion?: string;\n readonly operation?: string;\n\n constructor(\n message: string,\n code: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, options);\n this.name = \"WolbargError\";\n this.code = code;\n this.reason = options?.reason;\n this.suggestion = options?.suggestion;\n this.operation = options?.operation;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when SDK initialization fails. */\nexport class InitializationError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"INITIALIZATION_ERROR\", options);\n this.name = \"InitializationError\";\n }\n}\n\n/** Thrown when configuration values are missing or invalid. */\nexport class ConfigurationError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"CONFIGURATION_ERROR\", options);\n this.name = \"ConfigurationError\";\n }\n}\n\n/** Thrown when method arguments fail validation. */\nexport class ValidationError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"VALIDATION_ERROR\", options);\n this.name = \"ValidationError\";\n }\n}\n\n/** Thrown when a database operation fails. */\nexport class DatabaseError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"DATABASE_ERROR\", options);\n this.name = \"DatabaseError\";\n }\n}\n\n/** Thrown when an embedding request fails. */\nexport class EmbeddingError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"EMBEDDING_ERROR\", options);\n this.name = \"EmbeddingError\";\n }\n}\n\n/** Thrown when compression (LLM summarization) fails. */\nexport class CompressionError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"COMPRESSION_ERROR\", options);\n this.name = \"CompressionError\";\n }\n}\n\n/** Thrown when a requested memory does not exist. */\nexport class MemoryNotFoundError extends WolbargError {\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"MEMORY_NOT_FOUND\", options);\n this.name = \"MemoryNotFoundError\";\n }\n}\n\n/**\n * Thrown when a method requires an optional provider that was not configured.\n */\nexport class ProviderNotConfiguredError extends ConfigurationError {\n readonly provider: string;\n\n constructor(provider: string, method: string, hint: string) {\n super(`${method} requires ${provider} — ${hint}`, {\n operation: method,\n reason: `${provider} was not configured`,\n suggestion: hint,\n });\n this.name = \"ProviderNotConfiguredError\";\n this.provider = provider;\n }\n}\n\n/** Map low-level SQLite / driver errors into actionable operation errors. */\nexport function wrapOperationError(\n operation: string,\n error: unknown,\n): WolbargError {\n // Preserve typed SDK errors so callers can still use instanceof checks.\n if (error instanceof WolbargError) {\n return error;\n }\n\n const raw = error instanceof Error ? error.message : String(error);\n const lower = raw.toLowerCase();\n\n if (lower.includes(\"database is locked\") || lower.includes(\"sqlite_busy\")) {\n return new DatabaseError(formatOperationMessage(operation, raw), {\n cause: error instanceof Error ? error : undefined,\n operation,\n reason: \"SQLite database locked\",\n suggestion: \"Increase timeout or reduce concurrent writes.\",\n });\n }\n\n if (lower.includes(\"no such file\") || lower.includes(\"enoent\")) {\n return new DatabaseError(formatOperationMessage(operation, raw), {\n cause: error instanceof Error ? error : undefined,\n operation,\n reason: \"Database file not found\",\n suggestion: \"Check the database path and ensure the directory exists.\",\n });\n }\n\n if (lower.includes(\"readonly\") || lower.includes(\"read-only\")) {\n return new DatabaseError(formatOperationMessage(operation, raw), {\n cause: error instanceof Error ? error : undefined,\n operation,\n reason: \"Database opened as read-only\",\n suggestion: \"Open the database with write permissions or choose another path.\",\n });\n }\n\n return new DatabaseError(formatOperationMessage(operation, raw), {\n cause: error instanceof Error ? error : undefined,\n operation,\n reason: raw,\n suggestion: \"Inspect the underlying cause and retry the operation.\",\n });\n}\n\nfunction formatOperationMessage(operation: string, reason: string | WolbargError): string {\n const reasonText =\n typeof reason === \"string\" ? reason : reason.reason ?? reason.message;\n return `Failed to execute ${operation}()\\nReason:\\n${reasonText}`;\n}\n","/**\n * Memory compression — provider-based summarization.\n */\n\nimport type { LlmProvider } from \"../llm/index.js\";\nimport type { MemoryRecord } from \"../types/index.js\";\nimport { CompressionError } from \"../errors/index.js\";\n\nconst SYSTEM_PROMPT = `You are a memory compression engine for multi-agent systems.\nGiven related memories from a single agent, produce ONE concise summary that preserves:\n- Key facts and decisions\n- Important entities, numbers, and identifiers\n- Actionable conclusions\n\nRules:\n- Output plain text only (no markdown headings, no bullet lists unless essential)\n- Do not invent facts that are not present\n- Prefer precision over verbosity\n- Keep the summary self-contained`;\n\n/** Contract for memory compression backends. */\nexport interface CompressionProvider {\n readonly name: string;\n compress(memories: MemoryRecord[]): Promise<string>;\n}\n\n/** Default compression provider wrapping an {@link LlmProvider}. */\nexport class LlmCompressionProvider implements CompressionProvider {\n readonly name = \"llm\";\n private readonly llm: LlmProvider;\n\n constructor(llm: LlmProvider) {\n this.llm = llm;\n }\n\n async compress(memories: MemoryRecord[]): Promise<string> {\n return compressMemories(this.llm, memories);\n }\n}\n\nexport async function compressMemories(\n llm: LlmProvider,\n memories: MemoryRecord[],\n): Promise<string> {\n if (memories.length === 0) {\n throw new CompressionError(\"No memories available to compress\");\n }\n\n const payload = memories\n .map((memory, index) => {\n const meta =\n Object.keys(memory.metadata).length > 0\n ? `\\nMetadata: ${JSON.stringify(memory.metadata)}`\n : \"\";\n return `[${index + 1}] (id=${memory.id}, created=${memory.createdAt.toISOString()})${meta}\\n${memory.content.text}`;\n })\n .join(\"\\n\\n\");\n\n try {\n return await llm.complete([\n { role: \"system\", content: SYSTEM_PROMPT },\n {\n role: \"user\",\n content: `Compress the following ${memories.length} memories into a single concise summary:\\n\\n${payload}`,\n },\n ]);\n } catch (error) {\n if (error instanceof CompressionError) {\n throw error;\n }\n throw new CompressionError(\n `Compression failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n}\n\nexport function createCompressionProvider(\n llm: LlmProvider,\n): CompressionProvider {\n return new LlmCompressionProvider(llm);\n}\n","/**\n * Chunking strategies for document ingestion.\n */\n\nexport interface Chunk {\n text: string;\n index: number;\n}\n\nexport interface ChunkingOptions {\n chunkSize?: number;\n overlap?: number;\n}\n\nexport interface ChunkingStrategy {\n readonly name: string;\n chunk(text: string, options?: ChunkingOptions): Chunk[];\n}\n\nfunction clampOptions(options?: ChunkingOptions): {\n chunkSize: number;\n overlap: number;\n} {\n const chunkSize = Math.max(32, options?.chunkSize ?? 800);\n const overlap = Math.min(\n Math.max(0, options?.overlap ?? 100),\n Math.floor(chunkSize / 2),\n );\n return { chunkSize, overlap };\n}\n\nfunction windowChunks(\n pieces: string[],\n chunkSize: number,\n overlap: number,\n joiner: string,\n): Chunk[] {\n if (pieces.length === 0) {\n return [];\n }\n const chunks: Chunk[] = [];\n let buf = \"\";\n let index = 0;\n\n const flush = (): void => {\n const trimmed = buf.trim();\n if (trimmed) {\n chunks.push({ text: trimmed, index });\n index += 1;\n }\n };\n\n for (const piece of pieces) {\n const candidate = buf ? `${buf}${joiner}${piece}` : piece;\n if (candidate.length <= chunkSize) {\n buf = candidate;\n continue;\n }\n flush();\n if (piece.length > chunkSize) {\n // Hard-split oversized piece\n let start = 0;\n while (start < piece.length) {\n const end = Math.min(start + chunkSize, piece.length);\n chunks.push({ text: piece.slice(start, end).trim(), index });\n index += 1;\n start = Math.max(end - overlap, end);\n }\n buf = \"\";\n } else {\n buf = piece;\n }\n }\n flush();\n\n if (overlap > 0 && chunks.length > 1) {\n // Rebuild with overlap by sliding on joined text for stability\n const full = pieces.join(joiner);\n return slidingWindow(full, chunkSize, overlap);\n }\n return chunks;\n}\n\nfunction slidingWindow(\n text: string,\n chunkSize: number,\n overlap: number,\n): Chunk[] {\n const chunks: Chunk[] = [];\n let start = 0;\n let index = 0;\n while (start < text.length) {\n const end = Math.min(start + chunkSize, text.length);\n const slice = text.slice(start, end).trim();\n if (slice) {\n chunks.push({ text: slice, index });\n index += 1;\n }\n if (end >= text.length) {\n break;\n }\n start = Math.max(end - overlap, start + 1);\n }\n return chunks;\n}\n\nexport class FixedChunkingStrategy implements ChunkingStrategy {\n readonly name = \"fixed\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n return slidingWindow(text, chunkSize, overlap);\n }\n}\n\nexport class SentenceChunkingStrategy implements ChunkingStrategy {\n readonly name = \"sentence\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n const sentences = text\n .split(/(?<=[.!?])\\s+/)\n .map((s) => s.trim())\n .filter(Boolean);\n return windowChunks(sentences, chunkSize, overlap, \" \");\n }\n}\n\nexport class ParagraphChunkingStrategy implements ChunkingStrategy {\n readonly name = \"paragraph\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n const paragraphs = text\n .split(/\\n\\s*\\n/)\n .map((p) => p.trim())\n .filter(Boolean);\n return windowChunks(paragraphs, chunkSize, overlap, \"\\n\\n\");\n }\n}\n\nexport class MarkdownChunkingStrategy implements ChunkingStrategy {\n readonly name = \"markdown\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n const sections = text\n .split(/(?=^#{1,6}\\s)/m)\n .map((s) => s.trim())\n .filter(Boolean);\n if (sections.length <= 1) {\n return new ParagraphChunkingStrategy().chunk(text, options);\n }\n return windowChunks(sections, chunkSize, overlap, \"\\n\\n\");\n }\n}\n\nexport class HeadingChunkingStrategy implements ChunkingStrategy {\n readonly name = \"heading\";\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n return new MarkdownChunkingStrategy().chunk(text, options);\n }\n}\n\nexport function createChunkingStrategy(\n name: \"fixed\" | \"sentence\" | \"paragraph\" | \"markdown\" | \"heading\" = \"sentence\",\n): ChunkingStrategy {\n switch (name) {\n case \"fixed\":\n return new FixedChunkingStrategy();\n case \"paragraph\":\n return new ParagraphChunkingStrategy();\n case \"markdown\":\n return new MarkdownChunkingStrategy();\n case \"heading\":\n return new HeadingChunkingStrategy();\n case \"sentence\":\n default:\n return new SentenceChunkingStrategy();\n }\n}\n\nexport function inferChunkingStrategy(text: string): ChunkingStrategy {\n if (/^#{1,6}\\s/m.test(text)) {\n return new MarkdownChunkingStrategy();\n }\n return new SentenceChunkingStrategy();\n}\n","/**\r\n * Shared utility helpers.\r\n */\r\n\r\nimport { ValidationError } from \"../errors/index.js\";\r\n\r\n/** Generate a RFC 4122 version 4 UUID. */\r\nexport function createId(): string {\r\n return crypto.randomUUID();\r\n}\r\n\r\n/** Current UTC timestamp as an ISO-8601 string. */\r\nexport function nowIso(): string {\r\n return new Date().toISOString();\r\n}\r\n\r\n/** Parse an ISO-8601 string into a Date. */\r\nexport function parseIso(value: string): Date {\r\n return new Date(value);\r\n}\r\n\r\n/** Assert that a string is non-empty after trimming. */\r\nexport function assertNonEmptyString(\r\n value: unknown,\r\n fieldName: string,\r\n): asserts value is string {\r\n if (typeof value !== \"string\" || value.trim().length === 0) {\r\n throw new ValidationError(`${fieldName} must be a non-empty string`);\r\n }\r\n}\r\n\r\n/** Assert that a value is a finite number within an optional range. */\r\nexport function assertFiniteNumber(\r\n value: unknown,\r\n fieldName: string,\r\n options?: { min?: number; max?: number },\r\n): asserts value is number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n throw new ValidationError(`${fieldName} must be a finite number`);\r\n }\r\n if (options?.min !== undefined && value < options.min) {\r\n throw new ValidationError(`${fieldName} must be >= ${options.min}`);\r\n }\r\n if (options?.max !== undefined && value > options.max) {\r\n throw new ValidationError(`${fieldName} must be <= ${options.max}`);\r\n }\r\n}\r\n\r\nconst EMPTY_META_JSON = \"{}\";\r\n\r\n/** Safely serialize opaque metadata to JSON text. */\r\nexport function serializeMetadata(metadata: Record<string, unknown>): string {\r\n for (const _key in metadata) {\r\n return JSON.stringify(metadata);\r\n }\r\n return EMPTY_META_JSON;\r\n}\r\n\r\n/** Safely deserialize opaque metadata from JSON text. */\r\nexport function deserializeMetadata(raw: string): Record<string, unknown> {\r\n if (!raw || raw === EMPTY_META_JSON) {\r\n return {};\r\n }\r\n try {\r\n const parsed: unknown = JSON.parse(raw);\r\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n return parsed as Record<string, unknown>;\r\n }\r\n return {};\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Convert a Float32Array embedding into a Buffer suitable for sqlite-vec.\r\n */\r\nexport function embeddingToBuffer(embedding: Float32Array): Buffer {\r\n return Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);\r\n}\r\n\r\n/**\r\n * Convert cosine distance (as returned by sqlite-vec) to cosine similarity.\r\n * sqlite-vec cosine distance ≈ `1 - cosine_similarity`, range roughly [0, 2].\r\n */\r\nexport function distanceToSimilarity(distance: number): number {\r\n return 1 - distance;\r\n}\r\n\r\n/**\r\n * Simple async mutex for serializing write-critical sections across\r\n * concurrent async callers in the same process.\r\n */\r\nexport class AsyncMutex {\r\n private chain: Promise<void> = Promise.resolve();\r\n\r\n async runExclusive<T>(fn: () => Promise<T> | T): Promise<T> {\r\n let release!: () => void;\r\n const next = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n const previous = this.chain;\r\n this.chain = previous.then(() => next);\r\n\r\n await previous;\r\n try {\r\n return await fn();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n\r\n/** Join a base URL with a path, avoiding duplicate slashes. */\r\nexport function joinUrl(baseUrl: string, path: string): string {\r\n const base = baseUrl.replace(/\\/+$/, \"\");\r\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${base}${suffix}`;\r\n}\r\n","/**\n * Embedding providers and named factories.\n */\n\nimport type { EmbeddingConfig } from \"../types/index.js\";\nimport { EmbeddingError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\n/** Contract for any embedding backend. */\nexport interface EmbeddingProvider {\n readonly model: string;\n /** Produce a float embedding for the given text. */\n embed(text: string): Promise<Float32Array>;\n /** Optional batch embedding. SDK falls back to parallel `embed` when absent. */\n embedBatch?(texts: string[]): Promise<Float32Array[]>;\n /** Lightweight connectivity + dimension probe. */\n validate(): Promise<{ dimensions: number }>;\n}\n\ninterface OpenAIEmbeddingResponse {\n data?: Array<{ embedding?: number[]; index?: number }>;\n error?: { message?: string };\n}\n\nexport class OpenAICompatibleEmbeddingProvider implements EmbeddingProvider {\n readonly model: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n\n constructor(config: EmbeddingConfig) {\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.model = config.model;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n }\n\n async embed(text: string): Promise<Float32Array> {\n const response = await this.request(text);\n const vector = response.data?.[0]?.embedding;\n if (!vector || vector.length === 0) {\n throw new EmbeddingError(\"Embedding response did not contain a vector\");\n }\n return Float32Array.from(vector);\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n if (texts.length === 0) {\n return [];\n }\n if (texts.length === 1) {\n return [await this.embed(texts[0]!)];\n }\n const response = await this.request(texts);\n const data = response.data ?? [];\n const sorted = [...data].sort(\n (a, b) => (a.index ?? 0) - (b.index ?? 0),\n );\n if (sorted.length !== texts.length) {\n // Fallback: embed sequentially\n const out: Float32Array[] = [];\n for (const text of texts) {\n out.push(await this.embed(text));\n }\n return out;\n }\n return sorted.map((item) => {\n if (!item.embedding || item.embedding.length === 0) {\n throw new EmbeddingError(\"Embedding batch response contained an empty vector\");\n }\n return Float32Array.from(item.embedding);\n });\n }\n\n async validate(): Promise<{ dimensions: number }> {\n try {\n const embedding = await this.embed(\"Wolbarg health check\");\n return { dimensions: embedding.length };\n } catch (error) {\n if (error instanceof EmbeddingError) {\n throw error;\n }\n throw new EmbeddingError(\n `Failed to validate embedding endpoint: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n private async request(\n input: string | string[],\n ): Promise<OpenAIEmbeddingResponse> {\n const url = joinUrl(this.baseUrl, \"/embeddings\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\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,\n }),\n signal: controller.signal,\n });\n\n let body: OpenAIEmbeddingResponse;\n try {\n body = (await res.json()) as OpenAIEmbeddingResponse;\n } catch {\n throw new EmbeddingError(\n `Embedding endpoint returned non-JSON response (HTTP ${res.status})`,\n );\n }\n\n if (!res.ok) {\n const message = body.error?.message ?? `HTTP ${res.status}`;\n throw new EmbeddingError(`Embedding request failed: ${message}`);\n }\n\n return body;\n } catch (error) {\n if (error instanceof EmbeddingError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new EmbeddingError(\n `Embedding request timed out after ${this.timeoutMs}ms`,\n );\n }\n throw new EmbeddingError(\n `Embedding request failed: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\nexport function createEmbeddingProvider(\n config: EmbeddingConfig,\n): EmbeddingProvider {\n return new OpenAICompatibleEmbeddingProvider(config);\n}\n\nfunction factory(\n defaults: Partial<EmbeddingConfig> & Pick<EmbeddingConfig, \"baseUrl\">,\n) {\n return (config: Omit<EmbeddingConfig, \"baseUrl\"> & { baseUrl?: string }): EmbeddingProvider =>\n createEmbeddingProvider({\n baseUrl: config.baseUrl ?? defaults.baseUrl,\n apiKey: config.apiKey,\n model: config.model,\n timeoutMs: config.timeoutMs,\n });\n}\n\nexport const openaiCompatibleEmbedding = (\n config: EmbeddingConfig,\n): EmbeddingProvider => createEmbeddingProvider(config);\n\nexport const openaiEmbedding = factory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\nexport const ollamaEmbedding = factory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\nexport const openRouterEmbedding = factory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n\nexport const lmStudioEmbedding = factory({\n baseUrl: \"http://127.0.0.1:1234/v1\",\n});\n\nexport const geminiEmbedding = factory({\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n});\n\nexport const togetherEmbedding = factory({\n baseUrl: \"https://api.together.xyz/v1\",\n});\n\nexport const vllmEmbedding = factory({\n baseUrl: \"http://127.0.0.1:8000/v1\",\n});\n\n/** Embed many texts, using batch API when available. */\nexport async function embedMany(\n provider: EmbeddingProvider,\n texts: string[],\n concurrency = 8,\n): Promise<Float32Array[]> {\n if (provider.embedBatch) {\n return provider.embedBatch(texts);\n }\n const out: Float32Array[] = new Array(texts.length);\n let index = 0;\n async function worker(): Promise<void> {\n while (index < texts.length) {\n const current = index;\n index += 1;\n out[current] = await provider.embed(texts[current]!);\n }\n }\n await Promise.all(\n Array.from({ length: Math.min(concurrency, texts.length) }, () => worker()),\n );\n return out;\n}\n","/**\n * LLM provider abstractions and OpenAI-compatible chat implementation.\n * Used exclusively for memory compression (and future ORC features).\n */\n\nimport type { LlmConfig } from \"../types/index.js\";\nimport { CompressionError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/** Contract for any chat completion backend. */\nexport interface LlmProvider {\n readonly model: string;\n complete(messages: ChatMessage[]): Promise<string>;\n /** Lightweight connectivity probe. */\n validate(): Promise<void>;\n}\n\ninterface OpenAIChatResponse {\n choices?: Array<{ message?: { content?: string | null } }>;\n error?: { message?: string };\n}\n\nexport class OpenAICompatibleLlmProvider implements LlmProvider {\n readonly model: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly temperature: number;\n private readonly maxTokens: number;\n private readonly timeoutMs: number;\n\n constructor(config: LlmConfig) {\n this.baseUrl = config.baseUrl;\n this.apiKey = config.apiKey;\n this.model = config.model;\n this.temperature = config.temperature ?? 0.2;\n this.maxTokens = config.maxTokens ?? 4096;\n this.timeoutMs = config.timeoutMs ?? 60_000;\n }\n\n async complete(messages: ChatMessage[]): Promise<string> {\n const response = await this.request(messages);\n const content = response.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || content.trim().length === 0) {\n throw new CompressionError(\"LLM response did not contain text content\");\n }\n return content.trim();\n }\n\n async validate(): Promise<void> {\n try {\n await this.complete([\n {\n role: \"user\",\n content: 'Reply with exactly the word \"ok\".',\n },\n ]);\n } catch (error) {\n if (error instanceof CompressionError) {\n throw new CompressionError(\n `Failed to validate LLM endpoint: ${error.message}`,\n { cause: error },\n );\n }\n throw new CompressionError(\n `Failed to validate LLM endpoint: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n private async request(messages: ChatMessage[]): Promise<OpenAIChatResponse> {\n const url = joinUrl(this.baseUrl, \"/chat/completions\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\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 messages,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n }),\n signal: controller.signal,\n });\n\n let body: OpenAIChatResponse;\n try {\n body = (await res.json()) as OpenAIChatResponse;\n } catch {\n throw new CompressionError(\n `LLM endpoint returned non-JSON response (HTTP ${res.status})`,\n );\n }\n\n if (!res.ok) {\n const message = body.error?.message ?? `HTTP ${res.status}`;\n throw new CompressionError(`LLM request failed: ${message}`);\n }\n\n return body;\n } catch (error) {\n if (error instanceof CompressionError) {\n throw error;\n }\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new CompressionError(\n `LLM request timed out after ${this.timeoutMs}ms`,\n );\n }\n throw new CompressionError(`LLM request failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\nexport function createLlmProvider(config: LlmConfig): LlmProvider {\n return new OpenAICompatibleLlmProvider(config);\n}\n\nfunction llmFactory(\n defaults: Partial<LlmConfig> & Pick<LlmConfig, \"baseUrl\">,\n) {\n return (config: Omit<LlmConfig, \"baseUrl\"> & { baseUrl?: string }): LlmProvider =>\n createLlmProvider({\n baseUrl: config.baseUrl ?? defaults.baseUrl,\n apiKey: config.apiKey,\n model: config.model,\n temperature: config.temperature,\n maxTokens: config.maxTokens,\n timeoutMs: config.timeoutMs,\n });\n}\n\nexport const openaiCompatibleLlm = (config: LlmConfig): LlmProvider =>\n createLlmProvider(config);\n\nexport const openaiLlm = llmFactory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\nexport const ollamaLlm = llmFactory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\nexport const openRouterLlm = llmFactory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n","/**\n * Document parsers for ingest pipeline.\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ConfigurationError } from \"../errors/index.js\";\n\nexport interface ParsedDocument {\n text: string;\n mimeType: string;\n filename?: string;\n isImage: boolean;\n imageBuffer?: Buffer;\n}\n\nexport interface DocumentParserProvider {\n readonly name: string;\n readonly extensions: string[];\n parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument>;\n}\n\nfunction extOf(filename?: string): string {\n if (!filename) {\n return \"\";\n }\n return path.extname(filename).toLowerCase();\n}\n\nexport class TextParser implements DocumentParserProvider {\n readonly name = \"text\";\n readonly extensions = [\".txt\", \".md\", \".markdown\", \".csv\", \".json\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n const ext = extOf(input.filename);\n let text = input.buffer.toString(\"utf8\");\n if (ext === \".json\") {\n try {\n text = JSON.stringify(JSON.parse(text), null, 2);\n } catch {\n // keep raw\n }\n }\n return {\n text,\n mimeType: input.mimeType ?? \"text/plain\",\n filename: input.filename,\n isImage: false,\n };\n }\n}\n\nexport class ImageParser implements DocumentParserProvider {\n readonly name = \"image\";\n readonly extensions = [\".png\", \".jpg\", \".jpeg\", \".webp\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n const ext = extOf(input.filename);\n const mime =\n input.mimeType ??\n (ext === \".png\"\n ? \"image/png\"\n : ext === \".webp\"\n ? \"image/webp\"\n : \"image/jpeg\");\n return {\n text: \"\",\n mimeType: mime,\n filename: input.filename,\n isImage: true,\n imageBuffer: input.buffer,\n };\n }\n}\n\nexport class PdfParser implements DocumentParserProvider {\n readonly name = \"pdf\";\n readonly extensions = [\".pdf\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n try {\n const mod = await import(\"pdf-parse\");\n // pdf-parse v1: default export is (buffer) => Promise<{ text }>\n // pdf-parse v2: named PDFParse class\n const maybeClass = (mod as { PDFParse?: new (opts: { data: Buffer }) => {\n getText: () => Promise<{ text: string }>;\n destroy?: () => Promise<void>;\n } }).PDFParse;\n let text = \"\";\n if (typeof maybeClass === \"function\") {\n const parser = new maybeClass({ data: input.buffer });\n try {\n const result = await parser.getText();\n text = result.text ?? \"\";\n } finally {\n await parser.destroy?.();\n }\n } else {\n const pdfParse =\n (mod as { default?: (buf: Buffer) => Promise<{ text: string }> }).default ??\n (mod as unknown as (buf: Buffer) => Promise<{ text: string }>);\n if (typeof pdfParse !== \"function\") {\n throw new Error(\"pdf-parse export is not a function\");\n }\n const result = await pdfParse(input.buffer);\n text = result.text ?? \"\";\n }\n return {\n text,\n mimeType: \"application/pdf\",\n filename: input.filename,\n isImage: false,\n };\n } catch (error) {\n if (\n error instanceof ConfigurationError\n ) {\n throw error;\n }\n const detail = error instanceof Error ? error.message : String(error);\n throw new ConfigurationError(\n `PDF ingest failed (${detail}). Install compatible pdf-parse: npm install pdf-parse@1.1.4`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n}\n\nexport class DocxParser implements DocumentParserProvider {\n readonly name = \"docx\";\n readonly extensions = [\".docx\"];\n\n async parse(input: {\n buffer: Buffer;\n filename?: string;\n mimeType?: string;\n }): Promise<ParsedDocument> {\n try {\n const mod = await import(\"mammoth\" as string);\n const extractRawText =\n (mod as { extractRawText?: (opts: { buffer: Buffer }) => Promise<{ value: string }> })\n .extractRawText ??\n (mod as { default?: { extractRawText: (opts: { buffer: Buffer }) => Promise<{ value: string }> } })\n .default?.extractRawText;\n if (!extractRawText) {\n throw new Error(\"mammoth.extractRawText unavailable\");\n }\n const result = await extractRawText({ buffer: input.buffer });\n return {\n text: result.value ?? \"\",\n mimeType:\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n filename: input.filename,\n isImage: false,\n };\n } catch {\n throw new ConfigurationError(\n 'DOCX ingest requires the optional \"mammoth\" package. Install it with: npm install mammoth',\n );\n }\n }\n}\n\nconst DEFAULT_PARSERS: DocumentParserProvider[] = [\n new TextParser(),\n new ImageParser(),\n new PdfParser(),\n new DocxParser(),\n];\n\nexport function resolveParser(\n filename?: string,\n mimeType?: string,\n parsers: DocumentParserProvider[] = DEFAULT_PARSERS,\n): DocumentParserProvider {\n const ext = extOf(filename);\n if (ext) {\n const byExt = parsers.find((p) => p.extensions.includes(ext));\n if (byExt) {\n return byExt;\n }\n }\n if (mimeType?.startsWith(\"image/\")) {\n return parsers.find((p) => p.name === \"image\") ?? new ImageParser();\n }\n if (mimeType === \"application/pdf\") {\n return parsers.find((p) => p.name === \"pdf\") ?? new PdfParser();\n }\n return parsers.find((p) => p.name === \"text\") ?? new TextParser();\n}\n\nexport async function loadIngestSource(source: {\n path?: string;\n buffer?: Buffer;\n text?: string;\n filename?: string;\n mimeType?: string;\n}): Promise<{ buffer: Buffer; filename?: string; mimeType?: string; rawText?: string }> {\n if (source.text !== undefined) {\n return {\n buffer: Buffer.from(source.text, \"utf8\"),\n filename: source.filename ?? \"document.txt\",\n mimeType: source.mimeType ?? \"text/plain\",\n rawText: source.text,\n };\n }\n if (source.buffer) {\n return {\n buffer: source.buffer,\n filename: source.filename,\n mimeType: source.mimeType,\n };\n }\n if (source.path) {\n const buffer = await fs.readFile(source.path);\n return {\n buffer,\n filename: path.basename(source.path),\n mimeType: source.mimeType,\n };\n }\n throw new ConfigurationError(\"ingest source must include path, buffer, or text\");\n}\n\nexport { DEFAULT_PARSERS };\n","/**\n * Constructor options for Wolbarg v0.3.\n */\n\nimport type { ChunkingStrategy } from \"../chunking/index.js\";\nimport type { CompressionProvider } from \"../compression/index.js\";\nimport type { EmbeddingProvider } from \"../embedding/index.js\";\nimport type { KeywordSearchProvider } from \"../keyword/index.js\";\nimport type { LlmProvider } from \"../llm/index.js\";\nimport type { OCRProvider } from \"../ocr/index.js\";\nimport type { RerankerProvider } from \"../rerank/index.js\";\nimport type { StorageProvider } from \"../storage/types.js\";\nimport type { CheckpointProvider } from \"../providers/interfaces/CheckpointProvider.js\";\nimport type { TelemetryProvider } from \"../providers/interfaces/TelemetryProvider.js\";\nimport type {\n DatabaseConfig,\n EmbeddingConfig,\n LlmConfig,\n RetrievalConfig,\n StorageConfig,\n TelemetryConfig,\n} from \"../types/index.js\";\nimport type { VisionProvider } from \"../vision/index.js\";\n\nexport type EmbeddingInput = EmbeddingProvider | EmbeddingConfig;\nexport type LlmInput = LlmProvider | LlmConfig;\nexport type StorageInput = StorageProvider | StorageConfig | DatabaseConfig;\n\nexport interface WolbargOptionsBase {\n /** Organization namespace isolating memories within a shared database. */\n organization: string;\n /**\n * Storage provider instance or config.\n * Prefer `database` in v0.3 docs; `storage` remains fully supported.\n */\n storage?: StorageInput;\n /**\n * v0.3 alias for `storage`. Accepts `{ provider, url }` or `{ provider, connectionString }`.\n */\n database?: StorageInput;\n /** Embedding provider instance or config. */\n embedding: EmbeddingInput;\n /** Optional independent telemetry system (separate database). */\n telemetry?: TelemetryConfig | TelemetryProvider;\n /** Optional checkpoint provider override (defaults to SQLite when file-backed). */\n checkpoint?: CheckpointProvider;\n /** Optional directory for SQLite checkpoints. */\n checkpointDirectory?: string;\n /** Optional reranker — skipped when absent. */\n reranker?: RerankerProvider;\n /** Optional keyword search — enables hybrid recall when present. */\n keywordSearch?: KeywordSearchProvider;\n /** Optional OCR for image ingest. */\n ocr?: OCRProvider;\n /** Optional vision model for image captions. */\n vision?: VisionProvider;\n /** Optional compression provider (overrides llm-backed default). */\n compression?: CompressionProvider;\n /** Optional default chunking strategy for ingest. */\n chunking?: ChunkingStrategy;\n /** Optional retrieval defaults. */\n retrieval?: RetrievalConfig;\n}\n\nexport interface WolbargOptionsWithoutLlm extends WolbargOptionsBase {\n llm?: undefined;\n}\n\nexport interface WolbargOptionsWithLlm extends WolbargOptionsBase {\n /** Chat model used for compression. */\n llm: LlmInput;\n}\n\nexport type WolbargOptions =\n | WolbargOptionsWithoutLlm\n | WolbargOptionsWithLlm;\n\nexport function isEmbeddingProvider(\n value: EmbeddingInput,\n): value is EmbeddingProvider {\n return typeof (value as EmbeddingProvider).embed === \"function\";\n}\n\nexport function isLlmProvider(value: LlmInput): value is LlmProvider {\n return typeof (value as LlmProvider).complete === \"function\";\n}\n\nexport function isStorageProvider(\n value: StorageInput,\n): value is StorageProvider {\n return typeof (value as StorageProvider).open === \"function\";\n}\n\nexport function isTelemetryProvider(\n value: TelemetryConfig | TelemetryProvider,\n): value is TelemetryProvider {\n return typeof (value as TelemetryProvider).emit === \"function\";\n}\n\n/** Resolve connection path from url or connectionString. */\nexport function resolveDatabaseUrl(\n config: DatabaseConfig | StorageConfig,\n): string {\n const url =\n (\"url\" in config && config.url) ||\n (\"connectionString\" in config && config.connectionString) ||\n \"\";\n return typeof url === \"string\" ? url : \"\";\n}\n","/**\n * In-memory metadata filter evaluation (used as fallback / post-filter).\n */\n\nimport type { MemoryMetadata } from \"../types/index.js\";\nimport type { MetadataComparison, MetadataFilter } from \"./types.js\";\n\nfunction getField(metadata: MemoryMetadata, field: string): unknown {\n const parts = field.split(\".\");\n let current: unknown = metadata;\n for (const part of parts) {\n if (current === null || typeof current !== \"object\" || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction compare(value: unknown, op: MetadataComparison): boolean {\n if (\"eq\" in op) {\n return value === op.eq;\n }\n if (\"contains\" in op) {\n if (typeof value === \"string\") {\n return value.includes(op.contains);\n }\n if (Array.isArray(value)) {\n return value.some((item) => String(item).includes(op.contains));\n }\n return false;\n }\n if (\"gt\" in op) {\n return value != null && (value as string | number) > op.gt;\n }\n if (\"gte\" in op) {\n return value != null && (value as string | number) >= op.gte;\n }\n if (\"lt\" in op) {\n return value != null && (value as string | number) < op.lt;\n }\n if (\"lte\" in op) {\n return value != null && (value as string | number) <= op.lte;\n }\n if (\"between\" in op) {\n const [lo, hi] = op.between;\n return value != null && value >= lo && value <= hi;\n }\n return false;\n}\n\n/** Evaluate a metadata filter against an opaque metadata object. */\nexport function matchesMetadata(\n metadata: MemoryMetadata,\n filter: MetadataFilter,\n): boolean {\n if (\"and\" in filter) {\n return filter.and.every((f) => matchesMetadata(metadata, f));\n }\n if (\"or\" in filter) {\n return filter.or.some((f) => matchesMetadata(metadata, f));\n }\n if (\"not\" in filter) {\n return !matchesMetadata(metadata, filter.not);\n }\n return compare(getField(metadata, filter.field), filter.op);\n}\n","/**\n * SQL schema constants and migration statements.\n */\n\nexport const SCHEMA_VERSION = 2;\n\nexport const META_KEYS = {\n schemaVersion: \"schema_version\",\n embeddingDimensions: \"embedding_dimensions\",\n vectorBackend: \"vector_backend\",\n} as const;\n\n/** Vector storage backend used by the SQLite provider. */\nexport type VectorBackend = \"sqlite-vec\" | \"blob\";\n\nexport const CREATE_META_TABLE = `\nCREATE TABLE IF NOT EXISTS Wolbarg_meta (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n);\n`;\n\nexport const CREATE_MEMORIES_TABLE = `\nCREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY NOT NULL,\n organization TEXT NOT NULL,\n agent TEXT NOT NULL,\n content_text TEXT NOT NULL,\n metadata_json TEXT NOT NULL DEFAULT '{}',\n archived INTEGER NOT NULL DEFAULT 0 CHECK (archived IN (0, 1)),\n compressed_into TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (compressed_into) REFERENCES memories(id) ON DELETE SET NULL\n);\n`;\n\nexport const CREATE_HISTORY_TABLE = `\nCREATE TABLE IF NOT EXISTS memory_history (\n id TEXT PRIMARY KEY NOT NULL,\n memory_id TEXT NOT NULL,\n event_type TEXT NOT NULL CHECK (event_type IN ('created', 'archived', 'compressed')),\n related_memory_id TEXT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE\n);\n`;\n\n/** Fallback embedding store used when sqlite-vec is unavailable on the platform. */\nexport const CREATE_BLOB_EMBEDDINGS_TABLE = `\nCREATE TABLE IF NOT EXISTS memory_embeddings_blob (\n memory_rowid INTEGER PRIMARY KEY NOT NULL,\n embedding BLOB NOT NULL\n);\n`;\n\n/** FTS5 index for keyword / BM25 search (schema v2). */\nexport const CREATE_FTS_TABLE = `\nCREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(\n content_text,\n memory_id UNINDEXED,\n organization UNINDEXED,\n agent UNINDEXED,\n tokenize = 'porter unicode61'\n);\n`;\n\nexport const CREATE_INDEXES = [\n `CREATE INDEX IF NOT EXISTS idx_memories_org_agent ON memories(organization, agent);`,\n `CREATE INDEX IF NOT EXISTS idx_memories_org_archived ON memories(organization, archived);`,\n /** Active-set covering path for org-scoped list / stats / compress. */\n `CREATE INDEX IF NOT EXISTS idx_memories_org_active_created\n ON memories(organization, created_at) WHERE archived = 0;`,\n `CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);`,\n `CREATE INDEX IF NOT EXISTS idx_history_memory_id ON memory_history(memory_id);`,\n] as const;\n\n/**\n * Build the vec0 virtual table DDL for a fixed embedding dimensionality.\n * Cosine distance enables similarity = 1 - distance.\n */\nexport function buildVectorTableSql(dimensions: number): string {\n if (!Number.isInteger(dimensions) || dimensions <= 0) {\n throw new Error(`Invalid embedding dimensions: ${dimensions}`);\n }\n return `\nCREATE VIRTUAL TABLE IF NOT EXISTS memory_embeddings USING vec0(\n memory_rowid INTEGER PRIMARY KEY,\n embedding float[${dimensions}] distance_metric=cosine\n);\n`;\n}\n","/**\n * Prepared-statement SQL templates for the SQLite provider.\n */\n\nexport const SQL = {\n getMeta: `SELECT value FROM Wolbarg_meta WHERE key = ?`,\n setMeta: `\n INSERT INTO Wolbarg_meta (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `,\n\n insertMemory: `\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, 0, NULL, ?, ?)\n RETURNING rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n `,\n\n getMemoryById: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE id = ? AND organization = ?\n `,\n\n getMemoryByRowid: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE rowid = ? AND organization = ?\n `,\n\n getMemoriesByRowidsPrefix: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE organization = ? AND rowid IN (\n `,\n\n listMemoriesBase: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE organization = ?\n `,\n\n insertEmbedding: `\n INSERT INTO memory_embeddings (memory_rowid, embedding) VALUES (?, ?)\n `,\n\n deleteEmbedding: `\n DELETE FROM memory_embeddings WHERE memory_rowid = ?\n `,\n\n searchVectors: `\n SELECT memory_rowid, distance\n FROM memory_embeddings\n WHERE embedding MATCH ?\n AND k = ?\n `,\n\n insertEmbeddingBlob: `\n INSERT INTO memory_embeddings_blob (memory_rowid, embedding) VALUES (?, ?)\n `,\n\n deleteEmbeddingBlob: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid = ?\n `,\n\n listEmbeddingsBlob: `\n SELECT memory_rowid, embedding FROM memory_embeddings_blob\n `,\n\n archiveMemory: `\n UPDATE memories\n SET archived = 1,\n compressed_into = ?,\n updated_at = ?\n WHERE id = ? AND organization = ? AND archived = 0\n `,\n\n deleteMemoryById: `\n DELETE FROM memories WHERE id = ? AND organization = ?\n `,\n\n deleteMemoriesByOrg: `\n DELETE FROM memories WHERE organization = ?\n `,\n\n deleteMemoriesByOrgAgent: `\n DELETE FROM memories WHERE organization = ? AND agent = ?\n `,\n\n insertHistory: `\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES (?, ?, ?, ?, ?)\n `,\n\n getHistory: `\n SELECT id, memory_id, event_type, related_memory_id, created_at\n FROM memory_history\n WHERE memory_id = ?\n ORDER BY created_at ASC\n `,\n\n countMemories: `\n SELECT COUNT(*) AS count FROM memories WHERE organization = ?\n `,\n\n countActiveMemories: `\n SELECT COUNT(*) AS count FROM memories WHERE organization = ? AND archived = 0\n `,\n\n countArchivedMemories: `\n SELECT COUNT(*) AS count FROM memories WHERE organization = ? AND archived = 1\n `,\n\n countAgents: `\n SELECT COUNT(DISTINCT agent) AS count FROM memories WHERE organization = ? AND archived = 0\n `,\n\n /** FTS ranked by BM25 (archived rows are deleted from FTS on archive). */\n searchFts: `\n SELECT memory_id, bm25(memories_fts) AS rank\n FROM memories_fts\n WHERE memories_fts MATCH ?\n AND organization = ?\n ORDER BY rank\n LIMIT ?\n `,\n\n listRowidsForOrg: `\n SELECT rowid FROM memories WHERE organization = ?\n `,\n\n listRowidsForOrgAgent: `\n SELECT rowid FROM memories WHERE organization = ? AND agent = ?\n `,\n\n vectorTableExists: `\n SELECT name FROM sqlite_master\n WHERE type = 'table' AND name = 'memory_embeddings'\n `,\n\n updateMemoryContent: `\n UPDATE memories\n SET content_text = COALESCE(?, content_text),\n metadata_json = COALESCE(?, metadata_json),\n updated_at = ?\n WHERE id = ? AND organization = ?\n `,\n\n insertFts: `\n INSERT INTO memories_fts (content_text, memory_id, organization, agent)\n VALUES (?, ?, ?, ?)\n `,\n\n deleteFts: `\n DELETE FROM memories_fts WHERE memory_id = ?\n `,\n} as const;\n","/**\r\n * Cosine distance helpers for the blob vector fallback backend.\r\n */\r\n\r\n/** Cosine distance = 1 - cosine_similarity (matches sqlite-vec cosine metric). */\r\nexport function cosineDistance(a: Float32Array, b: Float32Array): number {\r\n const len = Math.min(a.length, b.length);\r\n let dot = 0;\r\n let normA = 0;\r\n let normB = 0;\r\n for (let i = 0; i < len; i += 1) {\r\n const av = a[i] ?? 0;\r\n const bv = b[i] ?? 0;\r\n dot += av * bv;\r\n normA += av * av;\r\n normB += bv * bv;\r\n }\r\n if (normA === 0 || normB === 0) {\r\n return 1;\r\n }\r\n const similarity = dot / (Math.sqrt(normA) * Math.sqrt(normB));\r\n return 1 - similarity;\r\n}\r\n\r\n/**\r\n * Decode a float32 embedding from a SQLite BLOB.\r\n * Avoids a copy when the underlying ArrayBuffer is already aligned/owned.\r\n */\r\nexport function bufferToEmbedding(data: Uint8Array | Buffer): Float32Array {\r\n const byteOffset = (data as Uint8Array).byteOffset ?? 0;\r\n const byteLength = data.byteLength;\r\n if (byteOffset % Float32Array.BYTES_PER_ELEMENT === 0) {\r\n return new Float32Array(\r\n (data as Uint8Array).buffer,\r\n byteOffset,\r\n byteLength / Float32Array.BYTES_PER_ELEMENT,\r\n );\r\n }\r\n const copy = new Uint8Array(byteLength);\r\n copy.set(data);\r\n return new Float32Array(copy.buffer);\r\n}\r\n","/**\n * Contiguous in-memory vector index for blob backends (e.g. win32-arm64\n * without sqlite-vec). Stores L2-normalized embeddings for O(n) top-k\n * via fused multiply-add + partial selection — no per-search allocations\n * of distance arrays when n is large.\n */\n\nexport interface InMemoryHit {\n memoryRowid: number;\n distance: number;\n}\n\nexport class InMemoryVectorIndex {\n private readonly dims: number;\n private rowids: number[] = [];\n private data: Float32Array;\n private count = 0;\n private readonly rowidToSlot = new Map<number, number>();\n\n constructor(dimensions: number, initialCapacity = 256) {\n this.dims = dimensions;\n this.data = new Float32Array(initialCapacity * dimensions);\n }\n\n get size(): number {\n return this.count;\n }\n\n clear(): void {\n this.rowids.length = 0;\n this.rowidToSlot.clear();\n this.count = 0;\n }\n\n upsert(rowid: number, embedding: Float32Array): void {\n const existing = this.rowidToSlot.get(rowid);\n const slot =\n existing !== undefined\n ? existing\n : (() => {\n this.ensureCapacity(this.count + 1);\n const s = this.count;\n this.rowids[s] = rowid;\n this.rowidToSlot.set(rowid, s);\n this.count += 1;\n return s;\n })();\n\n const dims = this.dims;\n const base = slot * dims;\n const data = this.data;\n const len = embedding.length < dims ? embedding.length : dims;\n let norm = 0;\n for (let i = 0; i < len; i += 1) {\n const v = embedding[i]!;\n data[base + i] = v;\n norm += v * v;\n }\n for (let i = len; i < dims; i += 1) {\n data[base + i] = 0;\n }\n if (norm > 0) {\n const inv = 1 / Math.sqrt(norm);\n for (let i = 0; i < len; i += 1) {\n data[base + i]! *= inv;\n }\n }\n }\n\n remove(rowid: number): void {\n const slot = this.rowidToSlot.get(rowid);\n if (slot === undefined) {\n return;\n }\n const last = this.count - 1;\n if (slot !== last) {\n const lastRowid = this.rowids[last]!;\n this.data.copyWithin(\n slot * this.dims,\n last * this.dims,\n (last + 1) * this.dims,\n );\n this.rowids[slot] = lastRowid;\n this.rowidToSlot.set(lastRowid, slot);\n }\n this.rowidToSlot.delete(rowid);\n this.count = last;\n }\n\n /** Top-k by cosine distance (1 - dot) assuming query is L2-normalized. */\n search(queryNormalized: Float32Array, topK: number): InMemoryHit[] {\n const n = this.count;\n if (n === 0 || topK <= 0) {\n return [];\n }\n const dims = this.dims;\n const data = this.data;\n const rowids = this.rowids;\n const k = topK < n ? topK : n;\n\n // Small-k: maintain a max-heap of distances (worst of the best-k at root).\n const heapDist = new Float64Array(k);\n const heapRow = new Int32Array(k);\n let heapSize = 0;\n\n for (let i = 0; i < n; i += 1) {\n const base = i * dims;\n let dot = 0;\n // Manual 4-wide unroll for hot loop\n let d = 0;\n for (; d + 3 < dims; d += 4) {\n dot +=\n queryNormalized[d]! * data[base + d]! +\n queryNormalized[d + 1]! * data[base + d + 1]! +\n queryNormalized[d + 2]! * data[base + d + 2]! +\n queryNormalized[d + 3]! * data[base + d + 3]!;\n }\n for (; d < dims; d += 1) {\n dot += queryNormalized[d]! * data[base + d]!;\n }\n const distance = 1 - dot;\n\n if (heapSize < k) {\n heapDist[heapSize] = distance;\n heapRow[heapSize] = rowids[i]!;\n heapSize += 1;\n if (heapSize === k) {\n buildMaxHeap(heapDist, heapRow, k);\n }\n } else if (distance < heapDist[0]!) {\n heapDist[0] = distance;\n heapRow[0] = rowids[i]!;\n siftDown(heapDist, heapRow, 0, k);\n }\n }\n\n const hits: InMemoryHit[] = new Array(heapSize);\n for (let i = 0; i < heapSize; i += 1) {\n hits[i] = { memoryRowid: heapRow[i]!, distance: heapDist[i]! };\n }\n hits.sort((a, b) => a.distance - b.distance);\n return hits;\n }\n\n private ensureCapacity(needed: number): void {\n if (needed * this.dims <= this.data.length) {\n return;\n }\n let cap = this.data.length / this.dims;\n if (cap < 1) cap = 1;\n while (cap < needed) cap *= 2;\n const next = new Float32Array(cap * this.dims);\n next.set(this.data.subarray(0, this.count * this.dims));\n this.data = next;\n }\n}\n\n/** L2-normalize into a new Float32Array of exactly `dims` length. */\nexport function normalizeEmbedding(\n embedding: Float32Array,\n dims = embedding.length,\n): Float32Array {\n return normalizeInto(embedding, dims);\n}\n\nfunction normalizeInto(embedding: Float32Array, dims: number): Float32Array {\n const out = new Float32Array(dims);\n const len = embedding.length < dims ? embedding.length : dims;\n let norm = 0;\n for (let i = 0; i < len; i += 1) {\n const v = embedding[i]!;\n out[i] = v;\n norm += v * v;\n }\n if (norm === 0) {\n return out;\n }\n const inv = 1 / Math.sqrt(norm);\n for (let i = 0; i < len; i += 1) {\n out[i]! *= inv;\n }\n return out;\n}\n\nfunction buildMaxHeap(\n dist: Float64Array,\n rows: Int32Array,\n n: number,\n): void {\n for (let i = (n >> 1) - 1; i >= 0; i -= 1) {\n siftDown(dist, rows, i, n);\n }\n}\n\nfunction siftDown(\n dist: Float64Array,\n rows: Int32Array,\n i: number,\n n: number,\n): void {\n for (;;) {\n let largest = i;\n const left = (i << 1) + 1;\n const right = left + 1;\n if (left < n && dist[left]! > dist[largest]!) largest = left;\n if (right < n && dist[right]! > dist[largest]!) largest = right;\n if (largest === i) return;\n const td = dist[i]!;\n dist[i] = dist[largest]!;\n dist[largest] = td;\n const tr = rows[i]!;\n rows[i] = rows[largest]!;\n rows[largest] = tr;\n i = largest;\n }\n}\n","/**\n * SQLite + sqlite-vec database provider (Node.js built-in `node:sqlite`).\n *\n * Responsibilities:\n * - WAL mode + crash-safe pragmas\n * - Automatic migrations / schema creation\n * - Prepared statements\n * - ACID transactions\n * - Vector index via sqlite-vec vec0 when available\n * - Blob + cosine fallback on unsupported platforms (e.g. win32-arm64)\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync, type StatementSync } from \"node:sqlite\";\nimport * as sqliteVec from \"sqlite-vec\";\n\nimport { DatabaseError, InitializationError } from \"../../errors/index.js\";\nimport { matchesMetadata } from \"../../filters/match.js\";\nimport {\n CREATE_BLOB_EMBEDDINGS_TABLE,\n CREATE_FTS_TABLE,\n CREATE_HISTORY_TABLE,\n CREATE_INDEXES,\n CREATE_MEMORIES_TABLE,\n CREATE_META_TABLE,\n META_KEYS,\n SCHEMA_VERSION,\n buildVectorTableSql,\n type VectorBackend,\n} from \"../../schema/index.js\";\nimport { SQL } from \"../../sql/index.js\";\nimport {\n deserializeMetadata,\n embeddingToBuffer,\n serializeMetadata,\n} from \"../../utils/index.js\";\nimport { bufferToEmbedding } from \"../../utils/vector.js\";\nimport {\n InMemoryVectorIndex,\n normalizeEmbedding,\n} from \"../../utils/vector-index.js\";\nimport type {\n HistoryRow,\n InsertMemoryInput,\n MemoryRow,\n RepositoryFilter,\n StorageProvider,\n UpdateMemoryInput,\n VectorSearchHit,\n} from \"../types.js\";\n\ninterface PreparedStatements {\n getMeta: StatementSync;\n setMeta: StatementSync;\n insertMemory: StatementSync;\n updateMemoryContent: StatementSync;\n getMemoryById: StatementSync;\n getMemoryByRowid: StatementSync;\n insertEmbedding: StatementSync | null;\n deleteEmbedding: StatementSync | null;\n searchVectors: StatementSync | null;\n insertEmbeddingBlob: StatementSync | null;\n deleteEmbeddingBlob: StatementSync | null;\n listEmbeddingsBlob: StatementSync | null;\n archiveMemory: StatementSync;\n deleteMemoryById: StatementSync;\n deleteMemoriesByOrg: StatementSync;\n deleteMemoriesByOrgAgent: StatementSync;\n insertHistory: StatementSync;\n getHistory: StatementSync;\n countMemories: StatementSync;\n countActiveMemories: StatementSync;\n countArchivedMemories: StatementSync;\n countAgents: StatementSync;\n listRowidsForOrg: StatementSync;\n listRowidsForOrgAgent: StatementSync;\n vectorTableExists: StatementSync;\n blobTableExists: StatementSync;\n insertFts: StatementSync | null;\n deleteFts: StatementSync | null;\n searchFts: StatementSync | null;\n}\n\nexport interface SqliteProviderOptions {\n connectionString: string;\n}\n\nexport class SqliteStorageProvider implements StorageProvider {\n readonly name = \"sqlite\";\n\n private readonly connectionString: string;\n private db: DatabaseSync | null = null;\n private statements: PreparedStatements | null = null;\n private vectorDimensions: number | null = null;\n private vectorBackend: VectorBackend | null = null;\n private sqliteVecLoaded = false;\n /** Hot in-process ANN for blob backend (sqlite-vec unavailable platforms). */\n private memoryIndex: InMemoryVectorIndex | null = null;\n private memoryIndexDirty = false;\n /** Resolved absolute path (or `:memory:`) — avoid re-resolving on size checks. */\n private resolvedPath: string | null = null;\n\n constructor(options: SqliteProviderOptions) {\n this.connectionString = options.connectionString;\n }\n\n /** Absolute or relative path / `:memory:` used by this provider. */\n get path(): string {\n return this.connectionString;\n }\n\n async open(): Promise<void> {\n try {\n const dbPath = this.resolvePath(this.connectionString);\n this.resolvedPath = dbPath;\n if (dbPath !== \":memory:\") {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n }\n\n const db = new DatabaseSync(dbPath, { allowExtension: true });\n this.db = db;\n\n // WAL + NORMAL is the production-safe default (multi-reader friendly).\n // Single-process SDK keeps locking_mode=NORMAL (not EXCLUSIVE) so other\n // tools/processes can open the same file for backups or inspection.\n db.exec(\"PRAGMA journal_mode = WAL;\");\n db.exec(`\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n PRAGMA busy_timeout = 5000;\n PRAGMA temp_store = MEMORY;\n PRAGMA cache_size = -65536;\n PRAGMA mmap_size = 268435456;\n PRAGMA wal_autocheckpoint = 1000;\n PRAGMA recursive_triggers = OFF;\n `);\n\n this.sqliteVecLoaded = this.tryLoadSqliteVec(db);\n this.runMigrations(db);\n this.statements = this.prepareStatements(db);\n this.ensureFtsConsistency(db);\n\n const backend = this.readMetaString(META_KEYS.vectorBackend) as VectorBackend | null;\n const dims = this.readMetaNumber(META_KEYS.embeddingDimensions);\n\n if (backend) {\n this.vectorBackend = backend;\n } else if (this.sqliteVecLoaded) {\n this.vectorBackend = \"sqlite-vec\";\n } else {\n this.vectorBackend = \"blob\";\n }\n\n if (dims !== null) {\n this.vectorDimensions = dims;\n this.ensureVectorStorage(dims);\n this.reprepareVectorStatements();\n // Blob ANN hydrate is deferred until first search (warm-start win).\n if (this.vectorBackend === \"blob\") {\n this.memoryIndexDirty = true;\n }\n }\n } catch (error) {\n try {\n this.db?.close();\n } catch {\n // ignore close errors during failed open\n }\n this.db = null;\n this.statements = null;\n throw new InitializationError(\n `Failed to open SQLite database: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n async close(): Promise<void> {\n if (!this.db) {\n return;\n }\n try {\n this.db.close();\n } catch (error) {\n throw new DatabaseError(`Failed to close database: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n } finally {\n this.db = null;\n this.statements = null;\n this.memoryIndex = null;\n }\n }\n\n async ensureVectorSchema(dimensions: number): Promise<void> {\n const existing = await this.getEmbeddingDimensions();\n if (existing !== null && existing !== dimensions) {\n throw new InitializationError(\n `Embedding dimensions mismatch: database is configured for ${existing}-d vectors, but the embedding model returned ${dimensions}-d vectors.`,\n );\n }\n\n if (!this.vectorBackend) {\n this.vectorBackend = this.sqliteVecLoaded ? \"sqlite-vec\" : \"blob\";\n }\n\n // Prefer sqlite-vec when available and not already locked to blob.\n if (this.sqliteVecLoaded && this.vectorBackend !== \"blob\") {\n this.vectorBackend = \"sqlite-vec\";\n }\n\n this.ensureVectorStorage(dimensions);\n await this.setMeta(META_KEYS.vectorBackend, this.vectorBackend);\n\n if (existing === null) {\n await this.setEmbeddingDimensions(dimensions);\n }\n this.vectorDimensions = dimensions;\n this.reprepareVectorStatements();\n this.hydrateMemoryIndex();\n }\n\n async getEmbeddingDimensions(): Promise<number | null> {\n return this.readMetaNumber(META_KEYS.embeddingDimensions);\n }\n\n async setEmbeddingDimensions(dimensions: number): Promise<void> {\n await this.setMeta(META_KEYS.embeddingDimensions, String(dimensions));\n this.vectorDimensions = dimensions;\n }\n\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n const stmts = this.requireStatements();\n this.requireVectorReady();\n\n return this.withTransaction(() => {\n const row = stmts.insertMemory.get(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n ) as unknown as MemoryRow | undefined;\n if (!row || row.rowid === undefined) {\n throw new DatabaseError(\"Failed to read memory after insert\");\n }\n\n this.insertEmbedding(row.rowid, input.embedding);\n // Keep FTS in the same ACID transaction — no deferred/stale keyword search.\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n\n stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n\n return row;\n });\n }\n\n async insertMemoriesBatch(inputs: InsertMemoryInput[]): Promise<MemoryRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n const stmts = this.requireStatements();\n this.requireVectorReady();\n\n return this.withTransaction(() => {\n const rows: MemoryRow[] = [];\n for (const input of inputs) {\n const row = stmts.insertMemory.get(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n ) as unknown as MemoryRow | undefined;\n if (!row || row.rowid === undefined) {\n throw new DatabaseError(\"Failed to read memory after batch insert\");\n }\n\n this.insertEmbedding(row.rowid, input.embedding);\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n\n stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n rows.push(row);\n }\n return rows;\n });\n }\n\n async updateMemory(input: UpdateMemoryInput): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n return this.withTransaction(() => {\n const existing = stmts.getMemoryById.get(\n input.id,\n input.organization,\n ) as unknown as MemoryRow | undefined;\n if (!existing || existing.rowid === undefined) {\n return null;\n }\n\n const contentText = input.contentText ?? existing.content_text;\n const metadataJson =\n input.metadata !== undefined\n ? serializeMetadata(input.metadata)\n : existing.metadata_json;\n\n stmts.updateMemoryContent.run(\n input.contentText ?? null,\n input.metadata !== undefined ? metadataJson : null,\n input.updatedAt,\n input.id,\n input.organization,\n );\n\n if (input.embedding) {\n this.deleteEmbedding(existing.rowid);\n this.insertEmbedding(existing.rowid, input.embedding);\n }\n\n if (input.contentText !== undefined) {\n this.upsertFts(\n input.id,\n input.organization,\n existing.agent,\n contentText,\n );\n }\n\n return stmts.getMemoryById.get(input.id, input.organization) as unknown as MemoryRow;\n });\n }\n\n async searchByMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n const rows = await this.listMemories(filter, limit);\n if (!filter.metadata) {\n return rows;\n }\n return rows.filter((row) =>\n matchesMetadata(deserializeMetadata(row.metadata_json), filter.metadata!),\n );\n }\n\n /** Keyword search via FTS5 BM25. Returns memory IDs ranked by relevance. */\n async searchKeyword(\n query: string,\n organization: string,\n topK: number,\n ): Promise<Array<{ memoryId: string; score: number }>> {\n const stmts = this.requireStatements();\n if (!stmts.searchFts) {\n return [];\n }\n try {\n const sanitized = sanitizeFtsQuery(query);\n if (!sanitized) {\n return [];\n }\n const rows = stmts.searchFts.all(sanitized, organization, topK) as unknown as Array<{\n memory_id: string;\n rank: number;\n }>;\n return rows.map((row) => ({\n memoryId: row.memory_id,\n // bm25 returns lower (more negative) for better matches — invert to [0, ∞)\n score: 1 / (1 + Math.abs(row.rank)),\n }));\n } catch {\n return [];\n }\n }\n\n async getMemoryById(\n id: string,\n organization: string,\n ): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n const row = stmts.getMemoryById.get(id, organization) as unknown as\n | MemoryRow\n | undefined;\n return row ?? null;\n }\n\n async getMemoryByRowid(\n rowid: number,\n organization: string,\n ): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n const row = stmts.getMemoryByRowid.get(rowid, organization) as unknown as\n | MemoryRow\n | undefined;\n return row ?? null;\n }\n\n async getMemoriesByRowids(\n rowids: number[],\n organization: string,\n ): Promise<Map<number, MemoryRow>> {\n const out = new Map<number, MemoryRow>();\n if (rowids.length === 0) {\n return out;\n }\n const db = this.requireDb();\n // Chunk IN lists to stay well under SQLite variable limits.\n const chunkSize = 400;\n for (let offset = 0; offset < rowids.length; offset += chunkSize) {\n const chunk = rowids.slice(offset, offset + chunkSize);\n const placeholders = chunk.map(() => \"?\").join(\",\");\n const sql = `${SQL.getMemoriesByRowidsPrefix}${placeholders})`;\n const rows = db.prepare(sql).all(organization, ...chunk) as unknown as MemoryRow[];\n for (const row of rows) {\n if (row.rowid !== undefined) {\n out.set(row.rowid, row);\n }\n }\n }\n return out;\n }\n\n async listMemories(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n const db = this.requireDb();\n const clauses: string[] = [`organization = ?`];\n const params: Array<string | number> = [filter.organization];\n\n if (filter.agent) {\n clauses.push(`agent = ?`);\n params.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = 0`);\n }\n\n let sql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n `;\n if (limit !== undefined && !filter.metadata) {\n sql += ` LIMIT ?`;\n params.push(limit);\n }\n\n try {\n let rows = db.prepare(sql).all(...params) as unknown as MemoryRow[];\n if (filter.metadata) {\n rows = rows.filter((row) =>\n matchesMetadata(\n deserializeMetadata(row.metadata_json),\n filter.metadata!,\n ),\n );\n if (limit !== undefined) {\n rows = rows.slice(0, limit);\n }\n }\n return rows;\n } catch (error) {\n throw new DatabaseError(`Failed to list memories: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n async searchVectors(\n embedding: Float32Array,\n topK: number,\n ): Promise<VectorSearchHit[]> {\n this.requireVectorReady();\n\n if (this.vectorBackend === \"sqlite-vec\") {\n return this.searchWithSqliteVec(embedding, topK);\n }\n return this.searchWithBlobFallback(embedding, topK);\n }\n\n /**\n * Org-scoped KNN + memory rows.\n * Caller (Wolbarg.recall) already passes an overfetched topK — do not multiply again.\n */\n async searchVectorsWithMemories(\n embedding: Float32Array,\n topK: number,\n organization: string,\n options?: { agent?: string; includeArchived?: boolean },\n ): Promise<Array<{ row: MemoryRow; distance: number }>> {\n this.requireVectorReady();\n const hits = await this.searchVectors(embedding, topK);\n if (hits.length === 0) {\n return [];\n }\n const map = await this.getMemoriesByRowids(\n hits.map((h) => h.memoryRowid),\n organization,\n );\n const out: Array<{ row: MemoryRow; distance: number }> = [];\n for (const hit of hits) {\n const row = map.get(hit.memoryRowid);\n if (!row) continue;\n if (options?.agent && row.agent !== options.agent) continue;\n if (!options?.includeArchived && row.archived === 1) continue;\n out.push({ row, distance: hit.distance });\n }\n return out;\n }\n\n async archiveMemories(\n ids: string[],\n organization: string,\n compressedIntoId: string,\n archivedAt: string,\n ): Promise<string[]> {\n const stmts = this.requireStatements();\n const archived: string[] = [];\n\n return this.withTransaction(() => {\n for (const id of ids) {\n const result = stmts.archiveMemory.run(\n compressedIntoId,\n archivedAt,\n id,\n organization,\n );\n if (Number(result.changes) > 0) {\n archived.push(id);\n // Drop archived rows from FTS so keyword/hybrid never return them.\n this.deleteFts(id);\n stmts.insertHistory.run(\n crypto.randomUUID(),\n id,\n \"archived\",\n compressedIntoId,\n archivedAt,\n );\n stmts.insertHistory.run(\n crypto.randomUUID(),\n compressedIntoId,\n \"compressed\",\n id,\n archivedAt,\n );\n }\n }\n return archived;\n });\n }\n\n async deleteMemoryById(id: string, organization: string): Promise<boolean> {\n const stmts = this.requireStatements();\n\n return this.withTransaction(() => {\n const row = stmts.getMemoryById.get(id, organization) as unknown as\n | MemoryRow\n | undefined;\n if (!row || row.rowid === undefined) {\n return false;\n }\n\n this.deleteEmbedding(row.rowid);\n this.deleteFts(id);\n const result = stmts.deleteMemoryById.run(id, organization);\n return Number(result.changes) > 0;\n });\n }\n\n async deleteMemoriesByFilter(filter: RepositoryFilter): Promise<number> {\n const stmts = this.requireStatements();\n const agent = filter.agent;\n if (!agent) {\n throw new DatabaseError(\"deleteMemoriesByFilter requires an agent filter\");\n }\n\n return this.withTransaction(() => {\n const listed = this.listMemoriesSync({\n organization: filter.organization,\n agent,\n includeArchived: true,\n });\n for (const memory of listed) {\n if (memory.rowid !== undefined) {\n this.deleteEmbedding(memory.rowid);\n }\n this.deleteFts(memory.id);\n }\n const result = stmts.deleteMemoriesByOrgAgent.run(\n filter.organization,\n agent,\n );\n return Number(result.changes);\n });\n }\n\n async clearOrganization(organization: string): Promise<number> {\n const stmts = this.requireStatements();\n\n return this.withTransaction(() => {\n const listed = this.listMemoriesSync({ organization, includeArchived: true });\n for (const memory of listed) {\n if (memory.rowid !== undefined) {\n this.deleteEmbedding(memory.rowid);\n }\n this.deleteFts(memory.id);\n }\n const result = stmts.deleteMemoriesByOrg.run(organization);\n return Number(result.changes);\n });\n }\n\n async getHistory(memoryId: string): Promise<HistoryRow[]> {\n const stmts = this.requireStatements();\n return stmts.getHistory.all(memoryId) as unknown as HistoryRow[];\n }\n\n async insertHistoryEvent(event: HistoryRow): Promise<void> {\n const stmts = this.requireStatements();\n stmts.insertHistory.run(\n event.id,\n event.memory_id,\n event.event_type,\n event.related_memory_id,\n event.created_at,\n );\n }\n\n async getStats(\n organization: string,\n ): Promise<{\n totalMemories: number;\n activeMemories: number;\n archivedMemories: number;\n totalAgents: number;\n }> {\n const stmts = this.requireStatements();\n const memories = stmts.countMemories.get(organization) as unknown as {\n count: number | bigint;\n };\n const active = stmts.countActiveMemories.get(organization) as unknown as {\n count: number | bigint;\n };\n const archived = stmts.countArchivedMemories.get(organization) as unknown as {\n count: number | bigint;\n };\n const agents = stmts.countAgents.get(organization) as unknown as {\n count: number | bigint;\n };\n return {\n totalMemories: Number(memories.count),\n activeMemories: Number(active.count),\n archivedMemories: Number(archived.count),\n totalAgents: Number(agents.count),\n };\n }\n\n async getDatabaseSizeBytes(): Promise<number> {\n const db = this.requireDb();\n if (this.connectionString === \":memory:\") {\n const pageCountRow = db.prepare(\"PRAGMA page_count\").get() as\n | Record<string, number | bigint>\n | undefined;\n const pageSizeRow = db.prepare(\"PRAGMA page_size\").get() as\n | Record<string, number | bigint>\n | undefined;\n const pageCount = Number(\n pageCountRow?.page_count ?? Object.values(pageCountRow ?? {})[0] ?? 0,\n );\n const pageSize = Number(\n pageSizeRow?.page_size ?? Object.values(pageSizeRow ?? {})[0] ?? 0,\n );\n return pageCount * pageSize;\n }\n\n const dbPath = this.resolvedPath ?? this.resolvePath(this.connectionString);\n try {\n let total = fs.statSync(dbPath).size;\n for (const suffix of [\"-wal\", \"-shm\"]) {\n const side = `${dbPath}${suffix}`;\n if (fs.existsSync(side)) {\n total += fs.statSync(side).size;\n }\n }\n return total;\n } catch (error) {\n throw new DatabaseError(\n `Failed to determine database size: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n withTransaction<T>(fn: () => T): T {\n const db = this.requireDb();\n // DEFERRED is enough in single-threaded Node; IMMEDIATE adds lock latency.\n db.exec(\"BEGIN\");\n try {\n const result = fn();\n db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore rollback errors\n }\n if (\n error instanceof DatabaseError ||\n error instanceof InitializationError\n ) {\n throw error;\n }\n throw new DatabaseError(`Transaction failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n // ─── internals ───────────────────────────────────────────────────────────\n\n private tryLoadSqliteVec(db: DatabaseSync): boolean {\n try {\n sqliteVec.load(db);\n return true;\n } catch {\n return false;\n }\n }\n\n private runMigrations(db: DatabaseSync): void {\n db.exec(CREATE_META_TABLE);\n db.exec(CREATE_MEMORIES_TABLE);\n db.exec(CREATE_HISTORY_TABLE);\n db.exec(CREATE_BLOB_EMBEDDINGS_TABLE);\n for (const indexSql of CREATE_INDEXES) {\n db.exec(indexSql);\n }\n\n const current = this.readMetaNumberFromDb(db, META_KEYS.schemaVersion);\n if (current === null) {\n db.exec(CREATE_FTS_TABLE);\n this.backfillFts(db);\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n } else if (current > SCHEMA_VERSION) {\n throw new InitializationError(\n `Database schema version ${current} is newer than this SDK (supports ${SCHEMA_VERSION}).`,\n );\n } else if (current < SCHEMA_VERSION) {\n db.exec(CREATE_FTS_TABLE);\n this.backfillFts(db);\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n } else {\n db.exec(CREATE_FTS_TABLE);\n }\n }\n\n /**\n * Rebuild FTS from active (non-archived) memories when counts diverge.\n * Guarantees keyword/hybrid correctness after crashes or interrupted writes.\n */\n private ensureFtsConsistency(db: DatabaseSync): void {\n try {\n const memCount = db\n .prepare(`SELECT COUNT(*) AS c FROM memories WHERE archived = 0`)\n .get() as { c: number | bigint };\n const ftsCount = db\n .prepare(`SELECT COUNT(*) AS c FROM memories_fts`)\n .get() as { c: number | bigint };\n if (Number(memCount.c) !== Number(ftsCount.c)) {\n this.backfillFts(db);\n }\n } catch {\n // FTS unavailable — keyword search degrades gracefully.\n }\n }\n\n private backfillFts(db: DatabaseSync): void {\n try {\n db.exec(`DELETE FROM memories_fts`);\n const rows = db\n .prepare(\n `SELECT id, organization, agent, content_text FROM memories WHERE archived = 0`,\n )\n .all() as unknown as Array<{\n id: string;\n organization: string;\n agent: string;\n content_text: string;\n }>;\n const insert = db.prepare(SQL.insertFts);\n for (const row of rows) {\n insert.run(row.content_text, row.id, row.organization, row.agent);\n }\n } catch {\n // FTS may be unavailable on exotic builds — keyword search degrades.\n }\n }\n\n private prepareStatements(db: DatabaseSync): PreparedStatements {\n let insertFts: StatementSync | null = null;\n let deleteFts: StatementSync | null = null;\n let searchFts: StatementSync | null = null;\n try {\n insertFts = db.prepare(SQL.insertFts);\n deleteFts = db.prepare(SQL.deleteFts);\n searchFts = db.prepare(SQL.searchFts);\n } catch {\n // FTS optional\n }\n\n return {\n getMeta: db.prepare(SQL.getMeta),\n setMeta: db.prepare(SQL.setMeta),\n insertMemory: db.prepare(SQL.insertMemory),\n updateMemoryContent: db.prepare(SQL.updateMemoryContent),\n getMemoryById: db.prepare(SQL.getMemoryById),\n getMemoryByRowid: db.prepare(SQL.getMemoryByRowid),\n insertEmbedding: null,\n deleteEmbedding: null,\n searchVectors: null,\n insertEmbeddingBlob: null,\n deleteEmbeddingBlob: null,\n listEmbeddingsBlob: null,\n archiveMemory: db.prepare(SQL.archiveMemory),\n deleteMemoryById: db.prepare(SQL.deleteMemoryById),\n deleteMemoriesByOrg: db.prepare(SQL.deleteMemoriesByOrg),\n deleteMemoriesByOrgAgent: db.prepare(SQL.deleteMemoriesByOrgAgent),\n insertHistory: db.prepare(SQL.insertHistory),\n getHistory: db.prepare(SQL.getHistory),\n countMemories: db.prepare(SQL.countMemories),\n countActiveMemories: db.prepare(SQL.countActiveMemories),\n countArchivedMemories: db.prepare(SQL.countArchivedMemories),\n countAgents: db.prepare(SQL.countAgents),\n listRowidsForOrg: db.prepare(SQL.listRowidsForOrg),\n listRowidsForOrgAgent: db.prepare(SQL.listRowidsForOrgAgent),\n vectorTableExists: db.prepare(SQL.vectorTableExists),\n blobTableExists: db.prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'memory_embeddings_blob'`,\n ),\n insertFts,\n deleteFts,\n searchFts,\n };\n }\n\n private listMemoriesSync(filter: RepositoryFilter): MemoryRow[] {\n const db = this.requireDb();\n const clauses: string[] = [`organization = ?`];\n const params: Array<string | number> = [filter.organization];\n if (filter.agent) {\n clauses.push(`agent = ?`);\n params.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = 0`);\n }\n const sql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n `;\n return db.prepare(sql).all(...params) as unknown as MemoryRow[];\n }\n\n /** Insert-only FTS row (new memory IDs never collide). */\n private insertFtsRow(\n memoryId: string,\n organization: string,\n agent: string,\n contentText: string,\n ): void {\n const stmts = this.requireStatements();\n if (!stmts.insertFts) {\n return;\n }\n try {\n stmts.insertFts.run(contentText, memoryId, organization, agent);\n } catch {\n // ignore FTS errors — keyword search degrades but semantic search remains\n }\n }\n\n private upsertFts(\n memoryId: string,\n organization: string,\n agent: string,\n contentText: string,\n ): void {\n const stmts = this.requireStatements();\n if (!stmts.insertFts || !stmts.deleteFts) {\n return;\n }\n try {\n stmts.deleteFts.run(memoryId);\n stmts.insertFts.run(contentText, memoryId, organization, agent);\n } catch {\n // ignore FTS errors — keyword search degrades but semantic search remains\n }\n }\n\n private deleteFts(memoryId: string): void {\n const stmts = this.requireStatements();\n if (!stmts.deleteFts) {\n return;\n }\n try {\n stmts.deleteFts.run(memoryId);\n } catch {\n // ignore\n }\n }\n\n private ensureVectorStorage(dimensions: number): void {\n const db = this.requireDb();\n if (this.vectorBackend === \"sqlite-vec\") {\n if (!this.sqliteVecLoaded) {\n throw new InitializationError(\n \"sqlite-vec is required for this database but is unavailable on this platform.\",\n );\n }\n const stmts = this.requireStatements();\n const exists = stmts.vectorTableExists.get() as { name: string } | undefined;\n if (!exists) {\n db.exec(buildVectorTableSql(dimensions));\n }\n this.memoryIndex = null;\n return;\n }\n\n db.exec(CREATE_BLOB_EMBEDDINGS_TABLE);\n if (!this.memoryIndex || this.memoryIndex.size === 0) {\n this.memoryIndex = new InMemoryVectorIndex(dimensions);\n }\n }\n\n private hydrateMemoryIndex(): void {\n if (this.vectorBackend !== \"blob\" || this.vectorDimensions === null) {\n this.memoryIndex = null;\n return;\n }\n const stmts = this.requireStatements();\n if (!stmts.listEmbeddingsBlob) {\n stmts.listEmbeddingsBlob = this.requireDb().prepare(SQL.listEmbeddingsBlob);\n }\n const index = new InMemoryVectorIndex(this.vectorDimensions);\n try {\n const rows = stmts.listEmbeddingsBlob.all() as unknown as Array<{\n memory_rowid: number;\n embedding: Uint8Array | Buffer;\n }>;\n for (const row of rows) {\n index.upsert(row.memory_rowid, bufferToEmbedding(row.embedding));\n }\n } catch {\n // empty table is fine\n }\n this.memoryIndex = index;\n }\n\n private reprepareVectorStatements(): void {\n const db = this.requireDb();\n const stmts = this.requireStatements();\n\n if (this.vectorBackend === \"sqlite-vec\") {\n stmts.insertEmbedding = db.prepare(SQL.insertEmbedding);\n stmts.deleteEmbedding = db.prepare(SQL.deleteEmbedding);\n stmts.searchVectors = db.prepare(SQL.searchVectors);\n stmts.insertEmbeddingBlob = null;\n stmts.deleteEmbeddingBlob = null;\n stmts.listEmbeddingsBlob = null;\n return;\n }\n\n stmts.insertEmbeddingBlob = db.prepare(SQL.insertEmbeddingBlob);\n stmts.deleteEmbeddingBlob = db.prepare(SQL.deleteEmbeddingBlob);\n stmts.listEmbeddingsBlob = db.prepare(SQL.listEmbeddingsBlob);\n stmts.insertEmbedding = null;\n stmts.deleteEmbedding = null;\n stmts.searchVectors = null;\n }\n\n private insertEmbedding(rowid: number, embedding: Float32Array): void {\n const stmts = this.requireStatements();\n if (this.vectorBackend === \"sqlite-vec\") {\n stmts.insertEmbedding!.run(rowid, this.toVectorParam(embedding));\n return;\n }\n stmts.insertEmbeddingBlob!.run(rowid, embeddingToBuffer(embedding));\n // Defer in-memory index rebuild until the next search (faster writes).\n this.memoryIndexDirty = true;\n }\n\n private deleteEmbedding(rowid: number): void {\n const stmts = this.requireStatements();\n try {\n if (this.vectorBackend === \"sqlite-vec\" && stmts.deleteEmbedding) {\n stmts.deleteEmbedding.run(rowid);\n } else if (stmts.deleteEmbeddingBlob) {\n stmts.deleteEmbeddingBlob.run(rowid);\n this.memoryIndex?.remove(rowid);\n this.memoryIndexDirty = true;\n }\n } catch {\n // Ignore missing vectors during delete.\n }\n }\n\n private searchWithSqliteVec(\n embedding: Float32Array,\n topK: number,\n ): VectorSearchHit[] {\n const stmts = this.requireStatements();\n try {\n const rows = stmts.searchVectors!.all(\n this.toVectorParam(embedding),\n topK,\n ) as unknown as Array<{ memory_rowid: number; distance: number }>;\n\n const hits: VectorSearchHit[] = new Array(rows.length);\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i]!;\n hits[i] = {\n memoryRowid: row.memory_rowid,\n distance: row.distance,\n };\n }\n return hits;\n } catch (error) {\n throw new DatabaseError(`Vector search failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n\n private searchWithBlobFallback(\n embedding: Float32Array,\n topK: number,\n ): VectorSearchHit[] {\n if (this.memoryIndexDirty || !this.memoryIndex) {\n this.hydrateMemoryIndex();\n this.memoryIndexDirty = false;\n }\n if (this.memoryIndex && this.vectorDimensions !== null) {\n const query = normalizeEmbedding(embedding, this.vectorDimensions);\n return this.memoryIndex.search(query, topK);\n }\n throw new DatabaseError(\"Blob vector index is not initialized\");\n }\n\n private async setMeta(key: string, value: string): Promise<void> {\n const stmts = this.requireStatements();\n stmts.setMeta.run(key, value);\n }\n\n private readMetaNumber(key: string): number | null {\n const stmts = this.requireStatements();\n const row = stmts.getMeta.get(key) as { value: string } | undefined;\n if (!row) {\n return null;\n }\n const parsed = Number(row.value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n private readMetaString(key: string): string | null {\n const stmts = this.requireStatements();\n const row = stmts.getMeta.get(key) as { value: string } | undefined;\n return row?.value ?? null;\n }\n\n private readMetaNumberFromDb(db: DatabaseSync, key: string): number | null {\n const row = db.prepare(SQL.getMeta).get(key) as { value: string } | undefined;\n if (!row) {\n return null;\n }\n const parsed = Number(row.value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n private resolvePath(connectionString: string): string {\n if (connectionString === \":memory:\") {\n return \":memory:\";\n }\n return path.isAbsolute(connectionString)\n ? connectionString\n : path.resolve(process.cwd(), connectionString);\n }\n\n private requireDb(): DatabaseSync {\n if (!this.db) {\n throw new DatabaseError(\"Database is not open. Call init() first.\");\n }\n return this.db;\n }\n\n private requireStatements(): PreparedStatements {\n if (!this.statements) {\n throw new DatabaseError(\"Database statements are not prepared. Call init() first.\");\n }\n return this.statements;\n }\n\n private requireVectorReady(): void {\n if (!this.vectorBackend || this.vectorDimensions === null) {\n throw new DatabaseError(\n \"Vector index is not ready. Embedding dimensions have not been initialized.\",\n );\n }\n }\n\n private toVectorParam(embedding: Float32Array): Uint8Array {\n const buffer = embeddingToBuffer(embedding);\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\n/** @deprecated Prefer {@link SqliteStorageProvider}. */\nexport const SqliteDatabaseProvider = SqliteStorageProvider;\n\n/** Turn free text into a safe FTS5 MATCH query (OR of terms). */\nfunction sanitizeFtsQuery(query: string): string {\n const terms = query\n .split(/\\s+/)\n .map((t) => t.replace(/[\"']/g, \"\").replace(/[^\\p{L}\\p{N}_-]/gu, \"\"))\n .filter((t) => t.length > 0);\n if (terms.length === 0) {\n return \"\";\n }\n return terms.map((t) => `\"${t}\"`).join(\" OR \");\n}\n","/**\n * PostgreSQL storage provider with optional pgvector support.\n * Requires the optional `pg` peer dependency.\n *\n * Performance design:\n * - Per-operation pool queries (no global write lock / shared tx client race)\n * - AsyncLocalStorage for nested transactions\n * - Single-statement CTE inserts (no BEGIN/COMMIT for one memory)\n * - Named prepared statements (parse/plan once per connection)\n * - Concurrent insert coalescing into unnest batches; sequential path is immediate\n * - COPY protocol for large ingest batches\n * - Org-filtered ANN with adaptive overfetch + HNSW iterative scan when available\n * - Joined vector search returning memories in one round-trip when possible\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { DatabaseError, InitializationError, ConfigurationError } from \"../../errors/index.js\";\nimport { matchesMetadata } from \"../../filters/match.js\";\nimport { SCHEMA_VERSION, META_KEYS } from \"../../schema/index.js\";\nimport {\n deserializeMetadata,\n serializeMetadata,\n} from \"../../utils/index.js\";\nimport { cosineDistance } from \"../../utils/vector.js\";\nimport type {\n HistoryRow,\n InsertMemoryInput,\n MemoryRow,\n RepositoryFilter,\n StorageProvider,\n UpdateMemoryInput,\n VectorSearchHit,\n} from \"../types.js\";\n\ntype PgQueryResult = {\n rows: Record<string, unknown>[];\n rowCount: number | null;\n};\n\ntype PgQueryable = {\n query: (\n textOrConfig: string | { name?: string; text: string; values?: unknown[] },\n params?: unknown[],\n ) => Promise<PgQueryResult>;\n};\n\ntype PgPoolClient = PgQueryable & {\n release: () => void;\n query: PgQueryable[\"query\"];\n};\n\ntype PgPool = PgQueryable & {\n end: () => Promise<void>;\n connect: () => Promise<PgPoolClient>;\n totalCount?: number;\n idleCount?: number;\n waitingCount?: number;\n};\n\nexport interface PostgresProviderOptions {\n connectionString: string;\n maxPoolSize?: number;\n}\n\nconst txStore = new AsyncLocalStorage<PgPoolClient>();\n\n/** Statement names for per-connection prepared-statement cache. */\nconst STMT = {\n insertOne: \"Wolbarg_insert_one_v1\",\n insertBatch: \"Wolbarg_insert_batch_v1\",\n} as const;\n\n/** Fast Float32Array → pgvector text literal without Array.from. */\nfunction toVectorLiteral(embedding: Float32Array): string {\n const n = embedding.length;\n let s = \"[\";\n for (let i = 0; i < n; i += 1) {\n if (i !== 0) s += \",\";\n s += embedding[i];\n }\n return s + \"]\";\n}\n\nconst INSERT_ONE_SQL = `WITH mem AS (\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n ),\n hist AS (\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT $8, id, 'created', NULL, $6 FROM mem\n ),\n mapped AS (\n INSERT INTO memory_row_map (memory_id)\n SELECT id FROM mem\n ON CONFLICT (memory_id) DO NOTHING\n ),\n emb AS (\n INSERT INTO memory_embeddings (memory_id, embedding)\n SELECT id, $9::vector FROM mem\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding\n )\n SELECT * FROM mem`;\n\nconst INSERT_BATCH_SQL = `WITH mem AS (\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n )\n SELECT id, org, agent, txt, meta::jsonb, false, NULL, c, u\n FROM unnest(\n $1::text[], $2::text[], $3::text[], $4::text[],\n $5::text[], $6::timestamptz[], $7::timestamptz[]\n ) AS t(id, org, agent, txt, meta, c, u)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n ),\n hist AS (\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT h, m, 'created', NULL, c\n FROM unnest($8::text[], $1::text[], $6::timestamptz[]) AS t(h, m, c)\n ),\n mapped AS (\n INSERT INTO memory_row_map (memory_id)\n SELECT unnest($1::text[])\n ON CONFLICT (memory_id) DO NOTHING\n ),\n emb AS (\n INSERT INTO memory_embeddings (memory_id, embedding)\n SELECT id, emb::vector\n FROM unnest($1::text[], $9::text[]) AS t(id, emb)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding\n )\n SELECT * FROM mem`;\n\nconst COPY_BATCH_THRESHOLD = 64;\n\nexport class PostgresStorageProvider implements StorageProvider {\n readonly name = \"postgres\";\n\n private readonly connectionString: string;\n private readonly maxPoolSize: number;\n private pool: PgPool | null = null;\n private vectorDimensions: number | null = null;\n private hasPgvector = false;\n private hnswIndexEnsured = false;\n private hnswCreateFailures = 0;\n private hasContentTsv = false;\n private iterativeScanEnabled = false;\n /** Coalesce concurrent insertMemory callers into one unnest batch. */\n private insertQueue: Array<{\n input: InsertMemoryInput;\n resolve: (row: MemoryRow) => void;\n reject: (err: unknown) => void;\n }> = [];\n private insertFlushScheduled = false;\n private insertFlushInFlight = false;\n\n constructor(options: PostgresProviderOptions) {\n this.connectionString = options.connectionString;\n // Default 32 — concurrent writers need pool headroom beyond the old max=10.\n this.maxPoolSize = options.maxPoolSize ?? 32;\n }\n\n getPoolStats(): {\n max: number;\n total: number;\n idle: number;\n waiting: number;\n } {\n const pool = this.pool;\n return {\n max: this.maxPoolSize,\n total: pool?.totalCount ?? 0,\n idle: pool?.idleCount ?? 0,\n waiting: pool?.waitingCount ?? 0,\n };\n }\n\n async open(): Promise<void> {\n let PoolCtor: new (config: Record<string, unknown>) => PgPool;\n try {\n const mod = await import(\"pg\");\n PoolCtor =\n (mod as { Pool: typeof PoolCtor }).Pool ??\n (mod as { default: { Pool: typeof PoolCtor } }).default.Pool;\n } catch {\n throw new ConfigurationError(\n 'PostgreSQL storage requires the optional \"pg\" package. Install it with: npm install pg',\n );\n }\n\n try {\n this.pool = new PoolCtor({\n connectionString: this.connectionString,\n max: this.maxPoolSize,\n idleTimeoutMillis: 30_000,\n allowExitOnIdle: true,\n keepAlive: true,\n });\n await this.runMigrations();\n this.hasPgvector = await this.tryEnablePgvector();\n const dims = await this.getEmbeddingDimensions();\n if (dims !== null) {\n this.vectorDimensions = dims;\n await this.ensureVectorTables(dims);\n }\n } catch (error) {\n await this.pool?.end().catch(() => undefined);\n this.pool = null;\n if (error instanceof ConfigurationError || error instanceof InitializationError) {\n throw error;\n }\n throw new InitializationError(\n `Failed to open PostgreSQL database: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n async close(): Promise<void> {\n if (!this.pool) {\n return;\n }\n await this.pool.end();\n this.pool = null;\n }\n\n async ensureVectorSchema(dimensions: number): Promise<void> {\n const existing = await this.getEmbeddingDimensions();\n if (existing !== null && existing !== dimensions) {\n throw new InitializationError(\n `Embedding dimensions mismatch: database is configured for ${existing}-d vectors, but the embedding model returned ${dimensions}-d vectors.`,\n );\n }\n this.hasPgvector = await this.tryEnablePgvector();\n await this.ensureVectorTables(dimensions);\n if (existing === null) {\n await this.setEmbeddingDimensions(dimensions);\n }\n this.vectorDimensions = dimensions;\n }\n\n private async ensureVectorTables(dimensions: number): Promise<void> {\n if (this.hasPgvector) {\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_embeddings (\n memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,\n embedding vector(${dimensions})\n )\n `);\n // Do not create HNSW here — defer until first search so bulk inserts stay fast.\n // Do not DROP an existing index either (shared-DB benches would pay rebuild cost).\n const idx = await this.query(\n `SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embeddings_hnsw' LIMIT 1`,\n );\n this.hnswIndexEnsured = idx.rows.length > 0;\n } else {\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_embeddings_blob (\n memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,\n embedding BYTEA NOT NULL\n )\n `);\n }\n }\n\n /**\n * Soft reset for a single organization. Drops HNSW only when the embeddings\n * table is empty so other corpora on a shared bench DB stay intact.\n */\n async resetOrganization(organization: string): Promise<void> {\n await this.query(`DELETE FROM memories WHERE organization = $1`, [\n organization,\n ]);\n const count = await this.query(\n `SELECT COUNT(*)::int AS n FROM memory_embeddings`,\n );\n if (Number(count.rows[0]?.n ?? 0) === 0) {\n await this.query(\n `DROP INDEX IF EXISTS idx_memory_embeddings_hnsw`,\n ).catch(() => undefined);\n this.hnswIndexEnsured = false;\n }\n }\n\n /**\n * Wipe all Wolbarg tables (explicit opt-in). Prefer {@link resetOrganization}.\n */\n async wipeAllData(): Promise<void> {\n await this.query(`TRUNCATE TABLE memories CASCADE`).catch(() => undefined);\n await this.query(\n `DROP INDEX IF EXISTS idx_memory_embeddings_hnsw`,\n ).catch(() => undefined);\n this.hnswIndexEnsured = false;\n }\n\n /** Build HNSW once before the first KNN query (bulk-friendly inserts). */\n private async ensureHnswIndex(): Promise<void> {\n if (!this.hasPgvector || this.hnswIndexEnsured) {\n return;\n }\n try {\n await this.query(`\n CREATE INDEX IF NOT EXISTS idx_memory_embeddings_hnsw\n ON memory_embeddings USING hnsw (embedding vector_cosine_ops)\n WITH (m = 16, ef_construction = 64)\n `);\n this.hnswIndexEnsured = true;\n this.hnswCreateFailures = 0;\n // Prefer iterative filtered scans when the extension supports them.\n if (!this.iterativeScanEnabled) {\n try {\n await this.query(`SET hnsw.iterative_scan = relaxed_order`);\n this.iterativeScanEnabled = true;\n } catch {\n // Older pgvector — adaptive overfetch still guarantees correctness.\n }\n }\n } catch (error) {\n this.hnswCreateFailures += 1;\n if (this.hnswCreateFailures >= 3) {\n throw new DatabaseError(\n `Failed to create HNSW index after ${this.hnswCreateFailures} attempts: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n // Leave hnswIndexEnsured=false so the next search retries.\n }\n }\n\n async getEmbeddingDimensions(): Promise<number | null> {\n const result = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.embeddingDimensions],\n );\n const value = result.rows[0]?.value;\n if (typeof value !== \"string\") {\n return null;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n async setEmbeddingDimensions(dimensions: number): Promise<void> {\n await this.query(\n `INSERT INTO Wolbarg_meta (key, value) VALUES ($1, $2)\n ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,\n [META_KEYS.embeddingDimensions, String(dimensions)],\n );\n this.vectorDimensions = dimensions;\n }\n\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n this.requireVectorReady();\n\n // Non-contended path: one CTE, zero event-loop delay (production sequential insert).\n if (!this.insertFlushInFlight && this.insertQueue.length === 0) {\n this.insertFlushInFlight = true;\n try {\n return await this.insertMemoryImmediate(input);\n } finally {\n this.insertFlushInFlight = false;\n if (this.insertQueue.length > 0) {\n this.insertFlushScheduled = true;\n queueMicrotask(() => {\n void this.flushInsertQueue();\n });\n }\n }\n }\n\n // Contended path: coalesce concurrent waiters into one unnest round-trip.\n return new Promise<MemoryRow>((resolve, reject) => {\n this.insertQueue.push({ input, resolve, reject });\n if (this.insertQueue.length >= 16) {\n if (this.insertFlushScheduled) {\n this.insertFlushScheduled = false;\n }\n void this.flushInsertQueue();\n return;\n }\n if (!this.insertFlushScheduled) {\n this.insertFlushScheduled = true;\n queueMicrotask(() => {\n void this.flushInsertQueue();\n });\n }\n });\n }\n\n private async flushInsertQueue(): Promise<void> {\n if (this.insertFlushInFlight) {\n // Another writer owns the flush; it will re-check the queue on exit.\n return;\n }\n const batch = this.insertQueue;\n this.insertQueue = [];\n this.insertFlushScheduled = false;\n if (batch.length === 0) {\n return;\n }\n this.insertFlushInFlight = true;\n try {\n if (batch.length === 1) {\n const row = await this.insertMemoryImmediate(batch[0]!.input);\n batch[0]!.resolve(row);\n return;\n }\n const rows = await this.insertMemoriesBatch(batch.map((b) => b.input));\n for (let i = 0; i < batch.length; i += 1) {\n batch[i]!.resolve(rows[i]!);\n }\n } catch (error) {\n for (const item of batch) {\n item.reject(error);\n }\n } finally {\n this.insertFlushInFlight = false;\n if (this.insertQueue.length > 0) {\n this.insertFlushScheduled = true;\n queueMicrotask(() => {\n void this.flushInsertQueue();\n });\n } else {\n this.insertFlushScheduled = false;\n }\n }\n }\n\n /** Single-row insert without coalescing (used by flush + batch of 1). */\n private async insertMemoryImmediate(input: InsertMemoryInput): Promise<MemoryRow> {\n if (this.hasPgvector) {\n const inserted = await this.queryNamed(STMT.insertOne, INSERT_ONE_SQL, [\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n crypto.randomUUID(),\n toVectorLiteral(input.embedding),\n ]);\n return this.mapRow(inserted.rows[0]!);\n }\n return this.insertOneBlob(input);\n }\n\n async insertMemoriesBatch(inputs: InsertMemoryInput[]): Promise<MemoryRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n this.requireVectorReady();\n\n if (inputs.length === 1 && this.hasPgvector) {\n return [await this.insertMemoryImmediate(inputs[0]!)];\n }\n\n if (this.hasPgvector) {\n // Large batches: parallel unnest chunks use the pool as a pipeline.\n if (inputs.length >= COPY_BATCH_THRESHOLD) {\n return this.insertBatchChunked(inputs);\n }\n return this.insertBatchPgvector(inputs);\n }\n\n return this.withTransaction(async () => {\n const out: MemoryRow[] = [];\n for (const input of inputs) {\n out.push(await this.insertOneBlob(input));\n }\n return out;\n });\n }\n\n private async insertBatchPgvector(\n inputs: InsertMemoryInput[],\n ): Promise<MemoryRow[]> {\n const ids = new Array<string>(inputs.length);\n const orgs = new Array<string>(inputs.length);\n const agents = new Array<string>(inputs.length);\n const texts = new Array<string>(inputs.length);\n const metas = new Array<string>(inputs.length);\n const created = new Array<string>(inputs.length);\n const updated = new Array<string>(inputs.length);\n const histIds = new Array<string>(inputs.length);\n const vectors = new Array<string>(inputs.length);\n\n for (let i = 0; i < inputs.length; i += 1) {\n const input = inputs[i]!;\n ids[i] = input.id;\n orgs[i] = input.organization;\n agents[i] = input.agent;\n texts[i] = input.contentText;\n metas[i] = serializeMetadata(input.metadata);\n created[i] = input.createdAt;\n updated[i] = input.updatedAt;\n histIds[i] = crypto.randomUUID();\n vectors[i] = toVectorLiteral(input.embedding);\n }\n\n const inserted = await this.queryNamed(STMT.insertBatch, INSERT_BATCH_SQL, [\n ids,\n orgs,\n agents,\n texts,\n metas,\n created,\n updated,\n histIds,\n vectors,\n ]);\n\n const byId = new Map(\n inserted.rows.map((r) => [String(r.id), this.mapRow(r)]),\n );\n return ids.map((id) => byId.get(id)!);\n }\n\n /** Split large ingest batches into parallel unnest chunks (pool pipelining). */\n private async insertBatchChunked(\n inputs: InsertMemoryInput[],\n ): Promise<MemoryRow[]> {\n const chunkSize = 128;\n if (inputs.length <= chunkSize) {\n return this.insertBatchPgvector(inputs);\n }\n const chunks: InsertMemoryInput[][] = [];\n for (let i = 0; i < inputs.length; i += chunkSize) {\n chunks.push(inputs.slice(i, i + chunkSize));\n }\n const results = await Promise.all(\n chunks.map((chunk) => this.insertBatchPgvector(chunk)),\n );\n const out: MemoryRow[] = new Array(inputs.length);\n let offset = 0;\n for (const part of results) {\n for (let i = 0; i < part.length; i += 1) {\n out[offset + i] = part[i]!;\n }\n offset += part.length;\n }\n return out;\n }\n\n private async insertOneBlob(input: InsertMemoryInput): Promise<MemoryRow> {\n const buf = Buffer.from(\n input.embedding.buffer,\n input.embedding.byteOffset,\n input.embedding.byteLength,\n );\n const inserted = await this.query(\n `INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at`,\n [\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n input.createdAt,\n input.updatedAt,\n ],\n );\n const row = this.mapRow(inserted.rows[0]!);\n await this.query(\n `WITH mapped AS (\n INSERT INTO memory_row_map (memory_id) VALUES ($1)\n ON CONFLICT (memory_id) DO NOTHING\n )\n INSERT INTO memory_embeddings_blob (memory_id, embedding)\n VALUES ($1, $2)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding`,\n [input.id, buf],\n );\n await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ($1,$2,'created',NULL,$3)`,\n [crypto.randomUUID(), input.id, input.createdAt],\n );\n return row;\n }\n\n async updateMemory(input: UpdateMemoryInput): Promise<MemoryRow | null> {\n const existing = await this.getMemoryById(input.id, input.organization);\n if (!existing) {\n return null;\n }\n await this.query(\n `UPDATE memories SET\n content_text = COALESCE($1, content_text),\n metadata_json = COALESCE($2::jsonb, metadata_json),\n updated_at = $3\n WHERE id = $4 AND organization = $5`,\n [\n input.contentText ?? null,\n input.metadata !== undefined ? serializeMetadata(input.metadata) : null,\n input.updatedAt,\n input.id,\n input.organization,\n ],\n );\n if (input.embedding) {\n await this.deleteEmbedding(input.id);\n await this.insertEmbedding(input.id, input.embedding);\n }\n return this.getMemoryById(input.id, input.organization);\n }\n\n async getMemoryById(id: string, organization: string): Promise<MemoryRow | null> {\n const result = await this.query(\n `SELECT id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n FROM memories WHERE id = $1 AND organization = $2`,\n [id, organization],\n );\n const row = result.rows[0];\n return row ? this.mapRow(row) : null;\n }\n\n async getMemoryByRowid(rowid: number, organization: string): Promise<MemoryRow | null> {\n const result = await this.query(\n `SELECT m.id, m.organization, m.agent, m.content_text, m.metadata_json,\n m.archived::int AS archived, m.compressed_into, m.created_at, m.updated_at,\n e.row_num AS rowid\n FROM memories m\n JOIN memory_row_map e ON e.memory_id = m.id\n WHERE e.row_num = $1 AND m.organization = $2`,\n [rowid, organization],\n );\n const row = result.rows[0];\n return row ? this.mapRow(row) : null;\n }\n\n async getMemoriesByRowids(\n rowids: number[],\n organization: string,\n ): Promise<Map<number, MemoryRow>> {\n const out = new Map<number, MemoryRow>();\n if (rowids.length === 0) {\n return out;\n }\n const result = await this.query(\n `SELECT m.id, m.organization, m.agent, m.content_text, m.metadata_json,\n m.archived::int AS archived, m.compressed_into, m.created_at, m.updated_at,\n e.row_num AS rowid\n FROM memories m\n JOIN memory_row_map e ON e.memory_id = m.id\n WHERE m.organization = $1 AND e.row_num = ANY($2::bigint[])`,\n [organization, rowids],\n );\n for (const row of result.rows) {\n const mapped = this.mapRow(row);\n if (mapped.rowid !== undefined) {\n out.set(mapped.rowid, mapped);\n }\n }\n return out;\n }\n\n async listMemories(filter: RepositoryFilter, limit?: number): Promise<MemoryRow[]> {\n const clauses = [`organization = $1`];\n const params: unknown[] = [filter.organization];\n let idx = 2;\n if (filter.agent) {\n clauses.push(`agent = $${idx++}`);\n params.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = false`);\n }\n let sql = `\n SELECT id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n `;\n if (limit !== undefined && !filter.metadata) {\n sql += ` LIMIT $${idx}`;\n params.push(limit);\n }\n const result = await this.query(sql, params);\n let rows = result.rows.map((r) => this.mapRow(r));\n if (filter.metadata) {\n rows = rows.filter((row) =>\n matchesMetadata(deserializeMetadata(row.metadata_json), filter.metadata!),\n );\n if (limit !== undefined) {\n rows = rows.slice(0, limit);\n }\n }\n return rows;\n }\n\n async searchByMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n return this.listMemories(filter, limit);\n }\n\n async searchKeyword(\n query: string,\n organization: string,\n topK: number,\n ): Promise<Array<{ memoryId: string; score: number }>> {\n const trimmed = query.trim();\n if (!trimmed || topK <= 0) {\n return [];\n }\n try {\n const sql = this.hasContentTsv\n ? `SELECT id AS memory_id,\n ts_rank(content_tsv, plainto_tsquery('english', $1)) AS rank\n FROM memories\n WHERE organization = $2\n AND archived = false\n AND content_tsv @@ plainto_tsquery('english', $1)\n ORDER BY rank DESC\n LIMIT $3`\n : `SELECT id AS memory_id,\n ts_rank(to_tsvector('english', content_text), plainto_tsquery('english', $1)) AS rank\n FROM memories\n WHERE organization = $2\n AND archived = false\n AND to_tsvector('english', content_text) @@ plainto_tsquery('english', $1)\n ORDER BY rank DESC\n LIMIT $3`;\n const result = await this.query(sql, [trimmed, organization, topK]);\n return result.rows.map((row) => ({\n memoryId: String(row.memory_id),\n score: Number(row.rank),\n }));\n } catch {\n return [];\n }\n }\n\n async searchVectors(\n embedding: Float32Array,\n topK: number,\n ): Promise<VectorSearchHit[]> {\n this.requireVectorReady();\n if (this.hasPgvector) {\n await this.ensureHnswIndex();\n const result = await this.query(\n `SELECT r.row_num AS memory_rowid, ann.distance\n FROM (\n SELECT e.memory_id, (e.embedding <=> $1::vector) AS distance\n FROM memory_embeddings e\n ORDER BY e.embedding <=> $1::vector\n LIMIT $2\n ) ann\n JOIN memory_row_map r ON r.memory_id = ann.memory_id\n ORDER BY ann.distance`,\n [toVectorLiteral(embedding), topK],\n );\n const hits: VectorSearchHit[] = new Array(result.rows.length);\n for (let i = 0; i < result.rows.length; i += 1) {\n const row = result.rows[i]!;\n hits[i] = {\n memoryRowid: Number(row.memory_rowid),\n distance: Number(row.distance),\n };\n }\n return hits;\n }\n\n const result = await this.query(\n `SELECT r.row_num AS memory_rowid, e.embedding\n FROM memory_embeddings_blob e\n JOIN memory_row_map r ON r.memory_id = e.memory_id`,\n );\n const scored = result.rows.map((row) => {\n const buf = row.embedding as Buffer;\n const vec = new Float32Array(\n buf.buffer,\n buf.byteOffset,\n buf.byteLength / Float32Array.BYTES_PER_ELEMENT,\n );\n return {\n memoryRowid: Number(row.memory_rowid),\n distance: cosineDistance(embedding, vec),\n };\n });\n scored.sort((a, b) => a.distance - b.distance);\n return scored.slice(0, topK);\n }\n\n async searchVectorsWithMemories(\n embedding: Float32Array,\n topK: number,\n organization: string,\n options?: { agent?: string; includeArchived?: boolean },\n ): Promise<Array<{ row: MemoryRow; distance: number }>> {\n this.requireVectorReady();\n if (!this.hasPgvector) {\n const hits = await this.searchVectors(embedding, topK);\n const map = await this.getMemoriesByRowids(\n hits.map((h) => h.memoryRowid),\n organization,\n );\n const out: Array<{ row: MemoryRow; distance: number }> = [];\n for (const hit of hits) {\n const row = map.get(hit.memoryRowid);\n if (!row) continue;\n if (options?.agent && row.agent !== options.agent) continue;\n if (!options?.includeArchived && row.archived === 1) continue;\n out.push({ row, distance: hit.distance });\n }\n return out;\n }\n\n await this.ensureHnswIndex();\n const vec = toVectorLiteral(embedding);\n\n const mapHits = (\n rows: Record<string, unknown>[],\n ): Array<{ row: MemoryRow; distance: number }> =>\n rows.map((row) => ({\n row: this.mapRow(row),\n distance: Number(row.distance),\n }));\n\n // Subquery-first ANN keeps HNSW eligible. Start with a modest overfetch so\n // shared/multi-tenant corpora still fill topK after org post-filter without\n // many round-trips. Expand only when still under-filled.\n let overfetch = Math.min(Math.max(topK * 8, topK), 512);\n const maxFetch = Math.min(Math.max(topK * 64, 512), 8192);\n for (;;) {\n const agentClause = options?.agent ? \"AND m.agent = $5\" : \"\";\n const archivedClause = options?.includeArchived ? \"\" : \"AND m.archived = false\";\n const params = options?.agent\n ? [vec, overfetch, organization, topK, options.agent]\n : [vec, overfetch, organization, topK];\n const ann = await this.query(\n `WITH ann AS (\n SELECT e.memory_id, (e.embedding <=> $1::vector) AS distance\n FROM memory_embeddings e\n ORDER BY e.embedding <=> $1::vector\n LIMIT $2\n )\n SELECT m.id, m.organization, m.agent, m.content_text, m.metadata_json,\n m.archived::int AS archived, m.compressed_into, m.created_at, m.updated_at,\n r.row_num AS rowid,\n ann.distance,\n (SELECT COUNT(*)::int FROM ann) AS ann_fetched\n FROM ann\n JOIN memory_row_map r ON r.memory_id = ann.memory_id\n JOIN memories m ON m.id = ann.memory_id\n WHERE m.organization = $3\n ${agentClause}\n ${archivedClause}\n ORDER BY ann.distance\n LIMIT $4`,\n params,\n );\n\n const annFetched = Number(ann.rows[0]?.ann_fetched ?? ann.rows.length);\n if (\n ann.rows.length >= topK ||\n annFetched < overfetch ||\n overfetch >= maxFetch\n ) {\n return mapHits(ann.rows.slice(0, topK));\n }\n const next = Math.min(overfetch * 4, maxFetch);\n if (next === overfetch) {\n return mapHits(ann.rows.slice(0, topK));\n }\n overfetch = next;\n }\n }\n\n async archiveMemories(\n ids: string[],\n organization: string,\n compressedIntoId: string,\n archivedAt: string,\n ): Promise<string[]> {\n if (ids.length === 0) {\n return [];\n }\n const result = await this.query(\n `UPDATE memories\n SET archived = true, compressed_into = $1, updated_at = $2\n WHERE organization = $3 AND archived = false AND id = ANY($4::text[])\n RETURNING id`,\n [compressedIntoId, archivedAt, organization, ids],\n );\n const archived = result.rows.map((r) => String(r.id));\n if (archived.length === 0) {\n return [];\n }\n const histIds: string[] = [];\n const memIds: string[] = [];\n const types: string[] = [];\n const related: string[] = [];\n const times: string[] = [];\n for (const id of archived) {\n histIds.push(crypto.randomUUID(), crypto.randomUUID());\n memIds.push(id, compressedIntoId);\n types.push(\"archived\", \"compressed\");\n related.push(compressedIntoId, id);\n times.push(archivedAt, archivedAt);\n }\n await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT * FROM unnest($1::text[], $2::text[], $3::text[], $4::text[], $5::timestamptz[])`,\n [histIds, memIds, types, related, times],\n );\n return archived;\n }\n\n async deleteMemoryById(id: string, organization: string): Promise<boolean> {\n const result = await this.query(\n `DELETE FROM memories WHERE id = $1 AND organization = $2`,\n [id, organization],\n );\n return (result.rowCount ?? 0) > 0;\n }\n\n async deleteMemoriesByFilter(filter: RepositoryFilter): Promise<number> {\n if (!filter.agent) {\n throw new DatabaseError(\"deleteMemoriesByFilter requires an agent filter\");\n }\n const result = await this.query(\n `DELETE FROM memories WHERE organization = $1 AND agent = $2`,\n [filter.organization, filter.agent],\n );\n return result.rowCount ?? 0;\n }\n\n async clearOrganization(organization: string): Promise<number> {\n const result = await this.query(\n `DELETE FROM memories WHERE organization = $1`,\n [organization],\n );\n return result.rowCount ?? 0;\n }\n\n async getHistory(memoryId: string): Promise<HistoryRow[]> {\n const result = await this.query(\n `SELECT id, memory_id, event_type, related_memory_id, created_at\n FROM memory_history WHERE memory_id = $1 ORDER BY created_at ASC`,\n [memoryId],\n );\n return result.rows.map((row) => ({\n id: String(row.id),\n memory_id: String(row.memory_id),\n event_type: row.event_type as HistoryRow[\"event_type\"],\n related_memory_id:\n row.related_memory_id === null ? null : String(row.related_memory_id),\n created_at: String(row.created_at),\n }));\n }\n\n async insertHistoryEvent(event: HistoryRow): Promise<void> {\n await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ($1,$2,$3,$4,$5)`,\n [\n event.id,\n event.memory_id,\n event.event_type,\n event.related_memory_id,\n event.created_at,\n ],\n );\n }\n\n async getStats(\n organization: string,\n ): Promise<{\n totalMemories: number;\n activeMemories: number;\n archivedMemories: number;\n totalAgents: number;\n }> {\n const result = await this.query(\n `SELECT\n COUNT(*)::int AS memories,\n COUNT(*) FILTER (WHERE archived = false)::int AS active,\n COUNT(*) FILTER (WHERE archived = true)::int AS archived,\n COUNT(DISTINCT agent) FILTER (WHERE archived = false)::int AS agents\n FROM memories WHERE organization = $1`,\n [organization],\n );\n return {\n totalMemories: Number(result.rows[0]?.memories ?? 0),\n activeMemories: Number(result.rows[0]?.active ?? 0),\n archivedMemories: Number(result.rows[0]?.archived ?? 0),\n totalAgents: Number(result.rows[0]?.agents ?? 0),\n };\n }\n\n async getDatabaseSizeBytes(): Promise<number> {\n const result = await this.query(\n `SELECT pg_database_size(current_database())::bigint AS size`,\n );\n return Number(result.rows[0]?.size ?? 0);\n }\n\n async withTransaction<T>(fn: () => T | Promise<T>): Promise<T> {\n const existing = txStore.getStore();\n if (existing) {\n return fn();\n }\n const client = await this.requirePool().connect();\n try {\n await client.query(\"BEGIN\");\n const result = await txStore.run(client, fn);\n await client.query(\"COMMIT\");\n return result;\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => undefined);\n if (error instanceof DatabaseError || error instanceof InitializationError) {\n throw error;\n }\n throw new DatabaseError(`Transaction failed: ${this.describe(error)}`, {\n cause: error instanceof Error ? error : undefined,\n });\n } finally {\n client.release();\n }\n }\n\n private async runMigrations(): Promise<void> {\n // Split DDL: node-pg rejects multi-command prepared statements on some paths.\n await this.query(`\n CREATE TABLE IF NOT EXISTS Wolbarg_meta (\n key TEXT PRIMARY KEY NOT NULL,\n value TEXT NOT NULL\n )\n `);\n await this.query(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY NOT NULL,\n organization TEXT NOT NULL,\n agent TEXT NOT NULL,\n content_text TEXT NOT NULL,\n metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb,\n archived BOOLEAN NOT NULL DEFAULT false,\n compressed_into TEXT NULL REFERENCES memories(id) ON DELETE SET NULL,\n created_at TIMESTAMPTZ NOT NULL,\n updated_at TIMESTAMPTZ NOT NULL\n )\n `);\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_history (\n id TEXT PRIMARY KEY NOT NULL,\n memory_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n event_type TEXT NOT NULL CHECK (event_type IN ('created', 'archived', 'compressed')),\n related_memory_id TEXT NULL,\n created_at TIMESTAMPTZ NOT NULL\n )\n `);\n await this.query(`\n CREATE TABLE IF NOT EXISTS memory_row_map (\n memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,\n row_num BIGSERIAL UNIQUE NOT NULL\n )\n `);\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_org_agent ON memories(organization, agent)`,\n );\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_org_archived ON memories(organization, archived)`,\n );\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_org_active_created\n ON memories(organization, created_at) WHERE archived = false`,\n ).catch(() => undefined);\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_metadata ON memories USING GIN (metadata_json)`,\n );\n\n // Stored tsvector column — keyword/hybrid avoid re-computing to_tsvector.\n try {\n await this.query(`\n ALTER TABLE memories\n ADD COLUMN IF NOT EXISTS content_tsv tsvector\n GENERATED ALWAYS AS (to_tsvector('english', content_text)) STORED\n `);\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_content_tsv ON memories USING GIN (content_tsv)`,\n );\n this.hasContentTsv = true;\n } catch {\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memories_fts\n ON memories USING GIN (to_tsvector('english', content_text))`,\n ).catch(() => undefined);\n this.hasContentTsv = false;\n }\n\n const versionRow = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.schemaVersion],\n );\n if (!versionRow.rows[0]) {\n await this.query(\n `INSERT INTO Wolbarg_meta (key, value) VALUES ($1, $2)`,\n [META_KEYS.schemaVersion, String(SCHEMA_VERSION)],\n );\n }\n }\n\n private async tryEnablePgvector(): Promise<boolean> {\n try {\n await this.query(`CREATE EXTENSION IF NOT EXISTS vector`);\n return true;\n } catch {\n return false;\n }\n }\n\n private async insertEmbedding(memoryId: string, embedding: Float32Array): Promise<void> {\n if (this.hasPgvector) {\n await this.query(\n `WITH mapped AS (\n INSERT INTO memory_row_map (memory_id) VALUES ($1)\n ON CONFLICT (memory_id) DO NOTHING\n )\n INSERT INTO memory_embeddings (memory_id, embedding)\n VALUES ($1, $2::vector)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding`,\n [memoryId, toVectorLiteral(embedding)],\n );\n return;\n }\n const buf = Buffer.from(\n embedding.buffer,\n embedding.byteOffset,\n embedding.byteLength,\n );\n await this.query(\n `WITH mapped AS (\n INSERT INTO memory_row_map (memory_id) VALUES ($1)\n ON CONFLICT (memory_id) DO NOTHING\n )\n INSERT INTO memory_embeddings_blob (memory_id, embedding)\n VALUES ($1, $2)\n ON CONFLICT (memory_id) DO UPDATE SET embedding = EXCLUDED.embedding`,\n [memoryId, buf],\n );\n }\n\n private async deleteEmbedding(memoryId: string): Promise<void> {\n await this.query(`DELETE FROM memory_embeddings WHERE memory_id = $1`, [memoryId]).catch(() => undefined);\n await this.query(`DELETE FROM memory_embeddings_blob WHERE memory_id = $1`, [memoryId]).catch(() => undefined);\n }\n\n private async query(\n text: string,\n params?: unknown[],\n ): Promise<PgQueryResult> {\n const tx = txStore.getStore();\n const target: PgQueryable = tx ?? this.requirePool();\n return target.query(text, params);\n }\n\n /** Named prepared statement — parse/plan cached per pool connection. */\n private async queryNamed(\n name: string,\n text: string,\n params: unknown[],\n ): Promise<PgQueryResult> {\n const tx = txStore.getStore();\n const target: PgQueryable = tx ?? this.requirePool();\n return target.query({ name, text, values: params });\n }\n\n private mapRow(row: Record<string, unknown>): MemoryRow {\n const meta = row.metadata_json;\n let metadata_json: string;\n if (typeof meta === \"string\") {\n metadata_json = meta;\n } else if (meta && typeof meta === \"object\") {\n metadata_json = JSON.stringify(meta);\n } else {\n metadata_json = \"{}\";\n }\n\n const created =\n row.created_at instanceof Date\n ? row.created_at.toISOString()\n : String(row.created_at);\n const updated =\n row.updated_at instanceof Date\n ? row.updated_at.toISOString()\n : String(row.updated_at);\n\n return {\n id: String(row.id),\n organization: String(row.organization),\n agent: String(row.agent),\n content_text: String(row.content_text),\n metadata_json,\n archived: Number(row.archived ?? 0),\n compressed_into:\n row.compressed_into === null || row.compressed_into === undefined\n ? null\n : String(row.compressed_into),\n created_at: created,\n updated_at: updated,\n rowid: row.rowid !== undefined ? Number(row.rowid) : undefined,\n };\n }\n\n private requirePool(): PgPool {\n if (!this.pool) {\n throw new DatabaseError(\"Database is not open. Call open() first.\");\n }\n return this.pool;\n }\n\n private requireVectorReady(): void {\n if (this.vectorDimensions === null) {\n throw new DatabaseError(\n \"Vector index is not ready. Embedding dimensions have not been initialized.\",\n );\n }\n }\n\n private describe(error: unknown): string {\n if (error instanceof Error) {\n const aggregate = error as Error & { errors?: unknown[] };\n if (Array.isArray(aggregate.errors) && aggregate.errors.length > 0) {\n const nested = aggregate.errors\n .map((item) => (item instanceof Error ? item.message : String(item)))\n .join(\"; \");\n return `${error.message || error.name}: ${nested}`;\n }\n return error.message || error.name;\n }\n return String(error);\n }\n}\n","/**\n * Storage provider factory and re-exports.\n */\n\nimport type { DatabaseConfig, StorageConfig } from \"../types/index.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport { resolveDatabaseUrl } from \"../core/options.js\";\nimport type { StorageProvider } from \"./types.js\";\nimport { SqliteStorageProvider } from \"./providers/sqlite.js\";\nimport { PostgresStorageProvider } from \"./providers/postgres.js\";\n\nexport function createStorageProvider(\n config: StorageConfig | DatabaseConfig,\n): StorageProvider {\n const connectionString = resolveDatabaseUrl(config);\n if (!connectionString) {\n throw new ConfigurationError(\n \"database.url or database.connectionString is required\",\n );\n }\n\n if (config.provider === \"sqlite\") {\n return new SqliteStorageProvider({\n connectionString,\n });\n }\n\n if (config.provider === \"postgres\") {\n return new PostgresStorageProvider({\n connectionString,\n maxPoolSize: config.maxPoolSize,\n });\n }\n\n throw new ConfigurationError(\n `Unsupported storage provider: ${String((config as { provider: string }).provider)}`,\n );\n}\n\n/** @deprecated Prefer {@link createStorageProvider}. */\nexport function createDatabaseProvider(\n config: DatabaseConfig,\n): StorageProvider {\n return createStorageProvider(config);\n}\n\nexport type {\n StorageProvider,\n DatabaseProvider,\n MemoryRow,\n HistoryRow,\n InsertMemoryInput,\n UpdateMemoryInput,\n RepositoryFilter,\n VectorSearchHit,\n} from \"./types.js\";\nexport {\n SqliteStorageProvider,\n SqliteDatabaseProvider,\n} from \"./providers/sqlite.js\";\nexport { PostgresStorageProvider } from \"./providers/postgres.js\";\n","/**\n * Portable memory database import / export helpers.\n * Interface is provider-agnostic; SQLite file+manifest is the first implementation.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport { ConfigurationError, DatabaseError, ValidationError } from \"../errors/index.js\";\nimport { nowIso } from \"../utils/index.js\";\n\nexport interface ExportManifest {\n format: \"wolbarg-export-v1\";\n exportedAt: string;\n sdkVersion: string;\n provider: string;\n sourcePath: string;\n organization?: string;\n}\n\nexport interface MemoryExportResult {\n path: string;\n manifest: ExportManifest;\n sizeBytes: number;\n}\n\nexport interface MemoryImportResult {\n path: string;\n manifest: ExportManifest;\n}\n\nexport interface MemoryTransferProvider {\n exportTo(path: string, sourcePath: string, organization?: string): Promise<MemoryExportResult>;\n importFrom(path: string, targetPath: string): Promise<MemoryImportResult>;\n}\n\nconst SDK_VERSION = \"0.3.0\";\n\nexport class SqliteMemoryTransferProvider implements MemoryTransferProvider {\n async exportTo(\n exportPath: string,\n sourcePath: string,\n organization?: string,\n ): Promise<MemoryExportResult> {\n const resolvedSource = resolvePath(sourcePath);\n if (resolvedSource === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot export an in-memory database. Use a file-backed SQLite database.\",\n );\n }\n if (!fs.existsSync(resolvedSource)) {\n throw new DatabaseError(\n `Failed to execute export()\\nReason:\\nSource database not found at ${resolvedSource}\\nSuggestion:\\nInitialize Wolbarg and verify the database path.`,\n );\n }\n\n const resolvedExport = resolvePath(exportPath);\n fs.mkdirSync(path.dirname(resolvedExport), { recursive: true });\n\n const dbExportPath = resolvedExport.endsWith(\".db\")\n ? resolvedExport\n : `${resolvedExport}.db`;\n const manifestPath = `${dbExportPath}.manifest.json`;\n\n await copySqlite(resolvedSource, dbExportPath);\n\n const manifest: ExportManifest = {\n format: \"wolbarg-export-v1\",\n exportedAt: nowIso(),\n sdkVersion: SDK_VERSION,\n provider: \"sqlite\",\n sourcePath: resolvedSource,\n organization,\n };\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf8\");\n\n return {\n path: dbExportPath,\n manifest,\n sizeBytes: fs.statSync(dbExportPath).size,\n };\n }\n\n async importFrom(\n exportPath: string,\n targetPath: string,\n ): Promise<MemoryImportResult> {\n const resolvedExport = resolvePath(exportPath);\n const dbExportPath = resolvedExport.endsWith(\".db\")\n ? resolvedExport\n : fs.existsSync(`${resolvedExport}.db`)\n ? `${resolvedExport}.db`\n : resolvedExport;\n\n if (!fs.existsSync(dbExportPath)) {\n throw new ValidationError(\n `Failed to execute import()\\nReason:\\nExport file not found at ${dbExportPath}\\nSuggestion:\\nPass the path returned by export().`,\n );\n }\n\n const manifestPath = `${dbExportPath}.manifest.json`;\n let manifest: ExportManifest;\n if (fs.existsSync(manifestPath)) {\n manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as ExportManifest;\n if (manifest.format !== \"wolbarg-export-v1\") {\n throw new ValidationError(\n `Unsupported export format: ${String((manifest as { format?: string }).format)}`,\n );\n }\n } else {\n manifest = {\n format: \"wolbarg-export-v1\",\n exportedAt: nowIso(),\n sdkVersion: SDK_VERSION,\n provider: \"sqlite\",\n sourcePath: dbExportPath,\n };\n }\n\n const resolvedTarget = resolvePath(targetPath);\n if (resolvedTarget === \":memory:\") {\n throw new ConfigurationError(\"Cannot import into an in-memory database.\");\n }\n\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n const side = `${resolvedTarget}${suffix}`;\n if (fs.existsSync(side)) {\n fs.rmSync(side, { force: true });\n }\n }\n await copySqlite(dbExportPath, resolvedTarget);\n\n return { path: resolvedTarget, manifest };\n }\n}\n\nasync function copySqlite(sourcePath: string, destPath: string): Promise<void> {\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n let source: DatabaseSync | null = null;\n let dest: DatabaseSync | null = null;\n try {\n source = new DatabaseSync(sourcePath);\n try {\n source.exec(\"PRAGMA wal_checkpoint(TRUNCATE);\");\n } catch {\n // ignore\n }\n dest = new DatabaseSync(destPath);\n const backupFn = (\n source as unknown as {\n backup?: (target: DatabaseSync) => void | Promise<void>;\n }\n ).backup;\n if (typeof backupFn === \"function\") {\n await backupFn.call(source, dest);\n } else {\n source.close();\n source = null;\n dest.close();\n dest = null;\n fs.copyFileSync(sourcePath, destPath);\n }\n } catch (error) {\n throw new DatabaseError(\n `SQLite transfer failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n } finally {\n try {\n source?.close();\n } catch {\n // ignore\n }\n try {\n dest?.close();\n } catch {\n // ignore\n }\n }\n}\n\nfunction resolvePath(p: string): string {\n if (p === \":memory:\") return \":memory:\";\n return path.isAbsolute(p) ? p : path.resolve(process.cwd(), p);\n}\n","/**\n * Memory domain helpers — mapping rows to public records.\n */\n\nimport type { HistoryEvent, MemoryRecord, RecallResult } from \"../types/index.js\";\nimport type { HistoryRow, MemoryRow } from \"../storage/types.js\";\nimport { deserializeMetadata, parseIso } from \"../utils/index.js\";\n\nexport function toMemoryRecord(row: MemoryRow): MemoryRecord {\n return {\n id: row.id,\n organization: row.organization,\n agent: row.agent,\n content: { text: row.content_text },\n metadata: deserializeMetadata(row.metadata_json),\n archived: row.archived === 1,\n compressedInto: row.compressed_into,\n createdAt: parseIso(row.created_at),\n updatedAt: parseIso(row.updated_at),\n };\n}\n\nexport function toRecallResult(row: MemoryRow, similarity: number): RecallResult {\n return {\n id: row.id,\n organization: row.organization,\n agent: row.agent,\n content: { text: row.content_text },\n metadata: deserializeMetadata(row.metadata_json),\n archived: row.archived === 1,\n similarity,\n createdAt: parseIso(row.created_at),\n updatedAt: parseIso(row.updated_at),\n };\n}\n\nexport function toHistoryEvent(row: HistoryRow): HistoryEvent {\n return {\n id: row.id,\n memoryId: row.memory_id,\n eventType: row.event_type,\n relatedMemoryId: row.related_memory_id,\n createdAt: parseIso(row.created_at),\n };\n}\n\nexport {\n SqliteMemoryTransferProvider,\n} from \"./transfer.js\";\nexport type {\n ExportManifest,\n MemoryExportResult,\n MemoryImportResult,\n MemoryTransferProvider,\n} from \"./transfer.js\";\n\n","/**\n * Retrieval pipeline — fusion, MMR, adaptive candidate selection.\n */\n\nimport type { HybridConfig, MmrConfig, RecallResult } from \"../types/index.js\";\n\nexport interface ScoredCandidate {\n id: string;\n semanticScore: number;\n keywordScore: number;\n fusedScore: number;\n result: RecallResult;\n}\n\nexport function fuseScores(\n semantic: Map<string, number>,\n keyword: Map<string, number>,\n weights: Required<HybridConfig>,\n): Map<string, number> {\n const ids = new Set([...semantic.keys(), ...keyword.keys()]);\n const fused = new Map<string, number>();\n const semMax = Math.max(...semantic.values(), 1e-9);\n const kwMax = Math.max(...keyword.values(), 1e-9);\n\n for (const id of ids) {\n const s = (semantic.get(id) ?? 0) / semMax;\n const k = (keyword.get(id) ?? 0) / kwMax;\n fused.set(\n id,\n weights.semanticWeight * s + weights.keywordWeight * k,\n );\n }\n return fused;\n}\n\nexport function resolveHybridWeights(\n hybrid: boolean | HybridConfig | undefined,\n): Required<HybridConfig> | null {\n if (hybrid === false || hybrid === undefined) {\n return null;\n }\n if (hybrid === true) {\n return { semanticWeight: 0.7, keywordWeight: 0.3 };\n }\n return {\n semanticWeight: hybrid.semanticWeight ?? 0.7,\n keywordWeight: hybrid.keywordWeight ?? 0.3,\n };\n}\n\nexport function resolveMmr(\n mmr: boolean | MmrConfig | undefined,\n): number | null {\n if (mmr === false || mmr === undefined) {\n return null;\n }\n if (mmr === true) {\n return 0.5;\n }\n return mmr.lambda ?? 0.5;\n}\n\n/**\n * Maximal Marginal Relevance diversification.\n * Uses character Jaccard as a cheap token-overlap proxy for embedding similarity.\n */\nexport function applyMmr(\n candidates: RecallResult[],\n topK: number,\n lambda: number,\n): RecallResult[] {\n if (candidates.length <= topK) {\n return candidates;\n }\n\n const selected: RecallResult[] = [];\n const remaining = [...candidates];\n\n while (selected.length < topK && remaining.length > 0) {\n let bestIdx = 0;\n let bestScore = -Infinity;\n\n for (let i = 0; i < remaining.length; i += 1) {\n const candidate = remaining[i]!;\n const relevance = candidate.similarity;\n let maxSim = 0;\n for (const chosen of selected) {\n maxSim = Math.max(\n maxSim,\n jaccard(candidate.content.text, chosen.content.text),\n );\n }\n const score = lambda * relevance - (1 - lambda) * maxSim;\n if (score > bestScore) {\n bestScore = score;\n bestIdx = i;\n }\n }\n\n selected.push(remaining[bestIdx]!);\n remaining.splice(bestIdx, 1);\n }\n\n return selected;\n}\n\nfunction jaccard(a: string, b: string): number {\n const ta = new Set(a.toLowerCase().split(/\\s+/).filter(Boolean));\n const tb = new Set(b.toLowerCase().split(/\\s+/).filter(Boolean));\n if (ta.size === 0 && tb.size === 0) {\n return 1;\n }\n let inter = 0;\n for (const t of ta) {\n if (tb.has(t)) {\n inter += 1;\n }\n }\n const union = ta.size + tb.size - inter;\n return union === 0 ? 0 : inter / union;\n}\n\nexport function adaptiveFetchK(\n topK: number,\n overFetchFactor: number,\n hasFilters: boolean,\n): number {\n const factor = hasFilters ? Math.max(overFetchFactor, 4) : overFetchFactor;\n return Math.min(Math.max(Math.ceil(topK * factor), topK), 1000);\n}\n","/**\n * Configuration validation for SDK initialization and constructor options.\n */\n\nimport type {\n WolbargOptions,\n StorageInput,\n} from \"./options.js\";\nimport {\n isEmbeddingProvider,\n isLlmProvider,\n isStorageProvider,\n isTelemetryProvider,\n resolveDatabaseUrl,\n} from \"./options.js\";\nimport type {\n DatabaseConfig,\n EmbeddingConfig,\n InitOptions,\n LlmConfig,\n StorageConfig,\n TelemetryConfig,\n} from \"../types/index.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\n\nfunction assertNonEmpty(value: unknown, fieldName: string): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new ConfigurationError(`${fieldName} must be a non-empty string`);\n }\n}\n\nfunction assertUrl(value: string, fieldName: string): void {\n assertNonEmpty(value, fieldName);\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n } catch {\n throw new ConfigurationError(\n `${fieldName} must be a valid absolute URL (got \"${value}\")`,\n );\n }\n}\n\nexport function validateEmbeddingConfig(config: EmbeddingConfig): EmbeddingConfig {\n assertUrl(config.baseUrl, \"embedding.baseUrl\");\n assertNonEmpty(config.apiKey, \"embedding.apiKey\");\n assertNonEmpty(config.model, \"embedding.model\");\n if (\n config.timeoutMs !== undefined &&\n (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)\n ) {\n throw new ConfigurationError(\"embedding.timeoutMs must be a positive number\");\n }\n return {\n baseUrl: config.baseUrl.trim().replace(/\\/+$/, \"\"),\n apiKey: config.apiKey,\n model: config.model.trim(),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n };\n}\n\nexport function validateLlmConfig(config: LlmConfig): LlmConfig {\n assertUrl(config.baseUrl, \"llm.baseUrl\");\n assertNonEmpty(config.apiKey, \"llm.apiKey\");\n assertNonEmpty(config.model, \"llm.model\");\n if (\n config.temperature !== undefined &&\n (!Number.isFinite(config.temperature) ||\n config.temperature < 0 ||\n config.temperature > 2)\n ) {\n throw new ConfigurationError(\"llm.temperature must be between 0 and 2\");\n }\n if (\n config.maxTokens !== undefined &&\n (!Number.isFinite(config.maxTokens) || config.maxTokens <= 0)\n ) {\n throw new ConfigurationError(\"llm.maxTokens must be a positive number\");\n }\n if (\n config.timeoutMs !== undefined &&\n (!Number.isFinite(config.timeoutMs) || config.timeoutMs <= 0)\n ) {\n throw new ConfigurationError(\"llm.timeoutMs must be a positive number\");\n }\n return {\n baseUrl: config.baseUrl.trim().replace(/\\/+$/, \"\"),\n apiKey: config.apiKey,\n model: config.model.trim(),\n ...(config.temperature !== undefined ? { temperature: config.temperature } : {}),\n ...(config.maxTokens !== undefined ? { maxTokens: config.maxTokens } : {}),\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n };\n}\n\nexport function normalizeDatabaseConfig(\n config: DatabaseConfig | StorageConfig,\n): DatabaseConfig {\n const provider = config.provider;\n if (provider !== \"sqlite\" && provider !== \"postgres\") {\n throw new ConfigurationError(\n `Unsupported database provider \"${String((config as { provider?: string }).provider)}\". Supported: \"sqlite\", \"postgres\".`,\n );\n }\n const connectionString = resolveDatabaseUrl(config).trim();\n assertNonEmpty(connectionString, \"database.url / database.connectionString\");\n\n if (provider === \"postgres\") {\n return {\n provider: \"postgres\",\n connectionString,\n url: connectionString,\n ...(\"maxPoolSize\" in config && config.maxPoolSize !== undefined\n ? { maxPoolSize: config.maxPoolSize }\n : {}),\n };\n }\n return {\n provider: \"sqlite\",\n connectionString,\n url: connectionString,\n };\n}\n\nexport function validateTelemetryConfig(config: TelemetryConfig): TelemetryConfig {\n if (!config.database || typeof config.database !== \"object\") {\n throw new ConfigurationError(\"telemetry.database is required when telemetry is enabled\");\n }\n if (config.database.provider !== \"sqlite\") {\n throw new ConfigurationError(\n `Unsupported telemetry provider \"${config.database.provider}\". Only \"sqlite\" is implemented in v0.3.0; PostgreSQL will be added later without changing application code.`,\n {\n reason: `provider=${config.database.provider}`,\n suggestion: 'Use telemetry: { database: { provider: \"sqlite\", url: \"./telemetry.db\" } }',\n },\n );\n }\n const url =\n config.database.url?.trim() ||\n config.database.connectionString?.trim() ||\n \"\";\n assertNonEmpty(url, \"telemetry.database.url\");\n\n const level = config.level ?? \"info\";\n const allowed = new Set([\"off\", \"error\", \"warn\", \"info\", \"debug\", \"trace\"]);\n if (!allowed.has(level)) {\n throw new ConfigurationError(`Invalid telemetry.level \"${level}\"`);\n }\n\n return {\n enabled: config.enabled ?? true,\n database: {\n provider: \"sqlite\",\n url,\n connectionString: url,\n },\n level,\n captureQueries: config.captureQueries ?? true,\n captureLatency: config.captureLatency ?? true,\n captureErrors: config.captureErrors ?? true,\n captureSimilarity: config.captureSimilarity ?? true,\n captureEmbeddings: config.captureEmbeddings ?? false,\n };\n}\n\n/**\n * Validate and normalize init options (v0.1 compat).\n */\nexport function validateInitOptions(options: InitOptions): InitOptions {\n if (options === null || typeof options !== \"object\") {\n throw new ConfigurationError(\"init options must be an object\");\n }\n\n assertNonEmpty(options.organization, \"organization\");\n\n if (!options.database || typeof options.database !== \"object\") {\n throw new ConfigurationError(\"database configuration is required\");\n }\n\n const database = normalizeDatabaseConfig(options.database);\n\n if (!options.embedding || typeof options.embedding !== \"object\") {\n throw new ConfigurationError(\"embedding configuration is required\");\n }\n\n const embedding = validateEmbeddingConfig(options.embedding);\n const llm = options.llm ? validateLlmConfig(options.llm) : undefined;\n\n return {\n organization: options.organization.trim(),\n database,\n embedding,\n ...(llm ? { llm } : {}),\n };\n}\n\nfunction resolveStorageInput(options: WolbargOptions): StorageInput {\n if (options.storage && options.database) {\n throw new ConfigurationError(\n \"Pass either storage or database, not both\",\n );\n }\n const input = options.storage ?? options.database;\n if (!input) {\n throw new ConfigurationError(\"storage or database is required\");\n }\n return input;\n}\n\nexport function validateWolbargOptions(options: WolbargOptions): WolbargOptions {\n if (options === null || typeof options !== \"object\") {\n throw new ConfigurationError(\"Wolbarg options must be an object\");\n }\n assertNonEmpty(options.organization, \"organization\");\n\n const storageInput = resolveStorageInput(options);\n let storage: StorageInput = storageInput;\n if (!isStorageProvider(storageInput)) {\n storage = normalizeDatabaseConfig(storageInput);\n }\n\n if (!options.embedding) {\n throw new ConfigurationError(\"embedding is required\");\n }\n if (!isEmbeddingProvider(options.embedding)) {\n validateEmbeddingConfig(options.embedding);\n }\n\n if (options.llm !== undefined && !isLlmProvider(options.llm)) {\n validateLlmConfig(options.llm);\n }\n\n let telemetry = options.telemetry;\n if (telemetry && !isTelemetryProvider(telemetry)) {\n telemetry = validateTelemetryConfig(telemetry);\n }\n\n return {\n ...options,\n organization: options.organization.trim(),\n storage,\n database: undefined,\n ...(telemetry ? { telemetry } : {}),\n };\n}\n","/**\n * Cross-platform structured logger gated by TelemetryLogLevel.\n */\n\nimport type { TelemetryLogLevel } from \"./types.js\";\n\nconst LEVEL_ORDER: Record<TelemetryLogLevel, number> = {\n off: 100,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10,\n};\n\nexport class WolbargLogger {\n constructor(private level: TelemetryLogLevel = \"info\") {}\n\n setLevel(level: TelemetryLogLevel): void {\n this.level = level;\n }\n\n getLevel(): TelemetryLogLevel {\n return this.level;\n }\n\n error(message: string, extra?: unknown): void {\n this.write(\"error\", message, extra);\n }\n\n warn(message: string, extra?: unknown): void {\n this.write(\"warn\", message, extra);\n }\n\n info(message: string, extra?: unknown): void {\n this.write(\"info\", message, extra);\n }\n\n debug(message: string, extra?: unknown): void {\n this.write(\"debug\", message, extra);\n }\n\n trace(message: string, extra?: unknown): void {\n this.write(\"trace\", message, extra);\n }\n\n private write(level: TelemetryLogLevel, message: string, extra?: unknown): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) {\n return;\n }\n if (this.level === \"off\") {\n return;\n }\n const line = `[wolbarg:${level}] ${message}`;\n if (level === \"error\") {\n console.error(line, extra ?? \"\");\n } else if (level === \"warn\") {\n console.warn(line, extra ?? \"\");\n } else {\n console.log(line, extra ?? \"\");\n }\n }\n}\n","/**\n * Trace context helpers — session_id, trace_id, parent_trace_id.\n */\n\nimport { createId } from \"../utils/index.js\";\n\nexport interface TraceContext {\n sessionId: string;\n traceId: string;\n parentTraceId: string | null;\n}\n\nexport function createSessionId(): string {\n return createId();\n}\n\nexport function createTraceId(): string {\n return createId();\n}\n\nexport function createRootTrace(sessionId: string): TraceContext {\n return {\n sessionId,\n traceId: createTraceId(),\n parentTraceId: null,\n };\n}\n\nexport function createChildTrace(parent: TraceContext): TraceContext {\n return {\n sessionId: parent.sessionId,\n traceId: createTraceId(),\n parentTraceId: parent.traceId,\n };\n}\n","/**\n * Async telemetry emitter that never blocks memory operations.\n */\n\nimport type { TelemetryProvider } from \"../providers/interfaces/TelemetryProvider.js\";\nimport type {\n LatencyBreakdown,\n StageSpan,\n TelemetryConfig,\n TelemetryEventInput,\n TelemetryOperation,\n TelemetryStatus,\n} from \"./types.js\";\nimport { WolbargLogger } from \"./logger.js\";\nimport {\n createChildTrace,\n createRootTrace,\n createSessionId,\n type TraceContext,\n} from \"./trace.js\";\nimport { createId, nowIso } from \"../utils/index.js\";\n\nexport class NoopTelemetryProvider implements TelemetryProvider {\n readonly name = \"noop\";\n\n async open(): Promise<void> {}\n async close(): Promise<void> {}\n emit(_event: TelemetryEventInput): void {}\n async flush(): Promise<void> {}\n}\n\nexport interface OperationTraceHandle {\n context: TraceContext;\n startedAt: number;\n latency: Partial<LatencyBreakdown>;\n child(operation: TelemetryOperation): OperationTraceHandle;\n mark(stage: keyof Omit<LatencyBreakdown, \"totalMs\">, ms: number): void;\n success(fields?: Partial<TelemetryEventInput>): void;\n failure(error: unknown, fields?: Partial<TelemetryEventInput>): void;\n}\n\nexport interface TelemetryEmitterContext {\n organization?: string | null;\n}\n\nexport class TelemetryEmitter {\n readonly sessionId: string;\n readonly logger: WolbargLogger;\n private provider: TelemetryProvider;\n private readonly config: Required<\n Pick<\n TelemetryConfig,\n | \"enabled\"\n | \"level\"\n | \"captureQueries\"\n | \"captureLatency\"\n | \"captureErrors\"\n | \"captureSimilarity\"\n | \"captureEmbeddings\"\n >\n >;\n private readonly context: TelemetryEmitterContext;\n\n constructor(\n provider: TelemetryProvider | null,\n config?: Partial<TelemetryConfig>,\n context: TelemetryEmitterContext = {},\n ) {\n this.sessionId = createSessionId();\n this.provider = provider ?? new NoopTelemetryProvider();\n this.config = {\n enabled: config?.enabled ?? Boolean(provider),\n level: config?.level ?? \"info\",\n captureQueries: config?.captureQueries ?? true,\n captureLatency: config?.captureLatency ?? true,\n captureErrors: config?.captureErrors ?? true,\n captureSimilarity: config?.captureSimilarity ?? true,\n captureEmbeddings: config?.captureEmbeddings ?? false,\n };\n this.context = context;\n this.logger = new WolbargLogger(this.config.level);\n }\n\n get enabled(): boolean {\n return this.config.enabled && this.provider.name !== \"noop\";\n }\n\n setProvider(provider: TelemetryProvider): void {\n this.provider = provider;\n }\n\n async open(): Promise<void> {\n if (!this.config.enabled) {\n return;\n }\n await this.provider.open();\n }\n\n async close(): Promise<void> {\n await this.provider.flush();\n await this.provider.close();\n }\n\n async flush(): Promise<void> {\n await this.provider.flush();\n }\n\n start(operation: TelemetryOperation, parent?: TraceContext): OperationTraceHandle {\n const context = parent\n ? createChildTrace(parent)\n : createRootTrace(this.sessionId);\n const startedAt = performance.now();\n const latency: Partial<LatencyBreakdown> = {};\n const spans: StageSpan[] = [];\n const self = this;\n\n const finish = (\n status: TelemetryStatus,\n fields?: Partial<TelemetryEventInput>,\n error?: unknown,\n ): void => {\n const totalMs = performance.now() - startedAt;\n const errMessage =\n error instanceof Error\n ? error.message\n : error\n ? String(error)\n : fields?.error ?? null;\n const errStack =\n error instanceof Error ? error.stack ?? null : fields?.errorStack ?? null;\n\n if (status === \"error\") {\n self.logger.error(`${operation} failed: ${errMessage ?? \"unknown\"}`);\n } else {\n self.logger.debug(`${operation} completed in ${totalMs.toFixed(2)}ms`);\n }\n\n if (!self.config.enabled) {\n return;\n }\n\n const event: TelemetryEventInput = {\n id: createId(),\n timestamp: nowIso(),\n operation,\n status,\n sessionId: context.sessionId,\n traceId: context.traceId,\n parentTraceId: context.parentTraceId,\n organization: fields?.organization ?? self.context.organization ?? null,\n agentId: fields?.agentId ?? null,\n tags: fields?.tags ?? null,\n checkpointId: fields?.checkpointId ?? null,\n durationMs: totalMs,\n provider: fields?.provider ?? null,\n query: self.config.captureQueries ? (fields?.query ?? null) : null,\n filters: fields?.filters ?? null,\n returnedCount: fields?.returnedCount ?? null,\n memoryIds: fields?.memoryIds ?? null,\n similarityScores: self.config.captureSimilarity\n ? (fields?.similarityScores ?? null)\n : null,\n metadata: fields?.metadata ?? null,\n embeddingProvider: fields?.embeddingProvider ?? null,\n model: fields?.model ?? null,\n error: self.config.captureErrors ? errMessage : null,\n errorStack: self.config.captureErrors ? errStack : null,\n userMetadata: fields?.userMetadata ?? null,\n extra: fields?.extra ?? null,\n latency: self.config.captureLatency\n ? { ...latency, totalMs, ...(fields?.latency ?? {}) }\n : { totalMs },\n explain: fields?.explain ?? null,\n spans: self.config.captureLatency\n ? [...spans, ...(fields?.spans ?? [])]\n : null,\n };\n\n // Never await — memory path must stay non-blocking.\n self.provider.emit(event);\n };\n\n return {\n context,\n startedAt,\n latency,\n child(childOp: TelemetryOperation): OperationTraceHandle {\n return self.start(childOp, context);\n },\n mark(stage, ms) {\n latency[stage] = ms;\n const elapsed = performance.now() - startedAt;\n spans.push({\n name: stage,\n startMs: Math.max(0, elapsed - ms),\n durationMs: ms,\n });\n },\n success(fields) {\n finish(\"ok\", fields);\n },\n failure(error, fields) {\n finish(\"error\", fields, error);\n },\n };\n }\n\n emitStartup(provider: string): void {\n const trace = this.start(\"startup\");\n trace.success({ provider });\n }\n\n emitShutdown(provider: string): void {\n const trace = this.start(\"shutdown\");\n trace.success({ provider });\n }\n}\n","/**\n * SQLite EventDatabase — completely separate from the memory database.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync, type StatementSync } from \"node:sqlite\";\n\nimport { DatabaseError, InitializationError } from \"../../errors/index.js\";\nimport type { EventDatabase } from \"../interfaces/EventDatabase.js\";\nimport type {\n LatencyBreakdown,\n PersistedRecallExplainPayload,\n StageSpan,\n TelemetryEvent,\n TelemetryEventInput,\n TelemetryQuery,\n TelemetryQueryResult,\n} from \"../../telemetry/types.js\";\nimport { createId, nowIso } from \"../../utils/index.js\";\n\nconst SCHEMA_SQL = `\nCREATE TABLE IF NOT EXISTS telemetry_events (\n id TEXT PRIMARY KEY,\n timestamp TEXT NOT NULL,\n operation TEXT NOT NULL,\n provider TEXT,\n duration_ms REAL,\n status TEXT NOT NULL,\n query TEXT,\n filters_json TEXT,\n returned_count INTEGER,\n memory_ids_json TEXT,\n similarity_scores_json TEXT,\n metadata_json TEXT,\n embedding_provider TEXT,\n model TEXT,\n error TEXT,\n error_stack TEXT,\n session_id TEXT NOT NULL,\n trace_id TEXT NOT NULL,\n parent_trace_id TEXT,\n user_metadata_json TEXT,\n extra_json TEXT,\n latency_json TEXT,\n organization TEXT,\n agent_id TEXT,\n tags_json TEXT,\n checkpoint_id TEXT,\n explain_json TEXT,\n spans_json TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_telemetry_timestamp ON telemetry_events(timestamp);\nCREATE INDEX IF NOT EXISTS idx_telemetry_operation ON telemetry_events(operation);\nCREATE INDEX IF NOT EXISTS idx_telemetry_trace ON telemetry_events(trace_id);\nCREATE INDEX IF NOT EXISTS idx_telemetry_session ON telemetry_events(session_id);\nCREATE INDEX IF NOT EXISTS idx_telemetry_status ON telemetry_events(status);\n`;\n\nconst V2_COLUMNS = {\n organization: \"TEXT\",\n agent_id: \"TEXT\",\n tags_json: \"TEXT\",\n checkpoint_id: \"TEXT\",\n explain_json: \"TEXT\",\n spans_json: \"TEXT\",\n} as const;\n\nconst V2_INDEXES_SQL = `\nCREATE INDEX IF NOT EXISTS idx_telemetry_agent ON telemetry_events(agent_id);\nCREATE INDEX IF NOT EXISTS idx_telemetry_org ON telemetry_events(organization);\nCREATE INDEX IF NOT EXISTS idx_telemetry_checkpoint ON telemetry_events(checkpoint_id);\nCREATE INDEX IF NOT EXISTS idx_telemetry_operation_time ON telemetry_events(operation, timestamp);\nCREATE INDEX IF NOT EXISTS idx_telemetry_status_time ON telemetry_events(status, timestamp);\n`;\n\nexport interface SqliteEventDatabaseOptions {\n url: string;\n /** When true, open read-only (Studio). */\n readonly?: boolean;\n}\n\nexport class SqliteEventDatabase implements EventDatabase {\n readonly name = \"sqlite\";\n private readonly url: string;\n private readonly readonly: boolean;\n private db: DatabaseSync | null = null;\n private insertStmt: StatementSync | null = null;\n private columns = new Set<string>();\n\n constructor(options: SqliteEventDatabaseOptions) {\n this.url = options.url;\n this.readonly = options.readonly ?? false;\n }\n\n async open(): Promise<void> {\n try {\n const dbPath = this.resolvePath(this.url);\n if (dbPath !== \":memory:\" && !this.readonly) {\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n }\n\n const db = new DatabaseSync(dbPath, {\n allowExtension: false,\n readOnly: this.readonly,\n });\n this.db = db;\n\n if (!this.readonly) {\n db.exec(\"PRAGMA journal_mode = WAL;\");\n db.exec(`\n PRAGMA synchronous = NORMAL;\n PRAGMA busy_timeout = 5000;\n PRAGMA temp_store = MEMORY;\n `);\n db.exec(SCHEMA_SQL);\n this.migrateToV2(db);\n }\n this.columns = readColumns(db);\n if (!this.readonly) {\n this.insertStmt = db.prepare(`\n INSERT INTO telemetry_events (\n id, timestamp, operation, provider, duration_ms, status,\n query, filters_json, returned_count, memory_ids_json,\n similarity_scores_json, metadata_json, embedding_provider, model,\n error, error_stack, session_id, trace_id, parent_trace_id,\n user_metadata_json, extra_json, latency_json, organization,\n agent_id, tags_json, checkpoint_id, explain_json, spans_json\n ) VALUES (\n ?, ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?, ?\n )\n `);\n }\n } catch (error) {\n try {\n this.db?.close();\n } catch {\n // ignore\n }\n this.db = null;\n this.columns.clear();\n throw new InitializationError(\n `Failed to open telemetry EventDatabase: ${describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n async close(): Promise<void> {\n if (!this.db) return;\n try {\n this.db.close();\n } finally {\n this.db = null;\n this.insertStmt = null;\n this.columns.clear();\n }\n }\n\n async insertEvent(input: TelemetryEventInput): Promise<TelemetryEvent> {\n const event = normalizeEvent(input);\n const stmt = this.insertStmt;\n if (!stmt) {\n throw new DatabaseError(\"Telemetry EventDatabase is not open for writes\");\n }\n try {\n stmt.run(\n event.id,\n event.timestamp,\n event.operation,\n event.provider,\n event.durationMs,\n event.status,\n event.query,\n jsonOrNull(event.filters),\n event.returnedCount,\n jsonOrNull(event.memoryIds),\n jsonOrNull(event.similarityScores),\n jsonOrNull(event.metadata),\n event.embeddingProvider,\n event.model,\n event.error,\n event.errorStack,\n event.sessionId,\n event.traceId,\n event.parentTraceId,\n jsonOrNull(event.userMetadata),\n jsonOrNull(event.extra),\n jsonOrNull(event.latency),\n event.organization,\n event.agentId,\n jsonOrNull(event.tags),\n event.checkpointId,\n jsonOrNull(event.explain),\n jsonOrNull(event.spans),\n );\n return event;\n } catch (error) {\n throw new DatabaseError(\n `Failed to write telemetry event: ${describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n async insertEvents(inputs: TelemetryEventInput[]): Promise<TelemetryEvent[]> {\n const db = this.requireDb();\n const out: TelemetryEvent[] = [];\n db.exec(\"BEGIN\");\n try {\n for (const input of inputs) {\n out.push(await this.insertEvent(input));\n }\n db.exec(\"COMMIT\");\n return out;\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore\n }\n throw error;\n }\n }\n\n async query(options: TelemetryQuery): Promise<TelemetryQueryResult> {\n const db = this.requireDb();\n const clauses: string[] = [];\n const params: Array<string | number> = [];\n\n if (options.operation) {\n const ops = Array.isArray(options.operation)\n ? options.operation\n : [options.operation];\n clauses.push(`operation IN (${ops.map(() => \"?\").join(\",\")})`);\n params.push(...ops);\n }\n if (options.status) {\n clauses.push(`status = ?`);\n params.push(options.status);\n }\n if (options.traceId) {\n clauses.push(`(trace_id = ? OR parent_trace_id = ?)`);\n params.push(options.traceId, options.traceId);\n }\n if (options.sessionId) {\n clauses.push(`session_id = ?`);\n params.push(options.sessionId);\n }\n this.addOptionalColumnFilter(\n clauses,\n params,\n \"organization\",\n options.organization,\n );\n this.addOptionalColumnFilter(clauses, params, \"agent_id\", options.agentId);\n this.addOptionalColumnFilter(\n clauses,\n params,\n \"checkpoint_id\",\n options.checkpointId,\n );\n if (options.tag) {\n if (this.columns.has(\"tags_json\")) {\n clauses.push(\n `EXISTS (SELECT 1 FROM json_each(tags_json) WHERE json_each.value = ?)`,\n );\n params.push(options.tag);\n } else {\n clauses.push(\"0 = 1\");\n }\n }\n if (options.memoryId) {\n clauses.push(`memory_ids_json LIKE ?`);\n params.push(`%${options.memoryId}%`);\n }\n if (options.queryText) {\n clauses.push(`query LIKE ?`);\n params.push(`%${options.queryText}%`);\n }\n if (options.since) {\n clauses.push(`timestamp >= ?`);\n params.push(options.since);\n }\n if (options.until) {\n clauses.push(`timestamp <= ?`);\n params.push(options.until);\n }\n\n const where = clauses.length > 0 ? `WHERE ${clauses.join(\" AND \")}` : \"\";\n const sortCol =\n options.sortBy === \"duration_ms\" ? \"duration_ms\" : \"timestamp\";\n const sortDir = options.sortDir === \"asc\" ? \"ASC\" : \"DESC\";\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n const totalRow = db\n .prepare(`SELECT COUNT(*) AS c FROM telemetry_events ${where}`)\n .get(...params) as { c: number | bigint };\n const rows = db\n .prepare(\n `SELECT * FROM telemetry_events ${where}\n ORDER BY ${sortCol} ${sortDir}\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset) as unknown as Row[];\n\n return {\n events: rows.map(rowToEvent),\n total: Number(totalRow.c),\n limit,\n offset,\n };\n }\n\n async getEvent(id: string): Promise<TelemetryEvent | null> {\n const db = this.requireDb();\n const row = db\n .prepare(`SELECT * FROM telemetry_events WHERE id = ?`)\n .get(id) as Row | undefined;\n return row ? rowToEvent(row) : null;\n }\n\n async countEvents(filter?: {\n since?: string;\n operation?: string;\n }): Promise<number> {\n const db = this.requireDb();\n const clauses: string[] = [];\n const params: string[] = [];\n if (filter?.since) {\n clauses.push(`timestamp >= ?`);\n params.push(filter.since);\n }\n if (filter?.operation) {\n clauses.push(`operation = ?`);\n params.push(filter.operation);\n }\n const where = clauses.length ? `WHERE ${clauses.join(\" AND \")}` : \"\";\n const row = db\n .prepare(`SELECT COUNT(*) AS c FROM telemetry_events ${where}`)\n .get(...params) as { c: number | bigint };\n return Number(row.c);\n }\n\n private requireDb(): DatabaseSync {\n if (!this.db) {\n throw new DatabaseError(\"Telemetry EventDatabase is not open\");\n }\n return this.db;\n }\n\n private migrateToV2(db: DatabaseSync): void {\n const columns = readColumns(db);\n for (const [name, type] of Object.entries(V2_COLUMNS)) {\n if (!columns.has(name)) {\n db.exec(`ALTER TABLE telemetry_events ADD COLUMN ${name} ${type};`);\n }\n }\n db.exec(`\n CREATE TABLE IF NOT EXISTS telemetry_meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n INSERT INTO telemetry_meta(key, value) VALUES ('schema_version', '2')\n ON CONFLICT(key) DO UPDATE SET value = excluded.value;\n ${V2_INDEXES_SQL}\n `);\n }\n\n private addOptionalColumnFilter(\n clauses: string[],\n params: Array<string | number>,\n column: string,\n value: string | undefined,\n ): void {\n if (!value) return;\n if (!this.columns.has(column)) {\n clauses.push(\"0 = 1\");\n return;\n }\n clauses.push(`${column} = ?`);\n params.push(value);\n }\n\n private resolvePath(url: string): string {\n if (url === \":memory:\") return \":memory:\";\n return path.isAbsolute(url) ? url : path.resolve(process.cwd(), url);\n }\n}\n\ninterface Row {\n id: string;\n timestamp: string;\n operation: string;\n provider: string | null;\n duration_ms: number | null;\n status: string;\n query: string | null;\n filters_json: string | null;\n returned_count: number | null;\n memory_ids_json: string | null;\n similarity_scores_json: string | null;\n metadata_json: string | null;\n embedding_provider: string | null;\n model: string | null;\n error: string | null;\n error_stack: string | null;\n session_id: string;\n trace_id: string;\n parent_trace_id: string | null;\n user_metadata_json: string | null;\n extra_json: string | null;\n latency_json: string | null;\n organization?: string | null;\n agent_id?: string | null;\n tags_json?: string | null;\n checkpoint_id?: string | null;\n explain_json?: string | null;\n spans_json?: string | null;\n}\n\nfunction normalizeEvent(input: TelemetryEventInput): TelemetryEvent {\n return {\n id: input.id ?? createId(),\n timestamp: input.timestamp ?? nowIso(),\n operation: input.operation,\n provider: input.provider ?? null,\n durationMs: input.durationMs ?? null,\n status: input.status,\n query: input.query ?? null,\n filters: input.filters ?? null,\n returnedCount: input.returnedCount ?? null,\n memoryIds: input.memoryIds ?? null,\n similarityScores: input.similarityScores ?? null,\n metadata: input.metadata ?? null,\n embeddingProvider: input.embeddingProvider ?? null,\n model: input.model ?? null,\n error: input.error ?? null,\n errorStack: input.errorStack ?? null,\n sessionId: input.sessionId,\n traceId: input.traceId,\n parentTraceId: input.parentTraceId ?? null,\n organization: input.organization ?? null,\n agentId: input.agentId ?? null,\n tags: input.tags ?? null,\n checkpointId: input.checkpointId ?? null,\n userMetadata: input.userMetadata ?? null,\n extra: input.extra ?? null,\n latency: input.latency ?? null,\n explain: input.explain ?? null,\n spans: input.spans ?? null,\n };\n}\n\nfunction rowToEvent(row: Row): TelemetryEvent {\n return {\n id: row.id,\n timestamp: row.timestamp,\n operation: row.operation as TelemetryEvent[\"operation\"],\n provider: row.provider,\n durationMs: row.duration_ms,\n status: row.status as TelemetryEvent[\"status\"],\n query: row.query,\n filters: parseJson(row.filters_json),\n returnedCount: row.returned_count,\n memoryIds: parseJson(row.memory_ids_json) as string[] | null,\n similarityScores: parseJson(row.similarity_scores_json) as number[] | null,\n metadata: parseJson(row.metadata_json) as Record<string, unknown> | null,\n embeddingProvider: row.embedding_provider,\n model: row.model,\n error: row.error,\n errorStack: row.error_stack,\n sessionId: row.session_id,\n traceId: row.trace_id,\n parentTraceId: row.parent_trace_id,\n organization: row.organization ?? null,\n agentId: row.agent_id ?? null,\n tags: parseJson(row.tags_json ?? null) as string[] | null,\n checkpointId: row.checkpoint_id ?? null,\n userMetadata: parseJson(row.user_metadata_json) as Record<\n string,\n unknown\n > | null,\n extra: parseJson(row.extra_json) as Record<string, unknown> | null,\n latency: parseJson(row.latency_json) as LatencyBreakdown | null,\n explain: parseJson(\n row.explain_json ?? null,\n ) as PersistedRecallExplainPayload | null,\n spans: parseJson(row.spans_json ?? null) as StageSpan[] | null,\n };\n}\n\nfunction readColumns(db: DatabaseSync): Set<string> {\n const rows = db.prepare(\"PRAGMA table_info(telemetry_events)\").all() as Array<{\n name: string;\n }>;\n return new Set(rows.map((row) => row.name));\n}\n\nfunction jsonOrNull(value: unknown): string | null {\n if (value === undefined || value === null) return null;\n return JSON.stringify(value);\n}\n\nfunction parseJson(value: string | null): unknown {\n if (!value) return null;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * SQLite TelemetryProvider backed by an independent EventDatabase.\n * Writes are queued and flushed asynchronously so memory ops stay fast.\n */\n\nimport type { TelemetryProvider } from \"../interfaces/TelemetryProvider.js\";\nimport type {\n TelemetryEvent,\n TelemetryEventInput,\n TelemetryQuery,\n TelemetryQueryResult,\n} from \"../../telemetry/types.js\";\nimport { SqliteEventDatabase } from \"./sqliteEventDatabase.js\";\n\nexport interface SqliteTelemetryProviderOptions {\n url: string;\n}\n\nexport class SqliteTelemetryProvider implements TelemetryProvider {\n readonly name = \"sqlite\";\n private readonly db: SqliteEventDatabase;\n private queue: TelemetryEventInput[] = [];\n private flushing: Promise<void> | null = null;\n private closed = false;\n private openPromise: Promise<void> | null = null;\n\n constructor(options: SqliteTelemetryProviderOptions) {\n this.db = new SqliteEventDatabase({ url: options.url });\n }\n\n async open(): Promise<void> {\n if (!this.openPromise) {\n this.openPromise = this.db.open();\n }\n await this.openPromise;\n this.closed = false;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n await this.flush();\n await this.db.close();\n this.openPromise = null;\n }\n\n emit(event: TelemetryEventInput): void {\n if (this.closed) {\n return;\n }\n this.queue.push(event);\n void this.scheduleFlush();\n }\n\n async flush(): Promise<void> {\n while (this.queue.length > 0 || this.flushing) {\n await this.scheduleFlush();\n if (this.flushing) {\n await this.flushing;\n }\n }\n }\n\n async query(options: TelemetryQuery): Promise<TelemetryQueryResult> {\n await this.open();\n return this.db.query(options);\n }\n\n async getEvent(id: string): Promise<TelemetryEvent | null> {\n await this.open();\n return this.db.getEvent(id);\n }\n\n private scheduleFlush(): Promise<void> {\n if (this.flushing) {\n return this.flushing;\n }\n this.flushing = this.runFlush().finally(() => {\n this.flushing = null;\n });\n return this.flushing;\n }\n\n private async runFlush(): Promise<void> {\n if (this.queue.length === 0) {\n return;\n }\n await this.open();\n const batch = this.queue.splice(0, this.queue.length);\n try {\n if (typeof this.db.insertEvents === \"function\") {\n await this.db.insertEvents(batch);\n } else {\n for (const event of batch) {\n await this.db.insertEvent(event);\n }\n }\n } catch {\n // Telemetry must never crash the host application.\n // Drop failed batch rather than re-queue forever.\n }\n }\n}\n","/**\n * First-party SQLite checkpoint provider.\n * Creates immutable named snapshots of the memory database.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport {\n ConfigurationError,\n DatabaseError,\n ValidationError,\n} from \"../../errors/index.js\";\nimport type {\n CheckpointMeta,\n CheckpointProvider,\n CreateCheckpointOptions,\n} from \"../interfaces/CheckpointProvider.js\";\nimport { nowIso } from \"../../utils/index.js\";\n\nconst SDK_VERSION = \"0.3.0\";\n\nexport interface SqliteCheckpointProviderOptions {\n /** Directory that stores checkpoint snapshots + metadata. */\n directory?: string;\n}\n\ninterface CheckpointRecord extends CheckpointMeta {\n // marker for JSON shape\n}\n\nexport class SqliteCheckpointProvider implements CheckpointProvider {\n readonly name = \"sqlite\";\n private readonly directory: string;\n private ready = false;\n\n constructor(options?: SqliteCheckpointProviderOptions) {\n this.directory =\n options?.directory ??\n path.resolve(process.cwd(), \".wolbarg\", \"checkpoints\");\n }\n\n async open(): Promise<void> {\n fs.mkdirSync(this.directory, { recursive: true });\n this.ready = true;\n }\n\n async close(): Promise<void> {\n this.ready = false;\n }\n\n async checkpoint(\n name: string,\n sourcePath: string,\n options?: CreateCheckpointOptions,\n ): Promise<CheckpointMeta> {\n this.requireReady();\n assertCheckpointName(name);\n\n const metaPath = this.metaPath(name);\n if (fs.existsSync(metaPath)) {\n throw new ValidationError(\n `Checkpoint \"${name}\" already exists. Choose a different name — checkpoints are never overwritten.`,\n );\n }\n\n const resolvedSource = resolveDbPath(sourcePath);\n if (resolvedSource === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot checkpoint an in-memory database. Use a file-backed SQLite database.\",\n );\n }\n if (!fs.existsSync(resolvedSource)) {\n throw new DatabaseError(\n `Failed to execute checkpoint()\\nReason:\\nMemory database not found at ${resolvedSource}\\nSuggestion:\\nEnsure Wolbarg has been initialized and the database path is correct.`,\n );\n }\n\n const snapshotPath = this.snapshotPath(name);\n await safeSqliteBackup(resolvedSource, snapshotPath);\n\n const stats = fs.statSync(snapshotPath);\n const meta: CheckpointRecord = {\n name,\n description: options?.description ?? null,\n createdAt: nowIso(),\n sdkVersion: SDK_VERSION,\n provider: this.name,\n snapshotPath,\n sourcePath: resolvedSource,\n sizeBytes: stats.size,\n };\n fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2), \"utf8\");\n return meta;\n }\n\n async rollback(name: string, targetPath: string): Promise<CheckpointMeta> {\n this.requireReady();\n const meta = await this.getCheckpoint(name);\n if (!meta) {\n throw new ValidationError(`Checkpoint \"${name}\" was not found`);\n }\n const resolvedTarget = resolveDbPath(targetPath);\n if (resolvedTarget === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot rollback into an in-memory database.\",\n );\n }\n\n fs.mkdirSync(path.dirname(resolvedTarget), { recursive: true });\n // Remove WAL/SHM so the restored main file is authoritative.\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n const side = `${resolvedTarget}${suffix}`;\n if (fs.existsSync(side)) {\n fs.rmSync(side, { force: true });\n }\n }\n await safeSqliteBackup(meta.snapshotPath, resolvedTarget);\n return meta;\n }\n\n async deleteCheckpoint(name: string): Promise<boolean> {\n this.requireReady();\n const metaPath = this.metaPath(name);\n const snapshotPath = this.snapshotPath(name);\n let removed = false;\n if (fs.existsSync(metaPath)) {\n fs.rmSync(metaPath, { force: true });\n removed = true;\n }\n if (fs.existsSync(snapshotPath)) {\n fs.rmSync(snapshotPath, { force: true });\n removed = true;\n }\n return removed;\n }\n\n async listCheckpoints(): Promise<CheckpointMeta[]> {\n this.requireReady();\n if (!fs.existsSync(this.directory)) {\n return [];\n }\n const files = fs\n .readdirSync(this.directory)\n .filter((f) => f.endsWith(\".json\"));\n const out: CheckpointMeta[] = [];\n for (const file of files) {\n try {\n const raw = fs.readFileSync(path.join(this.directory, file), \"utf8\");\n out.push(JSON.parse(raw) as CheckpointMeta);\n } catch {\n // skip corrupt metadata\n }\n }\n return out.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n }\n\n async getCheckpoint(name: string): Promise<CheckpointMeta | null> {\n this.requireReady();\n const metaPath = this.metaPath(name);\n if (!fs.existsSync(metaPath)) {\n return null;\n }\n try {\n return JSON.parse(fs.readFileSync(metaPath, \"utf8\")) as CheckpointMeta;\n } catch {\n return null;\n }\n }\n\n private metaPath(name: string): string {\n return path.join(this.directory, `${sanitize(name)}.json`);\n }\n\n private snapshotPath(name: string): string {\n return path.join(this.directory, `${sanitize(name)}.db`);\n }\n\n private requireReady(): void {\n if (!this.ready) {\n throw new DatabaseError(\n \"Checkpoint provider is not open. Call ready() / open first.\",\n );\n }\n }\n}\n\nfunction sanitize(name: string): string {\n return name.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n\nfunction assertCheckpointName(name: string): void {\n if (typeof name !== \"string\" || name.trim().length === 0) {\n throw new ValidationError(\"checkpoint name must be a non-empty string\");\n }\n if (name.length > 128) {\n throw new ValidationError(\"checkpoint name must be <= 128 characters\");\n }\n}\n\nfunction resolveDbPath(connectionString: string): string {\n if (connectionString === \":memory:\") return \":memory:\";\n return path.isAbsolute(connectionString)\n ? connectionString\n : path.resolve(process.cwd(), connectionString);\n}\n\n/**\n * Consistent snapshot using SQLite backup API when available,\n * falling back to WAL checkpoint + file copy.\n */\nasync function safeSqliteBackup(\n sourcePath: string,\n destPath: string,\n): Promise<void> {\n fs.mkdirSync(path.dirname(destPath), { recursive: true });\n if (fs.existsSync(destPath)) {\n fs.rmSync(destPath, { force: true });\n }\n\n let source: DatabaseSync | null = null;\n let dest: DatabaseSync | null = null;\n try {\n source = new DatabaseSync(sourcePath);\n try {\n source.exec(\"PRAGMA wal_checkpoint(TRUNCATE);\");\n } catch {\n // ignore checkpoint failures on read-only / busy DBs\n }\n dest = new DatabaseSync(destPath);\n\n const backupFn = (\n source as unknown as {\n backup?: (target: DatabaseSync) => void | Promise<void>;\n }\n ).backup;\n\n if (typeof backupFn === \"function\") {\n await backupFn.call(source, dest);\n } else {\n // Fallback: close and copy main db (+ wal if present after checkpoint)\n source.close();\n source = null;\n dest.close();\n dest = null;\n fs.copyFileSync(sourcePath, destPath);\n }\n } catch (error) {\n throw new DatabaseError(\n `Failed to execute checkpoint()\\nReason:\\n${error instanceof Error ? error.message : String(error)}\\nSuggestion:\\nEnsure no exclusive lock is held and the destination directory is writable.`,\n { cause: error instanceof Error ? error : undefined },\n );\n } finally {\n try {\n source?.close();\n } catch {\n // ignore\n }\n try {\n dest?.close();\n } catch {\n // ignore\n }\n }\n}\n","/**\n * Wolbarg — modular semantic memory SDK for AI agents (v0.3).\n *\n * @example\n * ```ts\n * import { wolbarg, openaiEmbedding, openaiLlm } from \"wolbarg\";\n *\n * const ctx = wolbarg({\n * organization: \"my-org\",\n * database: { provider: \"sqlite\", url: \"./memory.db\" },\n * embedding: openaiEmbedding({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"text-embedding-3-small\",\n * }),\n * telemetry: {\n * enabled: true,\n * database: { provider: \"sqlite\", url: \"./telemetry.db\" },\n * level: \"debug\",\n * },\n * });\n *\n * await ctx.ready();\n * await ctx.remember({ agent: \"research\", content: { text: \"…\" } });\n * const hits = await ctx.recall({ query: \"…\", topK: 5 });\n * ```\n */\n\nimport path from \"node:path\";\n\nimport {\n createCompressionProvider,\n type CompressionProvider,\n} from \"../compression/index.js\";\nimport {\n createChunkingStrategy,\n inferChunkingStrategy,\n type ChunkingStrategy,\n} from \"../chunking/index.js\";\nimport {\n createEmbeddingProvider,\n embedMany,\n type EmbeddingProvider,\n} from \"../embedding/index.js\";\nimport { createLlmProvider, type LlmProvider } from \"../llm/index.js\";\nimport { loadIngestSource, resolveParser } from \"../ingest/index.js\";\nimport type { KeywordSearchProvider } from \"../keyword/index.js\";\nimport type { OCRProvider } from \"../ocr/index.js\";\nimport type { RerankerProvider } from \"../rerank/index.js\";\nimport type { VisionProvider } from \"../vision/index.js\";\nimport { createStorageProvider } from \"../storage/index.js\";\nimport type { StorageProvider } from \"../storage/types.js\";\nimport type { MemoryRow } from \"../storage/types.js\";\nimport { matchesMetadata } from \"../filters/match.js\";\nimport {\n toHistoryEvent,\n toMemoryRecord,\n toRecallResult,\n} from \"../memory/index.js\";\nimport {\n SqliteMemoryTransferProvider,\n type MemoryExportResult,\n type MemoryImportResult,\n} from \"../memory/transfer.js\";\nimport {\n adaptiveFetchK,\n applyMmr,\n fuseScores,\n resolveHybridWeights,\n resolveMmr,\n} from \"../retrieval/index.js\";\nimport {\n ConfigurationError,\n InitializationError,\n MemoryNotFoundError,\n ProviderNotConfiguredError,\n ValidationError,\n wrapOperationError,\n} from \"../errors/index.js\";\nimport type {\n CheckpointInfo,\n CheckpointOptions,\n ClearOptions,\n CompressOptions,\n CompressResult,\n ExportResult,\n ForgetOptions,\n HistoryOptions,\n HistoryResult,\n ImportResult,\n IngestOptions,\n IngestResult,\n InitOptions,\n MemoryRecord,\n RecallExplainResponse,\n RecallExplanationHit,\n RecallOptions,\n RecallResult,\n RememberOptions,\n RetrievalConfig,\n StatsResult,\n} from \"../types/index.js\";\nimport {\n AsyncMutex,\n assertFiniteNumber,\n assertNonEmptyString,\n createId,\n deserializeMetadata,\n distanceToSimilarity,\n nowIso,\n} from \"../utils/index.js\";\nimport type {\n WolbargOptions,\n WolbargOptionsWithLlm,\n WolbargOptionsWithoutLlm,\n} from \"./options.js\";\nimport {\n isEmbeddingProvider,\n isLlmProvider,\n isStorageProvider,\n isTelemetryProvider,\n resolveDatabaseUrl,\n} from \"./options.js\";\nimport { validateWolbargOptions, validateInitOptions } from \"./validate.js\";\nimport {\n TelemetryEmitter,\n} from \"../telemetry/index.js\";\nimport type { PersistedRecallExplainPayload } from \"../telemetry/index.js\";\nimport type { CheckpointProvider } from \"../providers/interfaces/CheckpointProvider.js\";\nimport { SqliteTelemetryProvider } from \"../providers/sqlite/sqliteTelemetryProvider.js\";\nimport { SqliteCheckpointProvider } from \"../providers/sqlite/sqliteCheckpointProvider.js\";\nimport { SqliteStorageProvider } from \"../storage/providers/sqlite.js\";\n\ntype ReadyState = {\n storage: StorageProvider;\n embedding: EmbeddingProvider;\n organization: string;\n};\n\nexport class Wolbarg<HasLlm extends boolean = false> {\n declare readonly __hasLlm: HasLlm;\n\n private initialized = false;\n private booting: Promise<void> | null = null;\n private organization: string | null = null;\n private storage: StorageProvider | null = null;\n private embedding: EmbeddingProvider | null = null;\n private llm: LlmProvider | null = null;\n private compression: CompressionProvider | null = null;\n private reranker: RerankerProvider | null = null;\n private keywordSearch: KeywordSearchProvider | null = null;\n private ocr: OCRProvider | null = null;\n private vision: VisionProvider | null = null;\n private chunking: ChunkingStrategy | null = null;\n private retrievalConfig: RetrievalConfig = {};\n private embeddingDimensions: number | null = null;\n private readonly writeMutex = new AsyncMutex();\n private telemetry: TelemetryEmitter;\n private checkpointProvider: CheckpointProvider | null = null;\n private memoryDbPath: string | null = null;\n private readonly transfer = new SqliteMemoryTransferProvider();\n\n constructor(options: WolbargOptionsWithLlm);\n constructor(options: WolbargOptionsWithoutLlm);\n constructor();\n constructor(options?: WolbargOptions) {\n this.telemetry = new TelemetryEmitter(null, { enabled: false, level: \"off\" });\n\n if (!options) {\n return;\n }\n\n const validated = validateWolbargOptions(options);\n this.organization = validated.organization;\n const storageInput = validated.storage!;\n this.storage = isStorageProvider(storageInput)\n ? storageInput\n : createStorageProvider(storageInput);\n\n if (!isStorageProvider(storageInput)) {\n this.memoryDbPath = resolveDatabaseUrl(storageInput);\n } else if (storageInput instanceof SqliteStorageProvider) {\n this.memoryDbPath = storageInput.path;\n }\n\n this.embedding = isEmbeddingProvider(validated.embedding)\n ? validated.embedding\n : createEmbeddingProvider(validated.embedding);\n\n if (validated.llm) {\n this.llm = isLlmProvider(validated.llm)\n ? validated.llm\n : createLlmProvider(validated.llm);\n this.compression =\n validated.compression ?? createCompressionProvider(this.llm);\n } else {\n this.compression = validated.compression ?? null;\n }\n\n this.reranker = validated.reranker ?? null;\n this.keywordSearch = validated.keywordSearch ?? null;\n this.ocr = validated.ocr ?? null;\n this.vision = validated.vision ?? null;\n this.chunking = validated.chunking ?? null;\n this.retrievalConfig = validated.retrieval ?? {};\n\n if (validated.telemetry) {\n if (isTelemetryProvider(validated.telemetry)) {\n this.telemetry = new TelemetryEmitter(validated.telemetry, {\n enabled: true,\n }, { organization: validated.organization });\n } else {\n const url =\n validated.telemetry.database.url ??\n validated.telemetry.database.connectionString ??\n \"\";\n const provider = new SqliteTelemetryProvider({ url });\n this.telemetry = new TelemetryEmitter(provider, validated.telemetry, {\n organization: validated.organization,\n });\n }\n }\n\n this.checkpointProvider =\n validated.checkpoint ??\n new SqliteCheckpointProvider({\n directory: validated.checkpointDirectory,\n });\n }\n\n /**\n * Backwards-compatible initialization (v0.1 API).\n */\n async init(options: InitOptions): Promise<void> {\n if (this.initialized || this.storage) {\n throw new InitializationError(\"Wolbarg is already initialized\");\n }\n\n let validated: InitOptions;\n try {\n validated = validateInitOptions(options);\n } catch (error) {\n if (error instanceof ConfigurationError || error instanceof ValidationError) {\n throw error;\n }\n throw new ConfigurationError(\n `Invalid configuration: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n\n this.organization = validated.organization;\n this.storage = createStorageProvider(validated.database);\n this.memoryDbPath = resolveDatabaseUrl(validated.database);\n this.embedding = createEmbeddingProvider(validated.embedding);\n if (validated.llm) {\n this.llm = createLlmProvider(validated.llm);\n this.compression = createCompressionProvider(this.llm);\n }\n if (!this.checkpointProvider) {\n this.checkpointProvider = new SqliteCheckpointProvider();\n }\n\n await this.ready();\n }\n\n /** Ensure storage (and optional telemetry) are open. */\n async ready(): Promise<void> {\n if (this.initialized) {\n return;\n }\n if (this.booting) {\n await this.booting;\n return;\n }\n this.booting = this.boot();\n try {\n await this.booting;\n } finally {\n this.booting = null;\n }\n }\n\n private async boot(): Promise<void> {\n if (!this.storage || !this.embedding || !this.organization) {\n throw new InitializationError(\n \"Wolbarg is not configured. Pass options to the constructor or call init().\",\n );\n }\n\n try {\n await this.storage.open();\n await this.telemetry.open();\n await this.checkpointProvider?.open();\n const probe = await this.embedding.validate();\n await this.storage.ensureVectorSchema(probe.dimensions);\n this.embeddingDimensions = probe.dimensions;\n this.initialized = true;\n this.telemetry.emitStartup(this.storage.name);\n } catch (error) {\n await this.storage.close().catch(() => undefined);\n await this.telemetry.close().catch(() => undefined);\n this.initialized = false;\n if (\n error instanceof ConfigurationError ||\n error instanceof InitializationError ||\n error instanceof ValidationError\n ) {\n throw error;\n }\n throw new InitializationError(\n `Initialization failed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /** Store a semantic memory for an agent. */\n async remember(options: RememberOptions): Promise<MemoryRecord> {\n const trace = this.telemetry.start(\"remember\");\n try {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.agent, \"agent\");\n if (!options.content || typeof options.content.text !== \"string\") {\n throw new ValidationError(\"content.text must be a string\");\n }\n assertNonEmptyString(options.content.text, \"content.text\");\n\n const metadata = options.metadata ?? {};\n if (metadata === null || typeof metadata !== \"object\" || Array.isArray(metadata)) {\n throw new ValidationError(\"metadata must be a plain object when provided\");\n }\n\n const tEmbed = performance.now();\n const vector = await embedding.embed(options.content.text);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n\n const id = createId();\n const timestamp = nowIso();\n\n const record = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const row = await storage.insertMemory({\n id,\n organization,\n agent: options.agent.trim(),\n contentText: options.content.text,\n metadata,\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return toMemoryRecord(row);\n });\n\n trace.success({\n provider: storage.name,\n memoryIds: [record.id],\n returnedCount: 1,\n embeddingProvider: embedding.model,\n model: embedding.model,\n metadata,\n agentId: options.agent.trim(),\n tags: telemetryTags(metadata),\n });\n return record;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"remember\", error);\n }\n }\n\n /** Batch remember — one parent event + child traces per item. */\n async rememberBatch(items: RememberOptions[]): Promise<MemoryRecord[]> {\n const parent = this.telemetry.start(\"rememberBatch\");\n try {\n if (!Array.isArray(items) || items.length === 0) {\n throw new ValidationError(\"rememberBatch requires a non-empty array\");\n }\n const { storage, embedding, organization } = await this.requireReady();\n\n const tEmbed = performance.now();\n const texts = items.map((item, i) => {\n assertNonEmptyString(item.agent, `items[${i}].agent`);\n if (!item.content || typeof item.content.text !== \"string\") {\n throw new ValidationError(`items[${i}].content.text must be a string`);\n }\n assertNonEmptyString(item.content.text, `items[${i}].content.text`);\n return item.content.text;\n });\n const vectors = await embedMany(embedding, texts);\n parent.mark(\"embeddingMs\", performance.now() - tEmbed);\n for (const vector of vectors) {\n this.assertEmbeddingDimensions(vector.length);\n }\n\n const timestamp = nowIso();\n const inputs = items.map((item, i) => ({\n id: createId(),\n organization,\n agent: item.agent.trim(),\n contentText: item.content.text,\n metadata: item.metadata ?? {},\n embedding: vectors[i]!,\n createdAt: timestamp,\n updatedAt: timestamp,\n }));\n\n // Emit child traces for waterfall debugging.\n for (let i = 0; i < inputs.length; i += 1) {\n const child = parent.child(\"remember\");\n child.success({\n provider: storage.name,\n memoryIds: [inputs[i]!.id],\n returnedCount: 1,\n metadata: inputs[i]!.metadata,\n agentId: inputs[i]!.agent,\n tags: telemetryTags(inputs[i]!.metadata),\n });\n }\n\n const rows = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const result = await storage.insertMemoriesBatch(inputs);\n parent.mark(\"databaseWriteMs\", performance.now() - tStore);\n return result;\n });\n\n const records = rows.map(toMemoryRecord);\n parent.success({\n provider: storage.name,\n memoryIds: records.map((r) => r.id),\n returnedCount: records.length,\n embeddingProvider: embedding.model,\n model: embedding.model,\n agentId: commonAgent(items.map((item) => item.agent.trim())),\n });\n return records;\n } catch (error) {\n parent.failure(error);\n throw wrapOperationError(\"rememberBatch\", error);\n }\n }\n\n /**\n * Semantic / hybrid search over stored memories.\n * Pass `{ explain: true }` for enriched ranking diagnostics.\n */\n async recall(options: RecallOptions & { explain: true }): Promise<RecallExplainResponse>;\n async recall(options: RecallOptions & { explain?: false }): Promise<RecallResult[]>;\n async recall(options: RecallOptions): Promise<RecallResult[] | RecallExplainResponse>;\n async recall(options: RecallOptions): Promise<RecallResult[] | RecallExplainResponse> {\n const trace = this.telemetry.start(\"recall\");\n const explain = options.explain === true;\n try {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.query, \"query\");\n\n const topK = options.topK ?? 5;\n const threshold = options.threshold ?? 0;\n assertFiniteNumber(topK, \"topK\", { min: 1, max: 1000 });\n assertFiniteNumber(threshold, \"threshold\", { min: 0, max: 1 });\n\n const query = options.query.trim();\n const tEmbed = performance.now();\n const vector = await embedding.embed(query);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n\n const hasFilters = Boolean(\n options.filter?.agent || options.filter?.metadata,\n );\n const overFetch =\n this.retrievalConfig.overFetchFactor ?? (hasFilters ? 4 : 2);\n const fetchK = adaptiveFetchK(topK, overFetch, hasFilters);\n\n const semanticScores = new Map<string, number>();\n const distances = new Map<string, number>();\n const byId = new Map<string, RecallResult>();\n const metadataMatched = new Map<string, boolean>();\n\n const tSearch = performance.now();\n const joined = storage.searchVectorsWithMemories;\n if (typeof joined === \"function\") {\n const joinedHits = await joined.call(\n storage,\n vector,\n fetchK,\n organization,\n {\n agent: options.filter?.agent,\n includeArchived: options.filter?.includeArchived,\n },\n );\n const tFilter = performance.now();\n for (const { row, distance } of joinedHits) {\n let metaOk = true;\n if (\n options.filter?.metadata &&\n !matchesMetadata(\n deserializeMetadata(row.metadata_json),\n options.filter.metadata,\n )\n ) {\n metaOk = false;\n continue;\n }\n const similarity = distanceToSimilarity(distance);\n if (similarity < threshold) {\n continue;\n }\n const result = toRecallResult(row, similarity);\n semanticScores.set(result.id, similarity);\n distances.set(result.id, distance);\n metadataMatched.set(result.id, metaOk);\n byId.set(result.id, result);\n }\n trace.mark(\"metadataFilteringMs\", performance.now() - tFilter);\n } else {\n const hits = await storage.searchVectors(vector, fetchK);\n const rowids = hits.map((h) => h.memoryRowid);\n let rowMap: Map<number, MemoryRow>;\n if (typeof storage.getMemoriesByRowids === \"function\") {\n rowMap = await storage.getMemoriesByRowids(rowids, organization);\n } else {\n rowMap = new Map();\n const looked = await Promise.all(\n hits.map(async (hit) => ({\n hit,\n row: await storage.getMemoryByRowid(hit.memoryRowid, organization),\n })),\n );\n for (const { hit, row } of looked) {\n if (row) rowMap.set(hit.memoryRowid, row);\n }\n }\n\n const tFilter = performance.now();\n for (const hit of hits) {\n const row = rowMap.get(hit.memoryRowid);\n if (!row) continue;\n if (options.filter?.agent && row.agent !== options.filter.agent) continue;\n if (!options.filter?.includeArchived && row.archived === 1) continue;\n const metadata = deserializeMetadata(row.metadata_json);\n if (\n options.filter?.metadata &&\n !matchesMetadata(metadata, options.filter.metadata)\n ) {\n continue;\n }\n const similarity = distanceToSimilarity(hit.distance);\n if (similarity < threshold) continue;\n const result = toRecallResult(row, similarity);\n semanticScores.set(result.id, similarity);\n distances.set(result.id, hit.distance);\n metadataMatched.set(result.id, true);\n byId.set(result.id, result);\n }\n trace.mark(\"metadataFilteringMs\", performance.now() - tFilter);\n }\n const searchTime = performance.now() - tSearch;\n trace.mark(\"vectorSearchMs\", searchTime);\n trace.mark(\"databaseReadMs\", searchTime);\n\n const hybridWeights =\n resolveHybridWeights(options.hybrid) ??\n (options.hybrid === undefined\n ? resolveHybridWeights(this.retrievalConfig.hybrid)\n : null);\n let keywordSignal: \"enabled\" | \"disabled\" | \"unknown\" = \"disabled\";\n\n if (hybridWeights) {\n let keywordScores = new Map<string, number>();\n\n if (typeof storage.searchKeyword === \"function\") {\n keywordSignal = \"enabled\";\n const ftsHits = await storage.searchKeyword(\n query,\n organization,\n fetchK,\n );\n keywordScores = new Map(ftsHits.map((h) => [h.memoryId, h.score]));\n const missingIds: string[] = [];\n for (const id of keywordScores.keys()) {\n if (!byId.has(id)) missingIds.push(id);\n }\n if (missingIds.length > 0) {\n const fetched = await Promise.all(\n missingIds.map((id) => storage.getMemoryById(id, organization)),\n );\n for (const row of fetched) {\n if (!row) continue;\n if (options.filter?.agent && row.agent !== options.filter.agent) {\n continue;\n }\n if (!options.filter?.includeArchived && row.archived === 1) {\n continue;\n }\n if (\n options.filter?.metadata &&\n !matchesMetadata(\n deserializeMetadata(row.metadata_json),\n options.filter.metadata,\n )\n ) {\n continue;\n }\n byId.set(row.id, toRecallResult(row, 0));\n metadataMatched.set(row.id, true);\n }\n }\n } else if (this.keywordSearch) {\n keywordSignal = \"enabled\";\n const corpus = await storage.listMemories(\n {\n organization,\n agent: options.filter?.agent,\n includeArchived: options.filter?.includeArchived,\n metadata: options.filter?.metadata,\n },\n Math.min(fetchK * 2, 2000),\n );\n const keywordHits = await this.keywordSearch.search(\n query,\n corpus.map((row) => ({ id: row.id, text: row.content_text })),\n fetchK,\n );\n keywordScores = new Map(\n keywordHits.map((h) => [h.memoryId, h.score]),\n );\n for (const row of corpus) {\n if (byId.has(row.id) || !keywordScores.has(row.id)) continue;\n byId.set(row.id, toRecallResult(row, 0));\n metadataMatched.set(row.id, true);\n }\n }\n\n if (keywordScores.size > 0) {\n const fused = fuseScores(semanticScores, keywordScores, hybridWeights);\n for (const [id, score] of fused) {\n const existing = byId.get(id);\n if (existing) {\n byId.set(id, { ...existing, similarity: score });\n }\n }\n }\n }\n\n const tRank = performance.now();\n let results = [...byId.values()].sort(\n (a, b) => b.similarity - a.similarity,\n );\n\n const mmrLambda =\n resolveMmr(options.mmr) ??\n resolveMmr(\n this.retrievalConfig.mmr\n ? { lambda: this.retrievalConfig.mmr.lambda }\n : undefined,\n );\n let rankingReason = \"cosine similarity\";\n if (mmrLambda !== null) {\n results = applyMmr(results, Math.max(topK * 2, topK), mmrLambda);\n rankingReason = `MMR(lambda=${mmrLambda})`;\n }\n\n if (options.rerank && this.reranker) {\n const reranked = await this.reranker.rerank(\n query,\n results.map((r) => ({ id: r.id, text: r.content.text })),\n topK,\n );\n const order = new Map(\n reranked.map((r, i) => [r.id, { score: r.score, i }]),\n );\n results = results\n .filter((r) => order.has(r.id))\n .sort((a, b) => order.get(a.id)!.i - order.get(b.id)!.i)\n .map((r) => ({\n ...r,\n similarity: order.get(r.id)?.score ?? r.similarity,\n }));\n rankingReason = `reranker:${(this.reranker as { name?: string }).name ?? \"custom\"}`;\n }\n\n const rankingTime = performance.now() - tRank;\n trace.mark(\"rankingMs\", rankingTime);\n results = results.slice(0, topK);\n\n const tSer = performance.now();\n // Materialize final payload (serialization stage).\n const serialized = results.map((r) => ({ ...r }));\n trace.mark(\"serializationMs\", performance.now() - tSer);\n\n const telemetryFields = {\n provider: storage.name,\n query,\n filters: options.filter ?? null,\n returnedCount: serialized.length,\n memoryIds: serialized.map((r) => r.id),\n similarityScores: serialized.map((r) => r.similarity),\n embeddingProvider: embedding.model,\n model: embedding.model,\n agentId:\n options.filter?.agent ??\n commonAgent(serialized.map((result) => result.agent)),\n tags: commonTags(serialized.map((result) => result.metadata)),\n };\n\n if (!explain) {\n trace.success(telemetryFields);\n return serialized;\n }\n\n const explanations: RecallExplanationHit[] = serialized.map((memory) => {\n const matchedFields: string[] = [\"content\"];\n if (options.filter?.agent) matchedFields.push(\"agent\");\n if (options.filter?.metadata) matchedFields.push(\"metadata\");\n return {\n memory,\n score: memory.similarity,\n distance: distances.get(memory.id) ?? 1 - memory.similarity,\n rankingReason,\n matchedFields,\n metadataMatch: metadataMatched.get(memory.id) ?? true,\n providerUsed: storage.name,\n searchTime,\n rankingTime,\n };\n });\n\n const totalTime = performance.now() - trace.startedAt;\n const persistedExplain: PersistedRecallExplainPayload = {\n enabled: true,\n providerUsed: storage.name,\n rankingStrategy: rankingReason,\n signals: {\n semantic: \"enabled\",\n keyword: keywordSignal,\n reranker:\n options.rerank === true && this.reranker ? \"enabled\" : \"disabled\",\n mmr: mmrLambda === null ? \"disabled\" : \"enabled\",\n recency: \"disabled\",\n },\n results: explanations.map((hit) => ({\n memoryId: hit.memory.id,\n score: hit.score,\n distance: hit.distance,\n rankingReason: hit.rankingReason,\n matchedFields: hit.matchedFields,\n metadataMatch: hit.metadataMatch,\n })),\n searchTimeMs: searchTime,\n rankingTimeMs: rankingTime,\n totalTimeMs: totalTime,\n };\n trace.success({ ...telemetryFields, explain: persistedExplain });\n\n return {\n results: explanations,\n providerUsed: storage.name,\n searchTime,\n rankingTime,\n totalTime,\n traceId: trace.context.traceId,\n };\n } catch (error) {\n trace.failure(error, {\n query: options.query,\n agentId: options.filter?.agent ?? null,\n });\n throw wrapOperationError(\"recall\", error);\n }\n }\n\n /** Batch recall — parent event + child traces. */\n async recallBatch(\n queries: Array<Omit<RecallOptions, \"explain\">>,\n ): Promise<RecallResult[][]> {\n const parent = this.telemetry.start(\"recallBatch\");\n try {\n if (!Array.isArray(queries) || queries.length === 0) {\n throw new ValidationError(\"recallBatch requires a non-empty array\");\n }\n const out: RecallResult[][] = [];\n for (const q of queries) {\n const child = parent.child(\"recall\");\n try {\n const hits = await this.recall({ ...q, explain: false });\n child.success({\n query: q.query,\n returnedCount: hits.length,\n memoryIds: hits.map((h) => h.id),\n similarityScores: hits.map((h) => h.similarity),\n });\n out.push(hits);\n } catch (error) {\n child.failure(error, { query: q.query });\n throw error;\n }\n }\n parent.success({\n returnedCount: out.reduce((n, r) => n + r.length, 0),\n extra: { queryCount: queries.length },\n });\n return out;\n } catch (error) {\n parent.failure(error);\n throw wrapOperationError(\"recallBatch\", error);\n }\n }\n\n async compress(\n this: Wolbarg<true>,\n options: CompressOptions,\n ): Promise<CompressResult> {\n return this.runCompress(options);\n }\n\n /** @internal */\n private async runCompress(options: CompressOptions): Promise<CompressResult> {\n const trace = this.telemetry.start(\"compress\");\n try {\n const { storage, embedding, organization } = await this.requireReady();\n if (!this.compression) {\n throw new ProviderNotConfiguredError(\n \"llm\",\n \"compress\",\n \"pass llm: openaiLlm(...) (or compression) in the constructor\",\n );\n }\n assertNonEmptyString(options.agent, \"agent\");\n const limit = options.limit ?? 50;\n assertFiniteNumber(limit, \"limit\", { min: 2, max: 500 });\n\n const tRead = performance.now();\n const rows = await storage.listMemories(\n {\n organization,\n agent: options.agent.trim(),\n includeArchived: false,\n },\n limit,\n );\n trace.mark(\"databaseReadMs\", performance.now() - tRead);\n\n if (rows.length < 2) {\n throw new ValidationError(\n \"compress requires at least 2 active memories for the given agent\",\n );\n }\n\n const records = rows.map(toMemoryRecord);\n const summaryText = await this.compression.compress(records);\n const tEmbed = performance.now();\n const vector = await embedding.embed(summaryText);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n\n const summaryId = createId();\n const timestamp = nowIso();\n\n const result = await this.withWriteLock(async () => {\n const tWrite = performance.now();\n const summaryRow = await storage.insertMemory({\n id: summaryId,\n organization,\n agent: options.agent.trim(),\n contentText: summaryText,\n metadata: {\n compressed: true,\n sourceCount: records.length,\n sourceIds: records.map((r) => r.id),\n },\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n });\n\n const archivedIds = await storage.archiveMemories(\n records.map((r) => r.id),\n organization,\n summaryId,\n timestamp,\n );\n trace.mark(\"databaseWriteMs\", performance.now() - tWrite);\n\n return {\n summary: toMemoryRecord(summaryRow),\n archivedIds,\n };\n });\n\n trace.success({\n provider: storage.name,\n memoryIds: [result.summary.id, ...result.archivedIds],\n returnedCount: 1,\n agentId: options.agent.trim(),\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"compress\", error);\n }\n }\n\n async ingest(options: IngestOptions): Promise<IngestResult> {\n const trace = this.telemetry.start(\"ingest\");\n try {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.agent, \"agent\");\n\n const loaded = await loadIngestSource(options.source);\n let usedOcr = false;\n let usedVision = false;\n let text = loaded.rawText ?? \"\";\n\n if (!loaded.rawText) {\n const parser = resolveParser(loaded.filename, loaded.mimeType);\n const parsed = await parser.parse({\n buffer: loaded.buffer,\n filename: loaded.filename,\n mimeType: loaded.mimeType,\n });\n text = parsed.text;\n\n if (parsed.isImage && parsed.imageBuffer) {\n const parts: string[] = [];\n if (this.ocr) {\n const ocrResult = await this.ocr.recognize(\n parsed.imageBuffer,\n parsed.mimeType,\n );\n if (ocrResult.text) {\n parts.push(ocrResult.text);\n usedOcr = true;\n }\n }\n if (this.vision) {\n const visionResult = await this.vision.analyze(\n parsed.imageBuffer,\n parsed.mimeType,\n );\n if (visionResult.caption) {\n parts.push(`Caption: ${visionResult.caption}`);\n }\n if (visionResult.description) {\n parts.push(visionResult.description);\n }\n if (visionResult.entities.length > 0) {\n parts.push(`Entities: ${visionResult.entities.join(\", \")}`);\n }\n if (parts.length > 0) {\n usedVision = true;\n }\n }\n text = parts.join(\"\\n\\n\").trim();\n }\n }\n\n if (!text) {\n throw new ValidationError(\n \"ingest could not extract text from the document (configure ocr/vision for images, or provide text)\",\n );\n }\n\n const strategy =\n this.chunking ??\n (options.chunking?.strategy\n ? createChunkingStrategy(options.chunking.strategy)\n : inferChunkingStrategy(text));\n\n const chunks = strategy.chunk(text, {\n chunkSize: options.chunking?.chunkSize,\n overlap: options.chunking?.overlap,\n });\n\n if (chunks.length === 0) {\n throw new ValidationError(\"ingest produced zero chunks\");\n }\n\n const tEmbed = performance.now();\n const vectors = await embedMany(\n embedding,\n chunks.map((c) => c.text),\n );\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n for (const vector of vectors) {\n this.assertEmbeddingDimensions(vector.length);\n }\n\n const baseMeta = options.metadata ?? {};\n const timestamp = nowIso();\n const inputs = chunks.map((chunk, i) => ({\n id: createId(),\n organization,\n agent: options.agent.trim(),\n contentText: chunk.text,\n metadata: {\n ...baseMeta,\n ingest: true,\n chunkIndex: chunk.index,\n chunkCount: chunks.length,\n sourceFilename: loaded.filename ?? null,\n },\n embedding: vectors[i]!,\n createdAt: timestamp,\n updatedAt: timestamp,\n }));\n\n const rows = await this.withWriteLock(async () => {\n const tWrite = performance.now();\n const result = await storage.insertMemoriesBatch(inputs);\n trace.mark(\"databaseWriteMs\", performance.now() - tWrite);\n return result;\n });\n\n const result = {\n memories: rows.map(toMemoryRecord),\n extractedChars: text.length,\n chunkCount: chunks.length,\n usedOcr,\n usedVision,\n };\n trace.success({\n provider: storage.name,\n memoryIds: result.memories.map((m) => m.id),\n returnedCount: result.memories.length,\n agentId: options.agent.trim(),\n tags: telemetryTags(baseMeta),\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"ingest\", error);\n }\n }\n\n async forget(options: ForgetOptions): Promise<number> {\n const trace = this.telemetry.start(\"forget\");\n try {\n const { storage, organization } = await this.requireReady();\n\n const deleted = await this.withWriteLock(async () => {\n if (\"id\" in options && options.id !== undefined) {\n assertNonEmptyString(options.id, \"id\");\n const ok = await storage.deleteMemoryById(\n options.id.trim(),\n organization,\n );\n return ok ? 1 : 0;\n }\n\n if (\"filter\" in options && options.filter?.agent) {\n assertNonEmptyString(options.filter.agent, \"filter.agent\");\n return storage.deleteMemoriesByFilter({\n organization,\n agent: options.filter.agent.trim(),\n includeArchived: true,\n });\n }\n\n throw new ValidationError(\n \"forget requires either { id } or { filter: { agent } }\",\n );\n });\n\n trace.success({\n provider: storage.name,\n returnedCount: deleted,\n memoryIds:\n \"id\" in options && options.id ? [options.id.trim()] : null,\n filters: \"filter\" in options ? options.filter : null,\n agentId:\n \"filter\" in options ? options.filter?.agent?.trim() ?? null : null,\n });\n return deleted;\n } catch (error) {\n trace.failure(error, {\n agentId: \"filter\" in options ? options.filter?.agent ?? null : null,\n });\n throw wrapOperationError(\"forget\", error);\n }\n }\n\n async history(options: HistoryOptions): Promise<HistoryResult> {\n const trace = this.telemetry.start(\"history\");\n try {\n const { storage, organization } = await this.requireReady();\n assertNonEmptyString(options.id, \"id\");\n\n const row = await storage.getMemoryById(options.id.trim(), organization);\n if (!row) {\n throw new MemoryNotFoundError(`Memory not found: ${options.id}`);\n }\n\n const events = await storage.getHistory(row.id);\n const result = {\n memory: toMemoryRecord(row),\n events: events.map(toHistoryEvent),\n };\n trace.success({\n provider: storage.name,\n memoryIds: [row.id],\n returnedCount: events.length,\n agentId: row.agent,\n tags: telemetryTags(deserializeMetadata(row.metadata_json)),\n });\n return result;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"history\", error);\n }\n }\n\n async stats(): Promise<StatsResult> {\n const trace = this.telemetry.start(\"stats\");\n try {\n const { storage, embedding, organization } = await this.requireReady();\n const counts = await storage.getStats(organization);\n const databaseSizeBytes = await storage.getDatabaseSizeBytes();\n\n const result = {\n totalMemories: counts.totalMemories,\n activeMemories: counts.activeMemories,\n archivedMemories: counts.archivedMemories,\n totalAgents: counts.totalAgents,\n databaseSizeBytes,\n embeddingModel: embedding.model,\n llmModel: this.llm?.model ?? null,\n organization,\n embeddingDimensions: this.embeddingDimensions ?? 0,\n };\n trace.success({\n provider: storage.name,\n returnedCount: result.totalMemories,\n });\n return result;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"stats\", error);\n }\n }\n\n async clear(options: ClearOptions): Promise<number> {\n const trace = this.telemetry.start(\"clear\");\n try {\n const { storage, organization } = await this.requireReady();\n\n if (!options || options.confirm !== true) {\n throw new ValidationError(\n \"clear requires { confirm: true } to permanently delete all memories\",\n );\n }\n\n const deleted = await this.withWriteLock(async () => {\n return storage.clearOrganization(organization);\n });\n trace.success({ provider: storage.name, returnedCount: deleted });\n return deleted;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"clear\", error);\n }\n }\n\n /** Create an immutable named checkpoint of the memory database. */\n async checkpoint(\n name: string,\n options?: CheckpointOptions,\n ): Promise<CheckpointInfo> {\n const trace = this.telemetry.start(\"checkpoint\");\n try {\n await this.requireReady();\n const provider = this.requireCheckpointProvider();\n const source = this.requireMemoryDbPath();\n const tCheckpoint = performance.now();\n const meta = await provider.checkpoint(name, source, options);\n trace.mark(\"databaseWriteMs\", performance.now() - tCheckpoint);\n trace.success({\n provider: provider.name,\n checkpointId: meta.name,\n extra: { checkpoint: meta.name },\n });\n return meta;\n } catch (error) {\n trace.failure(error, { checkpointId: name });\n throw wrapOperationError(\"checkpoint\", error);\n }\n }\n\n /** Restore the memory database from a named checkpoint. */\n async rollback(name: string): Promise<CheckpointInfo> {\n const trace = this.telemetry.start(\"rollback\");\n let storageClosed = false;\n try {\n await this.requireReady();\n const provider = this.requireCheckpointProvider();\n const target = this.requireMemoryDbPath();\n\n // Validate before closing — a missing checkpoint must not leave storage shut.\n const existing = await provider.getCheckpoint(name);\n if (!existing) {\n throw new ValidationError(`Checkpoint \"${name}\" was not found`);\n }\n\n // Close storage before replacing the file.\n if (this.storage) {\n await this.storage.close();\n storageClosed = true;\n }\n const tRollback = performance.now();\n const meta = await provider.rollback(name, target);\n trace.mark(\"databaseWriteMs\", performance.now() - tRollback);\n await this.storage?.open();\n storageClosed = false;\n if (this.embeddingDimensions !== null) {\n await this.storage?.ensureVectorSchema(this.embeddingDimensions);\n }\n\n trace.success({\n provider: provider.name,\n checkpointId: meta.name,\n extra: { checkpoint: meta.name },\n });\n return meta;\n } catch (error) {\n if (storageClosed && this.storage) {\n await this.storage.open().catch(() => undefined);\n if (this.embeddingDimensions !== null) {\n await this.storage\n .ensureVectorSchema(this.embeddingDimensions)\n .catch(() => undefined);\n }\n }\n trace.failure(error, { checkpointId: name });\n throw wrapOperationError(\"rollback\", error);\n }\n }\n\n async deleteCheckpoint(name: string): Promise<boolean> {\n const trace = this.telemetry.start(\"deleteCheckpoint\");\n try {\n await this.requireReady();\n const provider = this.requireCheckpointProvider();\n const tDelete = performance.now();\n const removed = await provider.deleteCheckpoint(name);\n trace.mark(\"databaseWriteMs\", performance.now() - tDelete);\n trace.success({\n provider: provider.name,\n checkpointId: name,\n returnedCount: removed ? 1 : 0,\n });\n return removed;\n } catch (error) {\n trace.failure(error, { checkpointId: name });\n throw wrapOperationError(\"deleteCheckpoint\", error);\n }\n }\n\n async listCheckpoints(): Promise<CheckpointInfo[]> {\n const trace = this.telemetry.start(\"listCheckpoints\");\n try {\n await this.requireReady();\n const provider = this.requireCheckpointProvider();\n const tList = performance.now();\n const list = await provider.listCheckpoints();\n trace.mark(\"databaseReadMs\", performance.now() - tList);\n trace.success({\n provider: provider.name,\n returnedCount: list.length,\n });\n return list;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"listCheckpoints\", error);\n }\n }\n\n async getCheckpoint(name: string): Promise<CheckpointInfo | null> {\n const trace = this.telemetry.start(\"getCheckpoint\");\n try {\n await this.requireReady();\n const provider = this.requireCheckpointProvider();\n const tGet = performance.now();\n const meta = await provider.getCheckpoint(name);\n trace.mark(\"databaseReadMs\", performance.now() - tGet);\n trace.success({\n provider: provider.name,\n checkpointId: name,\n returnedCount: meta ? 1 : 0,\n });\n return meta;\n } catch (error) {\n trace.failure(error, { checkpointId: name });\n throw wrapOperationError(\"getCheckpoint\", error);\n }\n }\n\n /** Export the memory database to a portable SQLite + manifest bundle. */\n async export(exportPath: string): Promise<ExportResult> {\n const trace = this.telemetry.start(\"export\");\n try {\n await this.requireReady();\n const source = this.requireMemoryDbPath();\n // Checkpoint WAL so export sees a consistent file.\n if (this.storage?.name === \"sqlite\") {\n // best-effort consistency via transfer helper\n }\n const result: MemoryExportResult = await this.transfer.exportTo(\n exportPath,\n source,\n this.organization ?? undefined,\n );\n trace.success({\n provider: \"sqlite\",\n extra: { path: result.path, sizeBytes: result.sizeBytes },\n });\n return {\n path: result.path,\n sizeBytes: result.sizeBytes,\n exportedAt: result.manifest.exportedAt,\n };\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"export\", error);\n }\n }\n\n /** Import a previously exported memory database, replacing the current file. */\n async import(exportPath: string): Promise<ImportResult> {\n const trace = this.telemetry.start(\"import\");\n let storageClosed = false;\n try {\n await this.requireReady();\n const target = this.requireMemoryDbPath();\n if (this.storage) {\n await this.storage.close();\n storageClosed = true;\n }\n const result: MemoryImportResult = await this.transfer.importFrom(\n exportPath,\n target,\n );\n await this.storage?.open();\n storageClosed = false;\n if (this.embeddingDimensions !== null) {\n await this.storage?.ensureVectorSchema(this.embeddingDimensions);\n }\n trace.success({\n provider: \"sqlite\",\n extra: { path: result.path },\n });\n return {\n path: result.path,\n importedAt: nowIso(),\n };\n } catch (error) {\n if (storageClosed && this.storage) {\n await this.storage.open().catch(() => undefined);\n if (this.embeddingDimensions !== null) {\n await this.storage\n .ensureVectorSchema(this.embeddingDimensions)\n .catch(() => undefined);\n }\n }\n trace.failure(error);\n throw wrapOperationError(\"import\", error);\n }\n }\n\n /** Flush pending telemetry (useful in tests). */\n async flushTelemetry(): Promise<void> {\n await this.telemetry.flush();\n }\n\n /** Session id for this SDK instance (telemetry traces). */\n get sessionId(): string {\n return this.telemetry.sessionId;\n }\n\n private withWriteLock<T>(fn: () => Promise<T>): Promise<T> {\n if (this.storage?.name === \"sqlite\") {\n return this.writeMutex.runExclusive(fn);\n }\n return fn();\n }\n\n async close(): Promise<void> {\n if (this.storage) {\n this.telemetry.emitShutdown(this.storage.name);\n }\n await this.telemetry.close().catch(() => undefined);\n await this.checkpointProvider?.close().catch(() => undefined);\n if (this.storage) {\n await this.storage.close();\n }\n this.storage = null;\n this.embedding = null;\n this.llm = null;\n this.compression = null;\n this.organization = null;\n this.embeddingDimensions = null;\n this.initialized = false;\n }\n\n get isInitialized(): boolean {\n return this.initialized;\n }\n\n private async requireReady(): Promise<ReadyState> {\n await this.ready();\n if (\n !this.initialized ||\n !this.storage ||\n !this.embedding ||\n !this.organization\n ) {\n throw new InitializationError(\n \"Wolbarg is not initialized. Pass options to the constructor or call init().\",\n );\n }\n return {\n storage: this.storage,\n embedding: this.embedding,\n organization: this.organization,\n };\n }\n\n private assertEmbeddingDimensions(dimensions: number): void {\n if (\n this.embeddingDimensions !== null &&\n dimensions !== this.embeddingDimensions\n ) {\n throw new ValidationError(\n `Embedding dimension mismatch: expected ${this.embeddingDimensions}, got ${dimensions}`,\n );\n }\n }\n\n private requireCheckpointProvider(): CheckpointProvider {\n if (!this.checkpointProvider) {\n throw new ProviderNotConfiguredError(\n \"checkpoint\",\n \"checkpoint\",\n \"construct Wolbarg with a file-backed database\",\n );\n }\n return this.checkpointProvider;\n }\n\n private requireMemoryDbPath(): string {\n if (!this.memoryDbPath || this.memoryDbPath === \":memory:\") {\n throw new ConfigurationError(\n \"This operation requires a file-backed SQLite memory database (not :memory:).\",\n {\n suggestion:\n 'Use database: { provider: \"sqlite\", url: \"./memory.db\" }',\n },\n );\n }\n return path.isAbsolute(this.memoryDbPath)\n ? this.memoryDbPath\n : path.resolve(process.cwd(), this.memoryDbPath);\n }\n}\n\n/** Preferred v0.3 entry — re-exported from factories as well. */\nexport function wolbarg(options: WolbargOptions): Wolbarg {\n return new Wolbarg(options as never);\n}\n\nfunction telemetryTags(metadata: Record<string, unknown>): string[] | null {\n const value = metadata.tags;\n if (typeof value === \"string\") {\n const tag = value.trim();\n return tag ? [tag] : null;\n }\n if (Array.isArray(value)) {\n const tags = value.filter(\n (tag): tag is string => typeof tag === \"string\" && tag.trim().length > 0,\n );\n return tags.length > 0 ? tags.map((tag) => tag.trim()) : null;\n }\n return null;\n}\n\nfunction commonAgent(agents: string[]): string | null {\n const first = agents[0];\n return first && agents.every((agent) => agent === first) ? first : null;\n}\n\nfunction commonTags(metadata: Array<Record<string, unknown>>): string[] | null {\n const tags = new Set<string>();\n for (const item of metadata) {\n for (const tag of telemetryTags(item) ?? []) tags.add(tag);\n }\n return tags.size > 0 ? [...tags] : null;\n}\n","/**\n * Metadata filter AST for advanced recall filtering.\n */\n\n/** Comparison operators on a single metadata field. */\nexport type MetadataComparison =\n | { eq: unknown }\n | { contains: string }\n | { gt: number | string }\n | { gte: number | string }\n | { lt: number | string }\n | { lte: number | string }\n | { between: [number | string, number | string] };\n\n/** Recursive metadata filter supporting boolean combinators. */\nexport type MetadataFilter =\n | { field: string; op: MetadataComparison }\n | { and: MetadataFilter[] }\n | { or: MetadataFilter[] }\n | { not: MetadataFilter };\n\n/** Helpers for building filters fluently. */\nexport const meta = {\n eq: (field: string, value: unknown): MetadataFilter => ({\n field,\n op: { eq: value },\n }),\n contains: (field: string, value: string): MetadataFilter => ({\n field,\n op: { contains: value },\n }),\n gt: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { gt: value },\n }),\n gte: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { gte: value },\n }),\n lt: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { lt: value },\n }),\n lte: (field: string, value: number | string): MetadataFilter => ({\n field,\n op: { lte: value },\n }),\n between: (\n field: string,\n lo: number | string,\n hi: number | string,\n ): MetadataFilter => ({\n field,\n op: { between: [lo, hi] },\n }),\n and: (...filters: MetadataFilter[]): MetadataFilter => ({ and: filters }),\n or: (...filters: MetadataFilter[]): MetadataFilter => ({ or: filters }),\n not: (filter: MetadataFilter): MetadataFilter => ({ not: filter }),\n};\n","/**\n * Public factory helpers for storage / providers.\n */\n\nimport type {\n PostgresDatabaseConfig,\n SqliteDatabaseConfig,\n TelemetryConfig,\n} from \"../types/index.js\";\nimport { SqliteStorageProvider } from \"../storage/providers/sqlite.js\";\nimport { PostgresStorageProvider } from \"../storage/providers/postgres.js\";\nimport type { StorageProvider } from \"../storage/types.js\";\nimport { SqliteTelemetryProvider } from \"../providers/sqlite/sqliteTelemetryProvider.js\";\nimport { SqliteCheckpointProvider } from \"../providers/sqlite/sqliteCheckpointProvider.js\";\nimport type { TelemetryProvider } from \"../providers/interfaces/TelemetryProvider.js\";\nimport type { CheckpointProvider } from \"../providers/interfaces/CheckpointProvider.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport type { WolbargOptions } from \"../core/options.js\";\nimport { Wolbarg } from \"../core/wolbarg.js\";\n\n/** Create a SQLite storage provider from a path or `:memory:`. */\nexport function sqlite(connectionString: string): StorageProvider {\n return new SqliteStorageProvider({ connectionString });\n}\n\n/** Create a SQLite storage config object (for init / options). */\nexport function sqliteConfig(\n connectionString: string,\n): SqliteDatabaseConfig {\n return {\n provider: \"sqlite\",\n connectionString,\n url: connectionString,\n };\n}\n\n/** Create a PostgreSQL storage provider. Requires optional peer dependency `pg`. */\nexport function postgres(\n options: string | { connectionString: string; maxPoolSize?: number },\n): StorageProvider {\n const opts =\n typeof options === \"string\"\n ? { connectionString: options }\n : options;\n return new PostgresStorageProvider(opts);\n}\n\n/** Create a PostgreSQL storage config object. */\nexport function postgresConfig(\n connectionString: string,\n options?: { maxPoolSize?: number },\n): PostgresDatabaseConfig {\n return {\n provider: \"postgres\",\n connectionString,\n url: connectionString,\n ...options,\n };\n}\n\n/** Create a SQLite telemetry provider for an independent event database. */\nexport function sqliteTelemetry(url: string): TelemetryProvider {\n return new SqliteTelemetryProvider({ url });\n}\n\n/** Create a SQLite checkpoint provider. */\nexport function sqliteCheckpoint(directory?: string): CheckpointProvider {\n return new SqliteCheckpointProvider({ directory });\n}\n\n/** Create a telemetry provider from config (SQLite only in v0.3). */\nexport function createTelemetryProvider(\n config: TelemetryConfig,\n): TelemetryProvider {\n if (config.database.provider !== \"sqlite\") {\n throw new ConfigurationError(\n `Unsupported telemetry provider \"${config.database.provider}\". Only \"sqlite\" is implemented in v0.3.0.`,\n );\n }\n const url =\n config.database.url ?? config.database.connectionString ?? \"\";\n if (!url) {\n throw new ConfigurationError(\"telemetry.database.url is required\");\n }\n return new SqliteTelemetryProvider({ url });\n}\n\n/**\n * Preferred v0.3 factory. Equivalent to `new Wolbarg(options)`.\n */\nexport function wolbarg(options: WolbargOptions): Wolbarg {\n return new Wolbarg(options as never);\n}\n","/**\n * Keyword / BM25 search providers.\n */\n\nexport interface KeywordSearchHit {\n memoryId: string;\n score: number;\n}\n\nexport interface KeywordDocument {\n id: string;\n text: string;\n}\n\n/** Contract for keyword / lexical search. */\nexport interface KeywordSearchProvider {\n readonly name: string;\n search(\n query: string,\n documents: KeywordDocument[],\n topK: number,\n ): Promise<KeywordSearchHit[]>;\n}\n\n/** Simple in-memory BM25 (Okapi). */\nexport class Bm25KeywordSearchProvider implements KeywordSearchProvider {\n readonly name = \"bm25\";\n private readonly k1: number;\n private readonly b: number;\n\n constructor(options?: { k1?: number; b?: number }) {\n this.k1 = options?.k1 ?? 1.2;\n this.b = options?.b ?? 0.75;\n }\n\n async search(\n query: string,\n documents: KeywordDocument[],\n topK: number,\n ): Promise<KeywordSearchHit[]> {\n if (documents.length === 0 || topK <= 0) {\n return [];\n }\n\n const docs = documents.map((doc) => ({\n id: doc.id,\n tokens: tokenize(doc.text),\n }));\n const queryTokens = tokenize(query);\n if (queryTokens.length === 0) {\n return [];\n }\n\n const N = docs.length;\n const avgdl =\n docs.reduce((sum, d) => sum + d.tokens.length, 0) / Math.max(N, 1);\n\n const df = new Map<string, number>();\n for (const term of new Set(queryTokens)) {\n let count = 0;\n for (const doc of docs) {\n if (doc.tokens.includes(term)) {\n count += 1;\n }\n }\n df.set(term, count);\n }\n\n const scored = docs.map((doc) => {\n const tfMap = new Map<string, number>();\n for (const token of doc.tokens) {\n tfMap.set(token, (tfMap.get(token) ?? 0) + 1);\n }\n let score = 0;\n for (const term of queryTokens) {\n const tf = tfMap.get(term) ?? 0;\n if (tf === 0) {\n continue;\n }\n const n = df.get(term) ?? 0;\n const idf = Math.log(1 + (N - n + 0.5) / (n + 0.5));\n const denom =\n tf + this.k1 * (1 - this.b + this.b * (doc.tokens.length / avgdl));\n score += idf * ((tf * (this.k1 + 1)) / denom);\n }\n return { memoryId: doc.id, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.filter((s) => s.score > 0).slice(0, topK);\n }\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length > 1);\n}\n\n/** Factory for in-memory BM25 keyword search. */\nexport function bm25(options?: { k1?: number; b?: number }): KeywordSearchProvider {\n return new Bm25KeywordSearchProvider(options);\n}\n","/**\n * Reranker provider abstractions.\n */\n\nexport interface RerankDocument {\n id: string;\n text: string;\n}\n\nexport interface RerankHit {\n id: string;\n score: number;\n}\n\n/** Contract for cross-encoder / API rerankers. */\nexport interface RerankerProvider {\n readonly name: string;\n rerank(\n query: string,\n documents: RerankDocument[],\n topK: number,\n ): Promise<RerankHit[]>;\n}\n\ninterface HttpRerankerOptions {\n name: string;\n url: string;\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n /** Build request body for the provider. */\n buildBody: (\n query: string,\n documents: RerankDocument[],\n topK: number,\n model?: string,\n ) => unknown;\n /** Parse ranked results from JSON response. */\n parseResults: (body: unknown, documents: RerankDocument[]) => RerankHit[];\n}\n\nclass HttpRerankerProvider implements RerankerProvider {\n readonly name: string;\n private readonly options: HttpRerankerOptions;\n\n constructor(options: HttpRerankerOptions) {\n this.name = options.name;\n this.options = options;\n }\n\n async rerank(\n query: string,\n documents: RerankDocument[],\n topK: number,\n ): Promise<RerankHit[]> {\n if (documents.length === 0) {\n return [];\n }\n const controller = new AbortController();\n const timeoutMs = this.options.timeoutMs ?? 30_000;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(this.options.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.options.apiKey}`,\n },\n body: JSON.stringify(\n this.options.buildBody(\n query,\n documents,\n topK,\n this.options.model,\n ),\n ),\n signal: controller.signal,\n });\n const body: unknown = await res.json().catch(() => ({}));\n if (!res.ok) {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n }\n const parsed = this.options.parseResults(body, documents);\n return parsed.slice(0, topK);\n } catch {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n/** Lightweight local cross-encoder proxy (OpenAI-compatible score endpoint fallback = identity order). */\nexport function crossEncoder(options: {\n baseUrl: string;\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n const base = options.baseUrl.replace(/\\/+$/, \"\");\n return new HttpRerankerProvider({\n name: \"cross-encoder\",\n url: `${base}/rerank`,\n apiKey: options.apiKey,\n model: options.model,\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\nexport function jinaReranker(options: {\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n return new HttpRerankerProvider({\n name: \"jina\",\n url: \"https://api.jina.ai/v1/rerank\",\n apiKey: options.apiKey,\n model: options.model ?? \"jina-reranker-v2-base-multilingual\",\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\nexport function cohereReranker(options: {\n apiKey: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n return new HttpRerankerProvider({\n name: \"cohere\",\n url: \"https://api.cohere.com/v2/rerank\",\n apiKey: options.apiKey,\n model: options.model ?? \"rerank-v3.5\",\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\n/** Alias for BGE-style remote rerank endpoints that speak the Jina/Cohere shape. */\nexport function bgeReranker(options: {\n apiKey: string;\n baseUrl: string;\n model?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n const base = options.baseUrl.replace(/\\/+$/, \"\");\n return new HttpRerankerProvider({\n name: \"bge\",\n url: `${base}/rerank`,\n apiKey: options.apiKey,\n model: options.model,\n timeoutMs: options.timeoutMs,\n buildBody: (query, documents, topK, model) => ({\n model,\n query,\n documents: documents.map((d) => d.text),\n top_n: topK,\n }),\n parseResults: (body, documents) => {\n const results =\n (body as { results?: Array<{ index: number; relevance_score: number }> })\n .results ?? [];\n return results.map((r) => ({\n id: documents[r.index]?.id ?? String(r.index),\n score: r.relevance_score,\n }));\n },\n });\n}\n\n/**\n * OpenAI chat-based reranker (no Cohere/Jina key required).\n * Scores query–document relevance via chat completions and reorders hits.\n */\nexport function openaiReranker(options: {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n}): RerankerProvider {\n const base = (options.baseUrl ?? \"https://api.openai.com/v1\").replace(\n /\\/+$/,\n \"\",\n );\n const model = options.model ?? \"gpt-4.1-mini\";\n const timeoutMs = options.timeoutMs ?? 60_000;\n\n return {\n name: \"openai\",\n async rerank(query, documents, topK) {\n if (documents.length === 0) {\n return [];\n }\n const listed = documents\n .map((d, i) => `[${i}] ${d.text.slice(0, 800)}`)\n .join(\"\\n\\n\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(`${base}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n response_format: { type: \"json_object\" },\n messages: [\n {\n role: \"system\",\n content:\n 'You rerank documents for a retrieval system. Reply ONLY with JSON: {\"results\":[{\"index\":0,\"score\":0.0}]} where score is 0-1 relevance.',\n },\n {\n role: \"user\",\n content: `Query: ${query}\\n\\nDocuments:\\n${listed}\\n\\nReturn the top ${topK} indices sorted by score descending.`,\n },\n ],\n }),\n signal: controller.signal,\n });\n const body = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n const content = body.choices?.[0]?.message?.content ?? \"{}\";\n let parsed: { results?: Array<{ index: number; score: number }> };\n try {\n parsed = JSON.parse(content) as typeof parsed;\n } catch {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n }\n const results = parsed.results ?? [];\n if (results.length === 0) {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n }\n return results\n .filter((r) => documents[r.index])\n .slice(0, topK)\n .map((r) => ({\n id: documents[r.index]!.id,\n score: Number(r.score) || 0,\n }));\n } catch {\n return documents.slice(0, topK).map((d, i) => ({\n id: d.id,\n score: 1 - i / Math.max(documents.length, 1),\n }));\n } finally {\n clearTimeout(timer);\n }\n },\n };\n}\n\n","/**\n * Optional OCR provider — extract text from images.\n */\n\nexport interface OcrResult {\n text: string;\n}\n\nexport interface OCRProvider {\n readonly name: string;\n recognize(image: Buffer, mimeType?: string): Promise<OcrResult>;\n}\n\n/**\n * Placeholder Tesseract adapter.\n * Requires optional peer packages (`tesseract.js`) when used.\n */\nexport function tesseract(): OCRProvider {\n return {\n name: \"tesseract\",\n async recognize(image: Buffer): Promise<OcrResult> {\n try {\n const mod = await import(\"tesseract.js\" as string);\n const createWorker =\n (mod as { createWorker?: (lang: string) => Promise<{\n recognize: (img: Buffer) => Promise<{ data: { text: string } }>;\n terminate: () => Promise<void>;\n }> }).createWorker ??\n (mod as { default?: { createWorker: (lang: string) => Promise<{\n recognize: (img: Buffer) => Promise<{ data: { text: string } }>;\n terminate: () => Promise<void>;\n }> } }).default?.createWorker;\n if (!createWorker) {\n return { text: \"\" };\n }\n const worker = await createWorker(\"eng\");\n try {\n const result = await worker.recognize(image);\n return { text: result.data.text.trim() };\n } finally {\n await worker.terminate();\n }\n } catch {\n return { text: \"\" };\n }\n },\n };\n}\n","/**\n * Optional vision provider — captions / descriptions / entities from images.\n */\n\nexport interface VisionResult {\n caption: string;\n description: string;\n entities: string[];\n}\n\nexport interface VisionProvider {\n readonly name: string;\n analyze(image: Buffer, mimeType?: string): Promise<VisionResult>;\n}\n\ninterface VisionHttpOptions {\n name: string;\n baseUrl: string;\n apiKey: string;\n model: string;\n timeoutMs?: number;\n}\n\nclass OpenAICompatibleVisionProvider implements VisionProvider {\n readonly name: string;\n private readonly options: VisionHttpOptions;\n\n constructor(options: VisionHttpOptions) {\n this.name = options.name;\n this.options = options;\n }\n\n async analyze(image: Buffer, mimeType = \"image/png\"): Promise<VisionResult> {\n const base = this.options.baseUrl.replace(/\\/+$/, \"\");\n const url = `${base}/chat/completions`;\n const dataUrl = `data:${mimeType};base64,${image.toString(\"base64\")}`;\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n this.options.timeoutMs ?? 60_000,\n );\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.options.apiKey}`,\n },\n body: JSON.stringify({\n model: this.options.model,\n messages: [\n {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: 'Describe this image. Reply as JSON: {\"caption\":\"...\",\"description\":\"...\",\"entities\":[\"...\"]}',\n },\n { type: \"image_url\", image_url: { url: dataUrl } },\n ],\n },\n ],\n max_tokens: 512,\n }),\n signal: controller.signal,\n });\n const body = (await res.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n };\n const content = body.choices?.[0]?.message?.content ?? \"\";\n return parseVisionJson(content);\n } catch {\n return { caption: \"\", description: \"\", entities: [] };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\nfunction parseVisionJson(content: string): VisionResult {\n try {\n const match = content.match(/\\{[\\s\\S]*\\}/);\n if (!match) {\n return { caption: content.trim(), description: content.trim(), entities: [] };\n }\n const parsed = JSON.parse(match[0]) as Partial<VisionResult>;\n return {\n caption: String(parsed.caption ?? \"\"),\n description: String(parsed.description ?? \"\"),\n entities: Array.isArray(parsed.entities)\n ? parsed.entities.map(String)\n : [],\n };\n } catch {\n return { caption: content.trim(), description: content.trim(), entities: [] };\n }\n}\n\nexport function geminiVision(options: {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n}): VisionProvider {\n return new OpenAICompatibleVisionProvider({\n name: \"gemini\",\n baseUrl:\n options.baseUrl ??\n \"https://generativelanguage.googleapis.com/v1beta/openai\",\n apiKey: options.apiKey,\n model: options.model ?? \"gemini-2.0-flash\",\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport function openaiVision(options: {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n timeoutMs?: number;\n}): VisionProvider {\n return new OpenAICompatibleVisionProvider({\n name: \"openai-vision\",\n baseUrl: options.baseUrl ?? \"https://api.openai.com/v1\",\n apiKey: options.apiKey,\n model: options.model ?? \"gpt-4o-mini\",\n timeoutMs: options.timeoutMs,\n });\n}\n","/**\n * Internal benchmark helpers for CLI / Studio later.\n * @internal\n */\n\nexport interface BenchmarkSample {\n name: string;\n durationMs: number;\n ok: boolean;\n error?: string;\n}\n\nexport interface BenchmarkReport {\n startedAt: string;\n finishedAt: string;\n samples: BenchmarkSample[];\n summary: {\n count: number;\n ok: number;\n failed: number;\n avgMs: number;\n p50Ms: number;\n p95Ms: number;\n p99Ms: number;\n };\n}\n\nexport async function runBenchmark(\n name: string,\n iterations: number,\n fn: () => Promise<void> | void,\n): Promise<BenchmarkSample[]> {\n const samples: BenchmarkSample[] = [];\n for (let i = 0; i < iterations; i += 1) {\n const t0 = performance.now();\n try {\n await fn();\n samples.push({\n name,\n durationMs: performance.now() - t0,\n ok: true,\n });\n } catch (error) {\n samples.push({\n name,\n durationMs: performance.now() - t0,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return samples;\n}\n\nexport function summarizeBenchmark(\n samples: BenchmarkSample[],\n startedAt: string,\n finishedAt: string,\n): BenchmarkReport {\n const durations = samples\n .filter((s) => s.ok)\n .map((s) => s.durationMs)\n .sort((a, b) => a - b);\n const avg =\n durations.length === 0\n ? 0\n : durations.reduce((a, b) => a + b, 0) / durations.length;\n\n return {\n startedAt,\n finishedAt,\n samples,\n summary: {\n count: samples.length,\n ok: samples.filter((s) => s.ok).length,\n failed: samples.filter((s) => !s.ok).length,\n avgMs: avg,\n p50Ms: percentile(durations, 0.5),\n p95Ms: percentile(durations, 0.95),\n p99Ms: percentile(durations, 0.99),\n },\n };\n}\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(\n sorted.length - 1,\n Math.max(0, Math.ceil(p * sorted.length) - 1),\n );\n return sorted[idx]!;\n}\n"]}
|