wolbarg 0.5.5 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.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/embedding/cache.ts","../src/utils/vector.ts","../src/embedding/cache-store.ts","../src/llm/index.ts","../src/ingest/index.ts","../src/core/options.ts","../src/filters/match.ts","../src/filters/sql-compile.ts","../src/telemetry/logger.ts","../src/schema/index.ts","../src/sql/index.ts","../src/utils/vector-index.ts","../src/storage/sqlite/concurrency-config.ts","../src/storage/sqlite/transaction.ts","../src/memory/dedupe.ts","../src/storage/providers/sqlite.ts","../src/filters/sql-compile-postgres.ts","../src/subscribe/postgres-listener.ts","../src/storage/providers/postgres.ts","../src/storage/index.ts","../src/version.ts","../src/memory/transfer.ts","../src/memory/from-messages.ts","../src/memory/index.ts","../src/retrieval/index.ts","../src/graph/memory-node.ts","../src/graph/sync/cascade.ts","../src/graph/providers/sqlite-graph.ts","../src/graph/providers/neo4j.ts","../src/core/validate.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/subscribe/sqlite-emitter.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","createHash","fs","clauses","FIELD_RE","compileComparison","warnLogger","warnedFtsKeywordSearch","out","offset","params","idx","sql","result","vec","tsvProbe","DatabaseSync","serializeMetadata","deserializeMetadata","nowIso","assertFiniteNumber","describe","matchesFilter","sqlite","id","hits","best","wolbarg"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Operation-scoped errors with stable `code`, human `reason`, and actionable `suggestion`.\n *\n * All Wolbarg errors extend {@link WolbargError} so callers can use `instanceof`\n * checks and read structured fields in IDE hover docs.\n */\n\n/**\n * Base class for all Wolbarg SDK errors.\n *\n * @property code - Stable machine-readable error code (e.g. `\"VALIDATION_ERROR\"`).\n * @property reason - Short explanation of why the operation failed.\n * @property suggestion - Actionable fix hint for developers.\n * @property operation - Facade method name when applicable (e.g. `\"recall\"`).\n */\nexport class WolbargError extends Error {\n readonly code: string;\n readonly reason?: string;\n readonly suggestion?: string;\n readonly operation?: string;\n\n /**\n * @param message - Human-readable error message.\n * @param code - Stable error code string.\n * @param options - Optional cause, reason, suggestion, and operation name.\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 or `open()` fails. */\nexport class InitializationError extends WolbargError {\n /**\n * @param message - Description of the initialization failure.\n * @param options - Optional cause and structured hints.\n */\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/**\n * Thrown when configuration values are missing, invalid, or incompatible.\n * Also used for missing optional peer packages (PDF, OCR, Neo4j, etc.).\n */\nexport class ConfigurationError extends WolbargError {\n /**\n * @param message - Description of the misconfiguration.\n * @param options - Optional cause, reason, suggestion, and operation name.\n */\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 before reaching storage. */\nexport class ValidationError extends WolbargError {\n /**\n * @param message - Which argument failed and why.\n * @param options - Optional cause and structured hints.\n */\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 low-level database read/write fails. */\nexport class DatabaseError extends WolbargError {\n /**\n * @param message - Operation-scoped failure message.\n * @param options - Optional underlying `cause` and hints.\n */\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/**\n * Thrown when SQLite write-lock retries are exhausted.\n * Stable code: `WOLBARG_STORAGE_LOCKED`.\n */\nexport class StorageLockedError extends WolbargError {\n /**\n * @param message - Lock contention description.\n * @param options - Typically includes suggestion to tune concurrency or use Postgres.\n */\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"WOLBARG_STORAGE_LOCKED\", options);\n this.name = \"StorageLockedError\";\n }\n}\n\n/** Thrown when an embedding API request fails or returns invalid vectors. */\nexport class EmbeddingError extends WolbargError {\n /**\n * @param message - Embedding failure description.\n * @param options - Optional HTTP cause and provider hints.\n */\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 LLM-based memory compression (summarization) fails. */\nexport class CompressionError extends WolbargError {\n /**\n * @param message - Compression failure description.\n * @param options - Optional LLM cause chain.\n */\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 id does not exist or is archived. */\nexport class MemoryNotFoundError extends WolbargError {\n /**\n * @param message - Which memory was not found.\n * @param options - Optional operation context.\n */\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 * (reranker, OCR, graph, LLM for extract mode, etc.).\n */\nexport class ProviderNotConfiguredError extends ConfigurationError {\n readonly provider: string;\n\n /**\n * @param provider - Provider name (e.g. `\"reranker\"`, `\"graph\"`).\n * @param method - Facade method that requires the provider.\n * @param hint - Install or config instruction shown to the developer.\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/**\n * Thrown when graph checkpoint / rollback / export / import is requested for a\n * network-backed graph provider (e.g. Neo4j). File-backed SQLite graph supports\n * snapshots; Neo4j does not in v1 — we refuse rather than silently skip.\n */\nexport class GraphCheckpointNotSupportedError extends WolbargError {\n /**\n * @param backend - Graph backend name (e.g. `\"neo4j\"`).\n * @param operation - Requested operation (e.g. `\"checkpoint\"`).\n */\n constructor(backend: string, operation: string) {\n super(\n `graph checkpoint not supported for network-backed graph providers (${backend})`,\n \"GRAPH_CHECKPOINT_NOT_SUPPORTED\",\n {\n operation,\n reason: `${backend} is networked / not file-backed`,\n suggestion:\n \"Use sqliteGraph({ path }) for local snapshots, or checkpoint memory storage only without a network graph provider.\",\n },\n );\n this.name = \"GraphCheckpointNotSupportedError\";\n }\n}\n\n/**\n * Map low-level SQLite / driver errors into actionable {@link WolbargError} subclasses.\n *\n * Preserves existing {@link WolbargError} instances unchanged. Recognizes lock\n * contention, missing files, and read-only database errors.\n *\n * @param operation - Facade method name for the error message (e.g. `\"remember\"`).\n * @param error - Raw thrown value from the driver.\n * @returns A typed {@link WolbargError} subclass with `reason` and `suggestion`.\n */\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 StorageLockedError(formatOperationMessage(operation, raw), {\n cause: error instanceof Error ? error : undefined,\n operation,\n reason: \"SQLite database locked\",\n suggestion:\n \"Increase concurrency.maxRetries or concurrency.lockTimeoutMs, or consider the Postgres backend for high-concurrency multi-agent workloads.\",\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 of related memories.\n *\n * Compression collapses multiple memories into one summary via an LLM, archiving\n * the originals with lineage. Use {@link createCompressionProvider} or call\n * {@link compressMemories} directly when building custom pipelines.\n *\n * @example\n * ```ts\n * import { createCompressionProvider } from \"wolbarg/compression\";\n * import { openaiLlm } from \"wolbarg/llm\";\n *\n * const compression = createCompressionProvider(openaiLlm({ apiKey, model: \"gpt-4o-mini\" }));\n * const summary = await compression.compress(memories);\n * ```\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/**\n * Contract for memory compression backends.\n *\n * Implement this interface to swap LLM vendors or use rule-based summarizers.\n * Wolbarg's `compress()` facade delegates to the configured provider.\n *\n * @example Custom provider\n * ```ts\n * const rules: CompressionProvider = {\n * name: \"truncate\",\n * async compress(memories) {\n * return memories.map((m) => m.content.text).join(\" | \").slice(0, 500);\n * },\n * };\n * ```\n */\nexport interface CompressionProvider {\n /** Provider identifier (e.g. `\"llm\"`, `\"truncate\"`). */\n readonly name: string;\n /**\n * Produce a single summary string from related memories.\n * @param memories - Non-empty list of memories to collapse.\n * @returns Plain-text summary.\n * @throws {@link CompressionError} when compression fails or input is empty.\n */\n compress(memories: MemoryRecord[]): Promise<string>;\n}\n\n/**\n * Default compression provider wrapping an {@link LlmProvider}.\n *\n * Delegates to {@link compressMemories} with the standard system prompt.\n */\nexport class LlmCompressionProvider implements CompressionProvider {\n readonly name = \"llm\";\n private readonly llm: LlmProvider;\n\n /** @param llm - Configured LLM used for summarization. */\n constructor(llm: LlmProvider) {\n this.llm = llm;\n }\n\n /** @inheritdoc */\n async compress(memories: MemoryRecord[]): Promise<string> {\n return compressMemories(this.llm, memories);\n }\n}\n\n/**\n * Compress memories into one summary using an LLM chat completion.\n *\n * @param llm - LLM provider for the summarization call.\n * @param memories - Memories to collapse (must be non-empty).\n * @returns Plain-text summary preserving key facts.\n * @throws {@link CompressionError} when `memories` is empty or the LLM call fails.\n *\n * @example\n * ```ts\n * const summary = await compressMemories(llm, selectedMemories);\n * await wolbarg.compress({ agent, memoryIds, summary });\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\n/**\n * Factory for the default LLM-backed {@link CompressionProvider}.\n *\n * @param llm - LLM used for summarization.\n * @returns A {@link CompressionProvider} named `\"llm\"`.\n */\nexport function createCompressionProvider(\n llm: LlmProvider,\n): CompressionProvider {\n return new LlmCompressionProvider(llm);\n}\n","/**\n * Chunking strategies for document ingestion.\n *\n * Long documents are split into overlapping chunks before embedding and storage.\n * Choose a strategy via {@link createChunkingStrategy} or let ingest auto-detect\n * with {@link inferChunkingStrategy}.\n *\n * @example\n * ```ts\n * import { createChunkingStrategy } from \"wolbarg/chunking\";\n *\n * const chunker = createChunkingStrategy(\"sentence\");\n * const chunks = chunker.chunk(documentText, { chunkSize: 800, overlap: 100 });\n * ```\n */\n\n/** A single text chunk with stable index for ordering. */\nexport interface Chunk {\n /** Chunk body text. */\n text: string;\n /** Zero-based position in the original document. */\n index: number;\n}\n\n/** Options controlling chunk size and overlap. */\nexport interface ChunkingOptions {\n /** Target characters per chunk (default `800`, minimum `32`). */\n chunkSize?: number;\n /** Overlap between consecutive chunks (default `100`, capped at half of chunkSize). */\n overlap?: number;\n}\n\n/**\n * Contract for document chunking strategies.\n *\n * Implement this interface for custom splitters (token-based, semantic, etc.).\n * Wolbarg ingest calls {@link ChunkingStrategy.chunk} after parsing a document.\n */\nexport interface ChunkingStrategy {\n /** Strategy name (e.g. `\"sentence\"`, `\"markdown\"`). */\n readonly name: string;\n /**\n * Split `text` into ordered chunks.\n * @param text - Full document text.\n * @param options - Optional size and overlap overrides.\n * @returns Non-overlapping or sliding-window chunks with indices.\n */\n chunk(text: string, options?: ChunkingOptions): Chunk[];\n}\n\n/** Clamp and validate chunking options with safe defaults. */\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\n/** Merge logical pieces (sentences, paragraphs) into size-bounded chunks. */\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\n/** Fixed-size sliding window over raw text. */\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\n/** Character-based fixed window chunking (ignores sentence boundaries). */\nexport class FixedChunkingStrategy implements ChunkingStrategy {\n readonly name = \"fixed\";\n /** @inheritdoc */\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n return slidingWindow(text, chunkSize, overlap);\n }\n}\n\n/** Sentence-boundary-aware chunking (splits on `.!?` followed by whitespace). */\nexport class SentenceChunkingStrategy implements ChunkingStrategy {\n readonly name = \"sentence\";\n /** @inheritdoc */\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\n/** Paragraph-boundary-aware chunking (splits on blank lines). */\nexport class ParagraphChunkingStrategy implements ChunkingStrategy {\n readonly name = \"paragraph\";\n /** @inheritdoc */\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\n/** Markdown heading-aware chunking (splits on `#` headings; falls back to paragraph). */\nexport class MarkdownChunkingStrategy implements ChunkingStrategy {\n readonly name = \"markdown\";\n /** @inheritdoc */\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\n/** Alias for {@link MarkdownChunkingStrategy}. */\nexport class HeadingChunkingStrategy implements ChunkingStrategy {\n readonly name = \"heading\";\n /** @inheritdoc */\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n return new MarkdownChunkingStrategy().chunk(text, options);\n }\n}\n\n/**\n * Factory for built-in chunking strategies.\n *\n * @param name - Strategy name (default `\"sentence\"`).\n * @returns A {@link ChunkingStrategy} instance.\n *\n * @example\n * ```ts\n * const chunker = createChunkingStrategy(\"markdown\");\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\n/**\n * Infer the best chunking strategy from document structure.\n *\n * Uses markdown chunking when heading markers are present; otherwise sentence chunking.\n *\n * @param text - Document text to inspect.\n * @returns A {@link ChunkingStrategy} suited to the content.\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\n *\r\n * @param value - Candidate string.\r\n * @param fieldName - Field label used in the error message.\r\n * @throws {ValidationError} When value is missing, not a string, or blank.\r\n */\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\n *\r\n * @param value - Candidate number.\r\n * @param fieldName - Field label used in the error message.\r\n * @param options.min - Optional inclusive lower bound.\r\n * @param options.max - Optional inclusive upper bound.\r\n * @throws {ValidationError} When value is not a finite number or out of range.\r\n */\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\n *\r\n * @param metadata - Plain object metadata (empty object serializes to `{}`).\r\n */\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\n *\r\n * @param raw - JSON string from storage (invalid JSON returns `{}`).\r\n */\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\n * @param embedding - Model output vector (must match configured dimensions).\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\n * @param distance - Cosine distance from vec0 / blob fallback search.\r\n * @returns Similarity score in roughly [-1, 1] (typically [0, 1] for normalized embeddings).\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 /**\r\n * Run `fn` exclusively — concurrent callers queue on the same mutex.\r\n *\r\n * @param fn - Async or sync work to serialize.\r\n * @returns The value returned by `fn`.\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\n *\r\n * @param baseUrl - Origin or prefix URL (trailing slashes stripped).\r\n * @param path - Path segment (leading slash optional).\r\n */\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 * ## Custom embedding providers\n *\n * Pass any object that implements {@link EmbeddingProvider} as `embedding` in\n * {@link WolbargOptions}:\n *\n * ```ts\n * const myEmbedder: EmbeddingProvider = {\n * model: \"my-embed-model\",\n * async embed(text) {\n * // Return a Float32Array of fixed dimensionality\n * return new Float32Array([...]);\n * },\n * // Optional — if omitted, the SDK parallelizes `embed` via embedMany\n * async embedBatch(texts) {\n * return Promise.all(texts.map((t) => this.embed(t)));\n * },\n * async validate() {\n * const v = await this.embed(\"health check\");\n * return { dimensions: v.length };\n * },\n * };\n *\n * const ctx = wolbarg({\n * organization: \"acme\",\n * database: { provider: \"sqlite\", url: \"./memory.db\" },\n * embedding: myEmbedder, // or openaiEmbedding({ ... })\n * });\n * ```\n *\n * Built-in factories wrap OpenAI-compatible `POST {baseUrl}/embeddings` APIs.\n * **Important:** keep the same model (and dimensions) for the lifetime of a\n * database — mixing models will cause dimension mismatch errors.\n */\n\nimport type { EmbeddingConfig } from \"../types/index.js\";\nimport { EmbeddingError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\n/**\n * Contract for any embedding backend used by Wolbarg.\n *\n * Implement this to plug in Voyage, Cohere, a local ONNX model, etc. Vectors\n * must be finite floats; dimensionality is fixed after the first successful\n * {@link EmbeddingProvider.validate} / remember.\n */\nexport interface EmbeddingProvider {\n /** Embedding model id (telemetry + cache key namespace). */\n readonly model: string;\n /**\n * Produce a float embedding for the given text.\n *\n * @param text - Non-empty content to embed (memory text or recall query).\n * @returns Dense vector as `Float32Array` (same length for every call).\n */\n embed(text: string): Promise<Float32Array>;\n /**\n * Optional batch embedding. When present, {@link embedMany} and ingest prefer it.\n * When absent, the SDK falls back to concurrent single {@link embed} calls.\n *\n * @param texts - Texts to embed in one request when the API supports batching.\n * @returns One vector per input text, same order as `texts`.\n */\n embedBatch?(texts: string[]): Promise<Float32Array[]>;\n /**\n * Connectivity + dimension probe used during {@link Wolbarg.ready}.\n *\n * @returns Object with `dimensions` equal to the vector length.\n * @throws When the endpoint is unreachable or returns an empty vector.\n */\n validate(): Promise<{ dimensions: number }>;\n}\n\ninterface OpenAIEmbeddingResponse {\n data?: Array<{ embedding?: number[]; index?: number }>;\n error?: { message?: string };\n}\n\n/**\n * OpenAI-compatible embeddings client (`POST {baseUrl}/embeddings`).\n *\n * @param config - See {@link EmbeddingConfig} (`baseUrl`, `apiKey`, `model`,\n * optional `timeoutMs`).\n */\nexport class OpenAICompatibleEmbeddingProvider implements EmbeddingProvider {\n /** Model name sent in the request body. */\n readonly model: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n\n /**\n * @param config - OpenAI-compatible embedding endpoint settings.\n * @param config.baseUrl - API root, e.g. `https://api.openai.com/v1`.\n * @param config.apiKey - Bearer token. Use any non-empty string for local\n * servers that ignore auth.\n * @param config.model - Embedding model id (e.g. `\"text-embedding-3-small\"`).\n * @param config.timeoutMs - Abort after this many ms. Defaults to `30_000`.\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 /**\n * Embed a single string.\n *\n * @param text - Input text.\n * @returns Embedding vector.\n * @throws {EmbeddingError} On HTTP errors, timeouts, or empty vectors.\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 /**\n * Embed multiple strings in one API call when the server supports batch input.\n * Falls back to sequential {@link embed} if the response length mismatches.\n *\n * @param texts - Inputs to embed.\n * @returns One vector per input, same order.\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 /**\n * Probe the endpoint and report vector dimensionality.\n *\n * @returns `{ dimensions }` from a fixed health-check string.\n * @throws {EmbeddingError} When the probe fails.\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 /**\n * Low-level HTTP request to `/embeddings`.\n *\n * @param input - Single string or batch of strings.\n * @returns Parsed OpenAI-style JSON body.\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 /** @param error - Unknown thrown value. @returns Human-readable message. */\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\n/**\n * Build an {@link EmbeddingProvider} from {@link EmbeddingConfig}.\n *\n * @param config - Full config including `baseUrl`, `apiKey`, and `model`.\n * @returns A ready-to-use {@link OpenAICompatibleEmbeddingProvider}.\n *\n * @example\n * ```ts\n * const embedding = createEmbeddingProvider({\n * baseUrl: \"https://api.openai.com/v1\",\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"text-embedding-3-small\",\n * });\n * ```\n */\nexport function createEmbeddingProvider(\n config: EmbeddingConfig,\n): EmbeddingProvider {\n return new OpenAICompatibleEmbeddingProvider(config);\n}\n\n/**\n * Internal helper that binds a default `baseUrl` for named factory exports.\n *\n * @param defaults - Must include `baseUrl`.\n * @returns A factory where `baseUrl` may be omitted by the caller.\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\n/**\n * OpenAI-compatible embeddings with an explicit `baseUrl`.\n *\n * @param config - Full {@link EmbeddingConfig} including `baseUrl`.\n * @returns {@link EmbeddingProvider} instance.\n *\n * @example\n * ```ts\n * embedding: openaiCompatibleEmbedding({\n * baseUrl: \"https://my-proxy.example.com/v1\",\n * apiKey: process.env.API_KEY!,\n * model: \"text-embedding-3-small\",\n * })\n * ```\n */\nexport const openaiCompatibleEmbedding = (\n config: EmbeddingConfig,\n): EmbeddingProvider => createEmbeddingProvider(config);\n\n/**\n * OpenAI Embeddings API (`https://api.openai.com/v1`).\n *\n * @param config - `apiKey` and `model` required (e.g. `\"text-embedding-3-small\"`);\n * optional `timeoutMs` and override `baseUrl`.\n * @returns {@link EmbeddingProvider} for use as `embedding` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * embedding: openaiEmbedding({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"text-embedding-3-small\",\n * })\n * ```\n */\nexport const openaiEmbedding = factory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\n/**\n * Local Ollama embeddings (`http://127.0.0.1:11434/v1`).\n *\n * @param config - `apiKey` may be any non-empty string; `model` is the Ollama\n * embedding model (e.g. `\"nomic-embed-text\"`).\n * @returns {@link EmbeddingProvider} for local Ollama.\n */\nexport const ollamaEmbedding = factory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\n/**\n * OpenRouter embeddings (`https://openrouter.ai/api/v1`).\n *\n * @param config - OpenRouter API key and routed embedding model id.\n * @returns {@link EmbeddingProvider} for OpenRouter.\n */\nexport const openRouterEmbedding = factory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n\n/**\n * LM Studio local server embeddings (`http://127.0.0.1:1234/v1`).\n *\n * @param config - Local API key (often unused) and the loaded embedding model name.\n * @returns {@link EmbeddingProvider} for LM Studio.\n */\nexport const lmStudioEmbedding = factory({\n baseUrl: \"http://127.0.0.1:1234/v1\",\n});\n\n/**\n * Google Gemini embeddings via the OpenAI-compatible endpoint.\n * Default base: `https://generativelanguage.googleapis.com/v1beta/openai`.\n *\n * @param config - Gemini API key and embedding model (e.g. `\"text-embedding-004\"`).\n * @returns {@link EmbeddingProvider} for Gemini.\n */\nexport const geminiEmbedding = factory({\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n});\n\n/**\n * Together AI embeddings (`https://api.together.xyz/v1`).\n *\n * @param config - Together API key and embedding model id.\n * @returns {@link EmbeddingProvider} for Together.\n */\nexport const togetherEmbedding = factory({\n baseUrl: \"https://api.together.xyz/v1\",\n});\n\n/**\n * vLLM OpenAI-compatible embeddings (`http://127.0.0.1:8000/v1`).\n *\n * @param config - Local/server API key (if required) and the served model name.\n * @returns {@link EmbeddingProvider} for vLLM.\n */\nexport const vllmEmbedding = factory({\n baseUrl: \"http://127.0.0.1:8000/v1\",\n});\n\n/**\n * Embed many texts, preferring {@link EmbeddingProvider.embedBatch} when available.\n * Otherwise runs up to `concurrency` parallel {@link EmbeddingProvider.embed} calls.\n *\n * @param provider - Embedding backend.\n * @param texts - Strings to embed (order preserved in the result).\n * @param concurrency - Max parallel single embeds when `embedBatch` is absent.\n * Defaults to `8`.\n * @returns One `Float32Array` per input text.\n */\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 * Transparent embedding cache wrapping any {@link EmbeddingProviderLike}.\n *\n * Keys are `sha256(content):model` so identical text across agents shares vectors.\n * Use {@link withEmbeddingCache} with a {@link EmbeddingCacheStore} implementation.\n */\n\nimport { createHash } from \"node:crypto\";\n\n/**\n * Minimal embedding provider contract for cache wrapping.\n * Avoids circular import with `embedding/index.ts`.\n */\nexport interface EmbeddingProviderLike {\n /** Model name included in cache keys. */\n readonly model: string;\n /** Embed a single text string. */\n embed(text: string): Promise<Float32Array>;\n /** Optional batch embed (cache checks each item before batching misses). */\n embedBatch?(texts: string[]): Promise<Float32Array[]>;\n /** Validate provider connectivity and return embedding dimensions. */\n validate(): Promise<{ dimensions: number }>;\n}\n\n/** User-facing embedding cache configuration (constructor / options). */\nexport interface EmbeddingCacheConfig {\n /** Enable cache (default `true` in 0.4+). */\n enabled?: boolean;\n /** Lazy TTL expiry on read; default no expiry. */\n ttlMs?: number;\n /** LRU eviction cap; default unbounded in-memory + durable store limits. */\n maxEntries?: number;\n}\n\n/** Normalized cache config after defaults are applied. */\nexport interface ResolvedEmbeddingCacheConfig {\n enabled: boolean;\n ttlMs: number | null;\n maxEntries: number | null;\n}\n\n/**\n * Resolve embedding cache config with SDK defaults.\n *\n * @param input - Optional partial config from `wolbarg({ embeddingCache })`.\n */\nexport function resolveEmbeddingCacheConfig(\n input?: EmbeddingCacheConfig,\n): ResolvedEmbeddingCacheConfig {\n return {\n enabled: input?.enabled ?? true,\n ttlMs: input?.ttlMs ?? null,\n maxEntries: input?.maxEntries ?? null,\n };\n}\n\n/**\n * Build a deterministic cache key from content and model name.\n *\n * @param content - Raw text that was embedded.\n * @param model - Embedding model identifier.\n */\nexport function embeddingCacheKey(content: string, model: string): string {\n const hash = createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n return `${hash}:${model}`;\n}\n\n/**\n * Pluggable durable / in-memory store for cached embedding vectors.\n *\n * Implement for Redis, S3, or other shared caches across processes.\n */\nexport interface EmbeddingCacheStore {\n /** Lookup a cached vector; return `null` on miss or expiry. */\n get(cacheKey: string): Promise<Float32Array | null>;\n /** Store a vector (may be write-behind). */\n set(cacheKey: string, model: string, vector: Float32Array): Promise<void>;\n /** Update LRU timestamp for a key (optional optimization). */\n touch(cacheKey: string): Promise<void>;\n /** Evict oldest entries when count exceeds `maxEntries`. */\n evictIfNeeded(maxEntries: number): Promise<void>;\n}\n\n/** Embedding provider wrapped with hit/miss statistics. */\nexport interface CacheAwareEmbedding extends EmbeddingProviderLike {\n /** Cache hits since construction or last {@link CacheAwareEmbedding.resetCacheStats}. */\n readonly cacheHits: number;\n /** Cache misses in the same window. */\n readonly cacheMisses: number;\n /** Reset hit/miss counters to zero. */\n resetCacheStats(): void;\n}\n\n/**\n * Wrap an embedding provider with a content+model cache.\n *\n * Cache check happens per-item before batch assembly so repeated texts never\n * hit the embedding API.\n *\n * @param provider - Underlying embedding provider.\n * @param store - L1 + durable cache store.\n * @param config - Resolved cache options from {@link resolveEmbeddingCacheConfig}.\n * @returns Provider with identical API plus cache stats.\n *\n * @example\n * ```ts\n * const cached = withEmbeddingCache(embedding, sqliteStore, resolveEmbeddingCacheConfig());\n * ```\n */\nexport function withEmbeddingCache(\n provider: EmbeddingProviderLike,\n store: EmbeddingCacheStore,\n config: ResolvedEmbeddingCacheConfig,\n): CacheAwareEmbedding {\n let cacheHits = 0;\n let cacheMisses = 0;\n\n async function embedOne(text: string): Promise<Float32Array> {\n if (!config.enabled) {\n cacheMisses += 1;\n return provider.embed(text);\n }\n const key = embeddingCacheKey(text, provider.model);\n const cached = await store.get(key);\n if (cached) {\n cacheHits += 1;\n // LRU touch is batched inside SqliteEmbeddingCacheStore.get — no per-hit write here.\n return cached;\n }\n cacheMisses += 1;\n const vector = await provider.embed(text);\n // Fire-and-forget durable write — L1 is updated synchronously inside set().\n void store.set(key, provider.model, vector);\n if (config.maxEntries !== null) {\n void store.evictIfNeeded(config.maxEntries);\n }\n return vector;\n }\n\n async function embedBatch(texts: string[]): Promise<Float32Array[]> {\n if (!config.enabled || texts.length === 0) {\n if (provider.embedBatch) {\n cacheMisses += texts.length;\n return provider.embedBatch(texts);\n }\n return Promise.all(texts.map((t) => embedOne(t)));\n }\n\n const results: Array<Float32Array | null> = new Array(texts.length).fill(\n null,\n );\n const missIndexes: number[] = [];\n const missTexts: string[] = [];\n\n for (let i = 0; i < texts.length; i += 1) {\n const text = texts[i]!;\n const key = embeddingCacheKey(text, provider.model);\n const cached = await store.get(key);\n if (cached) {\n cacheHits += 1;\n results[i] = cached;\n } else {\n missIndexes.push(i);\n missTexts.push(text);\n }\n }\n\n if (missTexts.length > 0) {\n cacheMisses += missTexts.length;\n const vectors = provider.embedBatch\n ? await provider.embedBatch(missTexts)\n : await Promise.all(missTexts.map((t) => provider.embed(t)));\n for (let j = 0; j < missIndexes.length; j += 1) {\n const idx = missIndexes[j]!;\n const vector = vectors[j]!;\n results[idx] = vector;\n const key = embeddingCacheKey(missTexts[j]!, provider.model);\n void store.set(key, provider.model, vector);\n }\n if (config.maxEntries !== null) {\n void store.evictIfNeeded(config.maxEntries);\n }\n }\n\n return results as Float32Array[];\n }\n\n return {\n model: provider.model,\n embed: embedOne,\n embedBatch,\n validate: () => provider.validate(),\n get cacheHits() {\n return cacheHits;\n },\n get cacheMisses() {\n return cacheMisses;\n },\n resetCacheStats() {\n cacheHits = 0;\n cacheMisses = 0;\n },\n };\n}\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\n *\r\n * @param a - First embedding vector.\r\n * @param b - Second embedding vector (same length as `a`).\r\n * @returns Distance in [0, 2]; returns `1` when either vector has zero norm.\r\n * @throws {Error} When vector lengths differ.\r\n */\r\nexport function cosineDistance(a: Float32Array, b: Float32Array): number { if (a.length !== b.length) {\r\n throw new Error(\r\n `cosineDistance dimension mismatch: a.length=${a.length}, b.length=${b.length}`,\r\n );\r\n }\r\n const len = a.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\n * @param data - Raw bytes from a SQLite BLOB column.\r\n * @returns Float32Array view over the embedding (may alias `data`'s buffer).\r\n */\r\nexport function bufferToEmbedding(data: Uint8Array | Buffer): Float32Array { 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 * Storage-backend-agnostic embedding_cache table access.\n *\n * Design: L1 Map is the hot path (sync hit). Durable stores are write-behind\n * so cache never contends with memory inserts on the same connection/pool.\n */\n\nimport type { DatabaseSync, StatementSync } from \"node:sqlite\";\nimport type { EmbeddingCacheStore } from \"./cache.js\";\nimport { embeddingToBuffer } from \"../utils/index.js\";\nimport { bufferToEmbedding } from \"../utils/vector.js\";\n\n/** SQL DDL for the `embedding_cache` table (SQLite). */\nexport const CREATE_EMBEDDING_CACHE_TABLE = `\nCREATE TABLE IF NOT EXISTS embedding_cache (\n cache_key TEXT PRIMARY KEY NOT NULL,\n model TEXT NOT NULL,\n vector BLOB NOT NULL,\n created_at TEXT NOT NULL,\n last_used_at TEXT NOT NULL\n);\n`;\n\n/** Index on `last_used_at` for LRU eviction queries. */\nexport const CREATE_EMBEDDING_CACHE_INDEX = `\nCREATE INDEX IF NOT EXISTS idx_embedding_cache_last_used\n ON embedding_cache(last_used_at);\n`;\n\nconst TOUCH_FLUSH_THRESHOLD = 64;\nconst L1_DEFAULT_MAX = 50_000;\n\ntype L1Entry = {\n model: string;\n vector: Float32Array;\n createdAt: number;\n lastUsedAt: number;\n};\n\n/** Shared L1 so repeated texts never touch durable I/O on the hot path. */\nclass L1Cache {\n private readonly map = new Map<string, L1Entry>();\n private readonly maxEntries: number;\n\n constructor(maxEntries = L1_DEFAULT_MAX) {\n this.maxEntries = maxEntries;\n }\n\n get(cacheKey: string, ttlMs: number | null): Float32Array | null {\n const entry = this.map.get(cacheKey);\n if (!entry) {\n return null;\n }\n if (ttlMs !== null && Date.now() - entry.createdAt > ttlMs) {\n this.map.delete(cacheKey);\n return null;\n }\n entry.lastUsedAt = Date.now();\n // Refresh LRU order without reallocating the entry.\n this.map.delete(cacheKey);\n this.map.set(cacheKey, entry);\n return entry.vector;\n }\n\n set(cacheKey: string, model: string, vector: Float32Array): void {\n const now = Date.now();\n if (this.map.has(cacheKey)) {\n this.map.delete(cacheKey);\n }\n this.map.set(cacheKey, {\n model,\n vector,\n createdAt: now,\n lastUsedAt: now,\n });\n this.evictIfNeeded();\n }\n\n touch(cacheKey: string): void {\n const entry = this.map.get(cacheKey);\n if (!entry) {\n return;\n }\n entry.lastUsedAt = Date.now();\n this.map.delete(cacheKey);\n this.map.set(cacheKey, entry);\n }\n\n evictIfNeeded(maxEntries?: number): void {\n const limit = maxEntries ?? this.maxEntries;\n while (this.map.size > limit) {\n const oldest = this.map.keys().next().value;\n if (oldest === undefined) {\n break;\n }\n this.map.delete(oldest);\n }\n }\n\n get size(): number {\n return this.map.size;\n }\n}\n\n/**\n * SQLite-backed embedding cache with L1 hot map + write-behind durable rows.\n *\n * L1 hits never touch SQLite on the recall/remember hot path. Durable writes\n * are deferred so the cache never contends with memory inserts on the same connection.\n *\n * @example\n * ```ts\n * const store = new SqliteEmbeddingCacheStore(() => db, { ttlMs: 86_400_000 });\n * ```\n */\nexport class SqliteEmbeddingCacheStore implements EmbeddingCacheStore {\n private readonly ttlMs: number | null;\n private readonly getDb: () => DatabaseSync | null;\n private readonly l1 = new L1Cache();\n private readonly pendingTouches = new Set<string>();\n private readonly pendingSets = new Map<\n string,\n { model: string; vector: Float32Array; createdAt: number }\n >();\n private persistScheduled = false;\n private stmts: {\n get: StatementSync;\n delete: StatementSync;\n set: StatementSync;\n touch: StatementSync;\n count: StatementSync;\n evict: StatementSync;\n } | null = null;\n\n /**\n * @param dbOrGetter - SQLite `DatabaseSync` or lazy getter (allows late bind).\n * @param options.ttlMs - Optional TTL for cache entries on read.\n */\n constructor(\n dbOrGetter: DatabaseSync | (() => DatabaseSync | null),\n options?: { ttlMs?: number | null },\n ) {\n this.ttlMs = options?.ttlMs ?? null;\n this.getDb =\n typeof dbOrGetter === \"function\" ? dbOrGetter : () => dbOrGetter;\n }\n\n private requireDb(): DatabaseSync | null {\n try {\n return this.getDb();\n } catch {\n return null;\n }\n }\n\n private ensureStatements(db: DatabaseSync): NonNullable<typeof this.stmts> {\n if (this.stmts) {\n return this.stmts;\n }\n this.stmts = {\n get: db.prepare(\n `SELECT model, vector, last_used_at, created_at\n FROM embedding_cache\n WHERE cache_key = ?`,\n ),\n delete: db.prepare(`DELETE FROM embedding_cache WHERE cache_key = ?`),\n set: db.prepare(\n `INSERT INTO embedding_cache (cache_key, model, vector, created_at, last_used_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(cache_key) DO UPDATE SET\n model = excluded.model,\n vector = excluded.vector,\n last_used_at = excluded.last_used_at`,\n ),\n touch: db.prepare(\n `UPDATE embedding_cache SET last_used_at = ? WHERE cache_key = ?`,\n ),\n count: db.prepare(`SELECT COUNT(*) AS c FROM embedding_cache`),\n evict: db.prepare(\n `DELETE FROM embedding_cache WHERE cache_key IN (\n SELECT cache_key FROM embedding_cache\n ORDER BY last_used_at ASC\n LIMIT ?\n )`,\n ),\n };\n return this.stmts;\n }\n\n async get(cacheKey: string): Promise<Float32Array | null> {\n const l1Hit = this.l1.get(cacheKey, this.ttlMs);\n if (l1Hit) {\n return l1Hit;\n }\n // Pending durable write not yet flushed — still a hit.\n const pending = this.pendingSets.get(cacheKey);\n if (pending) {\n this.l1.set(cacheKey, pending.model, pending.vector);\n return pending.vector;\n }\n\n // Cold-path durable read: restore cache after process restart.\n const db = this.requireDb();\n if (!db) return null;\n try {\n const stmts = this.ensureStatements(db);\n const row = stmts.get.get(cacheKey) as\n | { model: string; vector: Uint8Array | Buffer; created_at: string | null }\n | undefined;\n if (!row) return null;\n\n if (this.ttlMs !== null) {\n const createdMs = row.created_at ? Date.parse(row.created_at) : 0;\n if (createdMs && Date.now() - createdMs > this.ttlMs) {\n stmts.delete.run(cacheKey);\n return null;\n }\n }\n\n const vector = bufferToEmbedding(row.vector);\n this.l1.set(cacheKey, row.model, vector);\n\n // Update durable LRU asynchronously via pendingTouches.\n this.pendingTouches.add(cacheKey);\n if (this.pendingTouches.size >= TOUCH_FLUSH_THRESHOLD) {\n this.schedulePersist();\n }\n\n return vector;\n } catch {\n return null;\n }\n }\n\n async set(\n cacheKey: string,\n model: string,\n vector: Float32Array,\n ): Promise<void> {\n this.l1.set(cacheKey, model, vector);\n this.pendingSets.set(cacheKey, {\n model,\n vector,\n createdAt: Date.now(),\n });\n this.pendingTouches.delete(cacheKey);\n this.schedulePersist();\n }\n\n async touch(cacheKey: string): Promise<void> {\n this.l1.touch(cacheKey);\n if (this.pendingSets.has(cacheKey)) {\n return;\n }\n this.pendingTouches.add(cacheKey);\n if (this.pendingTouches.size >= TOUCH_FLUSH_THRESHOLD) {\n this.schedulePersist();\n }\n }\n\n async flushTouches(): Promise<void> {\n await this.flushPending();\n }\n\n async evictIfNeeded(maxEntries: number): Promise<void> {\n this.l1.evictIfNeeded(maxEntries);\n // Durable eviction is deferred — L1 already respects the cap.\n }\n\n private schedulePersist(): void {\n if (this.persistScheduled) {\n return;\n }\n this.persistScheduled = true;\n queueMicrotask(() => {\n this.persistScheduled = false;\n void this.flushPending();\n });\n }\n\n private async flushPending(): Promise<void> {\n if (this.pendingSets.size === 0 && this.pendingTouches.size === 0) {\n return;\n }\n const db = this.requireDb();\n if (!db) {\n this.pendingSets.clear();\n this.pendingTouches.clear();\n return;\n }\n const sets = [...this.pendingSets.entries()];\n this.pendingSets.clear();\n const touches = [...this.pendingTouches];\n this.pendingTouches.clear();\n\n const requeue = (): void => {\n for (const [key, value] of sets) {\n this.pendingSets.set(key, value);\n }\n for (const key of touches) {\n this.pendingTouches.add(key);\n }\n this.stmts = null; // force re-prepare on retry\n this.schedulePersist();\n };\n const now = new Date().toISOString();\n try {\n const stmts = this.ensureStatements(db);\n // Best-effort durable write outside the memory write critical section.\n // Use a short IMMEDIATE try; if busy, re-queue and retry later.\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n } catch {\n for (const [key, value] of sets) {\n this.pendingSets.set(key, value);\n }\n for (const key of touches) {\n this.pendingTouches.add(key);\n }\n this.schedulePersist();\n return;\n }\n try {\n for (const [key, value] of sets) {\n stmts.set.run(\n key,\n value.model,\n embeddingToBuffer(value.vector),\n new Date(value.createdAt).toISOString(),\n now,\n );\n }\n for (const key of touches) {\n stmts.touch.run(now, key);\n }\n db.exec(\"COMMIT\");\n } catch {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore\n }\n requeue();\n }\n } catch {\n requeue();\n }\n }\n}\n\n/** In-memory-only embedding cache for tests and providers without SQL access. */\nexport class MemoryEmbeddingCacheStore implements EmbeddingCacheStore {\n private readonly l1: L1Cache;\n private readonly ttlMs: number | null;\n\n constructor(options?: { ttlMs?: number | null; maxEntries?: number }) {\n this.ttlMs = options?.ttlMs ?? null;\n this.l1 = new L1Cache(options?.maxEntries ?? L1_DEFAULT_MAX);\n }\n\n async get(cacheKey: string): Promise<Float32Array | null> {\n return this.l1.get(cacheKey, this.ttlMs);\n }\n\n async set(\n cacheKey: string,\n model: string,\n vector: Float32Array,\n ): Promise<void> {\n this.l1.set(cacheKey, model, vector);\n }\n\n async touch(cacheKey: string): Promise<void> {\n this.l1.touch(cacheKey);\n }\n\n async evictIfNeeded(maxEntries: number): Promise<void> {\n this.l1.evictIfNeeded(maxEntries);\n }\n}\n\ntype PgQueryable = {\n query: (\n text: string,\n params?: unknown[],\n ) => Promise<{ rows: Record<string, unknown>[]; rowCount: number | null }>;\n};\n\n/**\n * Postgres embedding cache: L1-only on the hot path by default.\n *\n * Durable writes are fire-and-forget on a deferred chain. Set `durable: true`\n * only when cross-process cache sharing is required — it can reduce speedup under concurrency.\n */\nexport class PostgresEmbeddingCacheStore implements EmbeddingCacheStore {\n private readonly ttlMs: number | null;\n private readonly getClient: () => PgQueryable | null;\n private readonly l1 = new L1Cache();\n private readonly pendingTouches = new Set<string>();\n private persistChain: Promise<void> = Promise.resolve();\n private durableEnabled: boolean;\n\n constructor(\n getClient: () => PgQueryable | null,\n options?: { ttlMs?: number | null; durable?: boolean },\n ) {\n this.getClient = getClient;\n this.ttlMs = options?.ttlMs ?? null;\n // Durable off by default for write-heavy / concurrent workloads.\n // L1 still delivers multi-x cache hits within a process.\n this.durableEnabled = options?.durable === true;\n }\n\n async get(cacheKey: string): Promise<Float32Array | null> {\n return this.l1.get(cacheKey, this.ttlMs);\n }\n\n async set(\n cacheKey: string,\n model: string,\n vector: Float32Array,\n ): Promise<void> {\n this.l1.set(cacheKey, model, vector);\n if (!this.durableEnabled) {\n return;\n }\n const now = Date.now();\n this.enqueuePersist(async (client) => {\n const iso = new Date(now).toISOString();\n await client.query(\n `INSERT INTO embedding_cache (cache_key, model, vector, created_at, last_used_at)\n VALUES ($1, $2, $3, $4::timestamptz, $5::timestamptz)\n ON CONFLICT (cache_key) DO UPDATE SET\n model = EXCLUDED.model,\n vector = EXCLUDED.vector,\n last_used_at = EXCLUDED.last_used_at`,\n [cacheKey, model, embeddingToBuffer(vector), iso, iso],\n );\n });\n }\n\n async touch(cacheKey: string): Promise<void> {\n this.l1.touch(cacheKey);\n if (!this.durableEnabled) {\n return;\n }\n this.pendingTouches.add(cacheKey);\n if (this.pendingTouches.size >= TOUCH_FLUSH_THRESHOLD) {\n void this.flushTouches();\n }\n }\n\n async flushTouches(): Promise<void> {\n if (!this.durableEnabled || this.pendingTouches.size === 0) {\n this.pendingTouches.clear();\n return;\n }\n const keys = [...this.pendingTouches];\n this.pendingTouches.clear();\n const now = new Date().toISOString();\n this.enqueuePersist(async (client) => {\n await client.query(\n `UPDATE embedding_cache\n SET last_used_at = $1::timestamptz\n WHERE cache_key = ANY($2::text[])`,\n [now, keys],\n );\n });\n }\n\n async evictIfNeeded(maxEntries: number): Promise<void> {\n this.l1.evictIfNeeded(maxEntries);\n }\n\n private enqueuePersist(\n work: (client: PgQueryable) => Promise<void>,\n ): void {\n this.persistChain = this.persistChain\n .then(async () => {\n const client = this.getClient();\n if (!client) {\n return;\n }\n await work(client);\n })\n .catch(() => undefined);\n }\n}\n","/**\n * LLM provider abstractions and OpenAI-compatible chat implementation.\n *\n * Used for memory compression ({@link Wolbarg.compress}) and experimental\n * {@link Wolbarg.rememberFromMessages} extract mode.\n *\n * ## Custom LLM providers\n *\n * Pass any object that implements {@link LlmProvider} as `llm` in\n * {@link WolbargOptions}:\n *\n * ```ts\n * const myLlm: LlmProvider = {\n * model: \"my-model\",\n * async complete(messages) {\n * // Call your backend; return the assistant text\n * return \"...\";\n * },\n * async validate() {\n * await this.complete([{ role: \"user\", content: \"ok\" }]);\n * },\n * };\n *\n * const ctx = wolbarg({\n * organization: \"acme\",\n * database: { provider: \"sqlite\", url: \"./memory.db\" },\n * embedding: openaiEmbedding({ apiKey: \"...\", model: \"text-embedding-3-small\" }),\n * llm: myLlm, // or openaiLlm({ ... }) / openaiCompatibleLlm({ ... })\n * });\n * ```\n *\n * Built-in factories (`openaiLlm`, `ollamaLlm`, `openRouterLlm`,\n * `openaiCompatibleLlm`) wrap any OpenAI-compatible `/v1/chat/completions` API.\n */\n\nimport type { LlmConfig } from \"../types/index.js\";\nimport { CompressionError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\n/**\n * One message in a chat completion request.\n *\n * @property role - Speaker role. Use `\"system\"` for instructions, `\"user\"` for\n * prompts, `\"assistant\"` for prior model turns.\n * @property content - Plain-text message body (non-empty for useful completions).\n */\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/**\n * Contract for any chat completion backend used by Wolbarg.\n *\n * Implement this interface to plug in a custom LLM (Anthropic, local GGUF via\n * a custom HTTP bridge, Azure OpenAI with extra headers, etc.). The SDK only\n * requires {@link LlmProvider.complete} to return the assistant reply as a\n * string; streaming is not used.\n *\n * @example Custom provider\n * ```ts\n * const anthropicLike: LlmProvider = {\n * model: \"claude-sonnet\",\n * async complete(messages) {\n * const res = await fetch(\"https://api.example.com/complete\", {\n * method: \"POST\",\n * body: JSON.stringify({ messages }),\n * });\n * const data = await res.json();\n * return String(data.text);\n * },\n * async validate() {\n * const reply = await this.complete([{ role: \"user\", content: \"ping\" }]);\n * if (!reply.trim()) throw new Error(\"empty reply\");\n * },\n * };\n * ```\n */\nexport interface LlmProvider {\n /** Model identifier reported in telemetry / logs (any non-empty string). */\n readonly model: string;\n /**\n * Run a chat completion and return the assistant message text.\n *\n * @param messages - Ordered conversation turns. The last message is typically\n * the user (or system+user) prompt the SDK builds for compression / extract.\n * @returns Trimmed assistant text. Empty responses should throw.\n * @throws When the backend fails, times out, or returns no text.\n */\n complete(messages: ChatMessage[]): Promise<string>;\n /**\n * Lightweight connectivity probe invoked during boot when an LLM is configured.\n * Implementations typically call {@link LlmProvider.complete} with a tiny prompt.\n *\n * @throws When the endpoint is unreachable or misconfigured.\n */\n validate(): Promise<void>;\n}\n\ninterface OpenAIChatResponse {\n choices?: Array<{ message?: { content?: string | null } }>;\n error?: { message?: string };\n}\n\n/**\n * OpenAI-compatible chat completions client (`POST {baseUrl}/chat/completions`).\n *\n * Works with OpenAI, Ollama, OpenRouter, LM Studio, vLLM, Azure OpenAI (when\n * the path matches), and any other server that speaks the same JSON schema.\n *\n * @param config - See {@link LlmConfig} for each field (`baseUrl`, `apiKey`,\n * `model`, optional `temperature`, `maxTokens`, `timeoutMs`).\n */\nexport class OpenAICompatibleLlmProvider implements LlmProvider {\n /** Model name sent in the request body and exposed on the provider. */\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 /**\n * @param config - OpenAI-compatible endpoint settings.\n * @param config.baseUrl - API root, e.g. `https://api.openai.com/v1` (no trailing `/chat/completions`).\n * @param config.apiKey - Bearer token (`Authorization: Bearer …`). Use any non-empty\n * string for local servers that ignore auth (e.g. `\"ollama\"`).\n * @param config.model - Chat model id (e.g. `\"gpt-4o-mini\"`, `\"llama3.2\"`).\n * @param config.temperature - Sampling temperature. Defaults to `0.2`.\n * @param config.maxTokens - Max completion tokens. Defaults to `4096`.\n * @param config.timeoutMs - Abort after this many ms. Defaults to `60_000`.\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 /**\n * Call `/chat/completions` and return the first choice’s message content.\n *\n * @param messages - Chat turns in OpenAI message format.\n * @returns Trimmed assistant text.\n * @throws {CompressionError} On HTTP errors, timeouts, or empty content.\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 /**\n * Probe the endpoint with a fixed `\"ok\"` prompt.\n *\n * @throws {CompressionError} When validation fails.\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 /**\n * Low-level HTTP request to `/chat/completions`.\n *\n * @param messages - Chat turns to send.\n * @returns Parsed OpenAI-style JSON body.\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 /** @param error - Unknown thrown value. @returns Human-readable message. */\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\n/**\n * Build an {@link LlmProvider} from {@link LlmConfig}.\n *\n * Prefer named helpers ({@link openaiLlm}, {@link ollamaLlm}, …) when the\n * default `baseUrl` matches your host; use this (or {@link openaiCompatibleLlm})\n * when you need a fully custom base URL.\n *\n * @param config - Full OpenAI-compatible config including `baseUrl`.\n * @returns A ready-to-use {@link OpenAICompatibleLlmProvider}.\n *\n * @example\n * ```ts\n * const llm = createLlmProvider({\n * baseUrl: \"https://api.openai.com/v1\",\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\n * temperature: 0.2,\n * maxTokens: 4096,\n * });\n * ```\n */\nexport function createLlmProvider(config: LlmConfig): LlmProvider {\n return new OpenAICompatibleLlmProvider(config);\n}\n\n/**\n * Internal helper that binds a default `baseUrl` for named factory exports.\n *\n * @param defaults - Must include `baseUrl`; other {@link LlmConfig} fields optional.\n * @returns A factory `(config) => LlmProvider` where `baseUrl` may be omitted.\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\n/**\n * OpenAI-compatible LLM with an explicit `baseUrl` (any compatible host).\n *\n * @param config - Full {@link LlmConfig} including `baseUrl`, `apiKey`, `model`.\n * @returns {@link LlmProvider} instance.\n *\n * @example\n * ```ts\n * llm: openaiCompatibleLlm({\n * baseUrl: \"https://my-proxy.example.com/v1\",\n * apiKey: process.env.API_KEY!,\n * model: \"gpt-4o-mini\",\n * })\n * ```\n */\nexport const openaiCompatibleLlm = (config: LlmConfig): LlmProvider =>\n createLlmProvider(config);\n\n/**\n * OpenAI Chat Completions (`https://api.openai.com/v1`).\n *\n * @param config - `apiKey` and `model` required; optional `temperature`,\n * `maxTokens`, `timeoutMs`, and override `baseUrl`.\n * @returns {@link LlmProvider} for use as `llm` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\n * })\n * ```\n */\nexport const openaiLlm = llmFactory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\n/**\n * Local Ollama OpenAI-compatible API (`http://127.0.0.1:11434/v1`).\n *\n * @param config - `apiKey` may be any non-empty string (Ollama often ignores it);\n * `model` is the Ollama model name (e.g. `\"llama3.2\"`).\n * @returns {@link LlmProvider} pointing at the local Ollama server.\n *\n * @example\n * ```ts\n * llm: ollamaLlm({ apiKey: \"ollama\", model: \"llama3.2\" })\n * ```\n */\nexport const ollamaLlm = llmFactory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\n/**\n * OpenRouter chat API (`https://openrouter.ai/api/v1`).\n *\n * @param config - Use your OpenRouter API key and a routed model id\n * (e.g. `\"openai/gpt-4o-mini\"`).\n * @returns {@link LlmProvider} for OpenRouter.\n *\n * @example\n * ```ts\n * llm: openRouterLlm({\n * apiKey: process.env.OPENROUTER_API_KEY!,\n * model: \"openai/gpt-4o-mini\",\n * })\n * ```\n */\nexport const openRouterLlm = llmFactory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n","/**\n * Document parsers for the ingest pipeline.\n *\n * Converts files, buffers, and raw text into {@link ParsedDocument} instances\n * before chunking and embedding. Optional peers: `pdf-parse`, `mammoth`.\n *\n * @example\n * ```ts\n * import { resolveParser, loadIngestSource } from \"wolbarg/ingest\";\n *\n * const source = await loadIngestSource({ path: \"./report.pdf\" });\n * const parser = resolveParser(source.filename, source.mimeType);\n * const doc = await parser.parse({ buffer: source.buffer, filename: source.filename });\n * ```\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ConfigurationError } from \"../errors/index.js\";\n\n/** Normalized output from a document parser. */\nexport interface ParsedDocument {\n /** Extracted plain text (empty for image-only sources). */\n text: string;\n /** Detected or declared MIME type. */\n mimeType: string;\n /** Original filename when known. */\n filename?: string;\n /** Whether the source is a raster image requiring OCR/vision. */\n isImage: boolean;\n /** Raw image bytes when `isImage` is true. */\n imageBuffer?: Buffer;\n}\n\n/**\n * Contract for document parsers.\n *\n * Implement this interface to add HTML, EPUB, or proprietary format support.\n * Register custom parsers in the array passed to {@link resolveParser}.\n *\n * @example Custom parser\n * ```ts\n * const htmlParser: DocumentParserProvider = {\n * name: \"html\",\n * extensions: [\".html\"],\n * async parse({ buffer }) {\n * return { text: buffer.toString(\"utf8\"), mimeType: \"text/html\", isImage: false };\n * },\n * };\n * ```\n */\nexport interface DocumentParserProvider {\n /** Parser identifier. */\n readonly name: string;\n /** File extensions this parser handles (lowercase, with dot). */\n readonly extensions: string[];\n /**\n * Parse a document buffer into text and optional image payload.\n * @param input - Buffer plus optional filename and MIME hints.\n */\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 let mod: unknown;\n try {\n mod = await import(\"mammoth\" as string);\n } catch (error) {\n throw new ConfigurationError(\n 'DOCX ingest requires the optional peer package \"mammoth\". Install it with: npm install mammoth',\n {\n cause: error instanceof Error ? error : undefined,\n suggestion: \"npm install mammoth\",\n operation: \"parse\",\n },\n );\n }\n\n const extractRawText =\n (mod as {\n extractRawText?: (opts: { buffer: Buffer }) => Promise<{ value: string }>;\n }).extractRawText ??\n (mod as {\n default?: {\n extractRawText: (opts: { buffer: Buffer }) => Promise<{ value: string }>;\n };\n }).default?.extractRawText;\n\n if (!extractRawText) {\n throw new ConfigurationError(\n \"DOCX ingest could not find mammoth.extractRawText. Ensure your mammoth version is compatible.\",\n { operation: \"parse\" },\n );\n }\n\n try {\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 (error) {\n throw new ConfigurationError(\n \"DOCX ingest failed to parse the document (it may be corrupt or an unsupported .docx).\",\n {\n cause: error instanceof Error ? error : undefined,\n suggestion: \"Try a different DOCX file or ensure it is not password-protected.\",\n operation: \"parse\",\n },\n );\n }\n }\n}\n\n/** Built-in parsers tried by {@link resolveParser} in order. */\nconst DEFAULT_PARSERS: DocumentParserProvider[] = [\n new TextParser(),\n new ImageParser(),\n new PdfParser(),\n new DocxParser(),\n];\n\n/**\n * Pick a parser by file extension or MIME type.\n *\n * @param filename - Original filename (used for extension lookup).\n * @param mimeType - Optional MIME fallback when extension is unknown.\n * @param parsers - Parser list (defaults to {@link DEFAULT_PARSERS}).\n * @returns Matching {@link DocumentParserProvider} (text parser as final fallback).\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\n/**\n * Load ingest input from path, buffer, or inline text.\n *\n * @param source - Exactly one of `path`, `buffer`, or `text` must be provided.\n * @returns Normalized buffer, filename, MIME, and optional raw text.\n * @throws {@link ConfigurationError} when no source field is set.\n *\n * @example\n * ```ts\n * const { buffer, filename } = await loadIngestSource({ path: \"./notes.md\" });\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\n/** Default parser chain: text, image, PDF, DOCX. */\nexport { DEFAULT_PARSERS };\n","/**\n * Constructor options for Wolbarg (v0.5.5).\n *\n * Pass **provider instances** (custom implementations of the interfaces) or\n * **config objects / factory helpers**. Discriminated at runtime via\n * {@link isEmbeddingProvider}, {@link isLlmProvider}, {@link isStorageProvider},\n * {@link isTelemetryProvider}, and {@link isGraphProvider}.\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 { GraphConfig, GraphProvider } from \"../graph/types.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 ConcurrencyConfig,\n DatabaseConfig,\n EmbeddingCacheConfig,\n EmbeddingConfig,\n LlmConfig,\n MemoryDedupeConfig,\n RetrievalConfig,\n StorageConfig,\n TelemetryConfig,\n} from \"../types/index.js\";\nimport type { VisionProvider } from \"../vision/index.js\";\n\n/**\n * Embedding input: a live {@link EmbeddingProvider} **or** an\n * {@link EmbeddingConfig} / factory result (`openaiEmbedding(...)`, etc.).\n *\n * Custom provider example:\n * ```ts\n * const embedding: EmbeddingProvider = {\n * model: \"custom\",\n * embed: async (text) => { /* return Float32Array *\\/ },\n * validate: async () => ({ dimensions: 768 }),\n * };\n * ```\n */\nexport type EmbeddingInput = EmbeddingProvider | EmbeddingConfig;\n\n/**\n * LLM input: a live {@link LlmProvider} **or** an {@link LlmConfig} /\n * factory result (`openaiLlm(...)`, `ollamaLlm(...)`, etc.).\n *\n * Required for {@link Wolbarg.compress} and `rememberFromMessages({ mode: \"extract\" })`.\n *\n * Custom provider example:\n * ```ts\n * const llm: LlmProvider = {\n * model: \"my-model\",\n * complete: async (messages) => { /* return assistant text *\\/ },\n * validate: async () => { /* ping endpoint *\\/ },\n * };\n * ```\n */\nexport type LlmInput = LlmProvider | LlmConfig;\n\n/**\n * Storage input: a live {@link StorageProvider} **or** a\n * {@link StorageConfig} / {@link DatabaseConfig} (`{ provider: \"sqlite\", url }`).\n */\nexport type StorageInput = StorageProvider | StorageConfig | DatabaseConfig;\n\n/**\n * Graph input: a live {@link GraphProvider} **or** a {@link GraphConfig}\n * (`sqliteGraph({ path })` / `neo4jGraph({ url, username, password })`).\n */\nexport type GraphInput = GraphProvider | GraphConfig;\n\n/**\n * Shared constructor fields (with or without LLM).\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 docs; `storage` remains fully supported.\n */\n storage?: StorageInput;\n /**\n * Alias for `storage`. Accepts `{ provider, url }` or `{ provider, connectionString }`,\n * or a custom {@link StorageProvider}.\n */\n database?: StorageInput;\n /**\n * Embedding provider instance or config.\n * Use {@link openaiEmbedding} / {@link ollamaEmbedding} / etc., raw\n * {@link EmbeddingConfig}, or any custom {@link EmbeddingProvider}.\n */\n embedding: EmbeddingInput;\n /**\n * Optional independent telemetry system (separate database or custom\n * {@link TelemetryProvider}).\n */\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 /**\n * Optional reranker — skipped when absent.\n * Implement {@link RerankerProvider} or use `jinaReranker` / `cohereReranker` / etc.\n */\n reranker?: RerankerProvider;\n /**\n * Optional keyword search — enables hybrid recall when present.\n * Implement {@link KeywordSearchProvider} or use {@link bm25}.\n */\n keywordSearch?: KeywordSearchProvider;\n /**\n * Optional OCR for image ingest.\n * Implement {@link OCRProvider} or use {@link tesseract}.\n */\n ocr?: OCRProvider;\n /**\n * Optional vision model for image captions during ingest.\n * Implement {@link VisionProvider} or use {@link openaiVision} / {@link geminiVision}.\n */\n vision?: VisionProvider;\n /**\n * Optional graph memory layer (SQLite embedded or Neo4j networked).\n * Fully optional — omitting it does not change existing memory behavior.\n * Accepts a {@link GraphProvider} instance or a recognized config shape.\n */\n graph?: GraphInput;\n /**\n * Optional compression provider (overrides the default LLM-backed compressor).\n * Implement {@link CompressionProvider} for a fully custom compress pipeline.\n */\n compression?: CompressionProvider;\n /**\n * Optional default chunking strategy for ingest.\n * Implement {@link ChunkingStrategy} or use `createChunkingStrategy(...)`.\n */\n chunking?: ChunkingStrategy;\n /** Optional retrieval defaults (over-fetch, hybrid weights, MMR). */\n retrieval?: RetrievalConfig;\n /** SQLite multi-writer concurrency tuning (ignored for Postgres). */\n concurrency?: ConcurrencyConfig;\n /** Transparent embedding cache (default enabled). */\n embeddingCache?: EmbeddingCacheConfig;\n /** Memory write-path options (dedupe / upsert). */\n memory?: {\n /** Exact / near-duplicate detection on remember. See {@link MemoryDedupeConfig}. */\n dedupe?: MemoryDedupeConfig;\n };\n}\n\n/**\n * Options when no LLM is configured (`compress` / extract mode unavailable).\n */\nexport interface WolbargOptionsWithoutLlm extends WolbargOptionsBase {\n llm?: undefined;\n}\n\n/**\n * Options when an LLM is configured (enables {@link Wolbarg.compress}).\n */\nexport interface WolbargOptionsWithLlm extends WolbargOptionsBase {\n /**\n * Chat model used for compression and extract-mode rememberFromMessages.\n * Pass a custom {@link LlmProvider} (`complete` + `validate`) or a config /\n * factory such as {@link openaiLlm} / {@link ollamaLlm} /\n * {@link openaiCompatibleLlm}.\n */\n llm: LlmInput;\n}\n\n/** Discriminated union of constructor options. */\nexport type WolbargOptions =\n | WolbargOptionsWithoutLlm\n | WolbargOptionsWithLlm;\n\n/**\n * Type guard: value is a live {@link EmbeddingProvider} (has `embed`).\n *\n * @param value - Embedding config or provider instance.\n * @returns `true` when `value.embed` is a function.\n */\nexport function isEmbeddingProvider(\n value: EmbeddingInput,\n): value is EmbeddingProvider {\n return typeof (value as EmbeddingProvider).embed === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link LlmProvider} (has `complete`).\n *\n * @param value - LLM config or provider instance.\n * @returns `true` when `value.complete` is a function.\n */\nexport function isLlmProvider(value: LlmInput): value is LlmProvider {\n return typeof (value as LlmProvider).complete === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link StorageProvider} (has `open`).\n *\n * @param value - Storage/database config or provider instance.\n * @returns `true` when `value.open` is a function.\n */\nexport function isStorageProvider(\n value: StorageInput,\n): value is StorageProvider {\n return typeof (value as StorageProvider).open === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link TelemetryProvider} (has `emit`).\n *\n * @param value - Telemetry config or provider instance.\n * @returns `true` when `value.emit` is a function.\n */\nexport function isTelemetryProvider(\n value: TelemetryConfig | TelemetryProvider,\n): value is TelemetryProvider {\n return typeof (value as TelemetryProvider).emit === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link GraphProvider}.\n *\n * @param value - Graph config or provider instance.\n * @returns `true` when `open`, `linkMemories`, and `getRelated` are functions.\n */\nexport function isGraphProvider(value: GraphInput): value is GraphProvider {\n return (\n typeof (value as GraphProvider).open === \"function\" &&\n typeof (value as GraphProvider).linkMemories === \"function\" &&\n typeof (value as GraphProvider).getRelated === \"function\"\n );\n}\n\n/**\n * Resolve connection path from `url` or `connectionString` on a DB config.\n *\n * @param config - Database or storage config object.\n * @returns Non-empty connection string/path, or `\"\"` if neither field is set.\n */\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/**\n * Evaluate a metadata filter against an in-memory metadata object.\n *\n * Used as fallback when SQL push-down is unavailable or for post-filtering.\n *\n * @param metadata - Opaque memory metadata record.\n * @param filter - {@link MetadataFilter} AST to evaluate.\n * @returns `true` when the metadata satisfies the filter.\n */\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 * Compile MetadataFilter ASTs into SQLite json_extract predicates.\n * Returns null when the filter cannot be pushed down safely.\n */\n\nimport type { MetadataComparison, MetadataFilter } from \"./types.js\";\n\nexport interface CompiledMetadataSql {\n /** SQL boolean expression (no leading AND). */\n expression: string;\n params: unknown[];\n}\n\nconst FIELD_RE =\n /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\n\nfunction jsonPath(field: string): string | null {\n if (!FIELD_RE.test(field)) {\n return null;\n }\n return `$.${field}`;\n}\n\nfunction compileComparison(\n field: string,\n op: MetadataComparison,\n): CompiledMetadataSql | null {\n const path = jsonPath(field);\n if (!path) {\n return null;\n }\n const extract = `json_extract(metadata_json, '${path}')`;\n\n if (\"eq\" in op) {\n const value = op.eq;\n // SQLite treats `NULL = NULL` as NULL (unknown), so `IS NULL` isn't enough\n // to distinguish explicit JSON null vs missing keys. Use json_type(...)\n // which returns the string \"null\" only for explicit JSON null.\n if (value === null) {\n return {\n expression: `json_type(metadata_json, '${path}') = 'null'`,\n params: [],\n };\n }\n if (\n value !== null &&\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n return null;\n }\n return { expression: `${extract} = ?`, params: [value] };\n }\n if (\"contains\" in op) {\n return {\n expression: `CAST(${extract} AS TEXT) LIKE '%' || ? || '%'`,\n params: [op.contains],\n };\n }\n if (\"gt\" in op) {\n return { expression: `${extract} > ?`, params: [op.gt] };\n }\n if (\"gte\" in op) {\n return { expression: `${extract} >= ?`, params: [op.gte] };\n }\n if (\"lt\" in op) {\n return { expression: `${extract} < ?`, params: [op.lt] };\n }\n if (\"lte\" in op) {\n return { expression: `${extract} <= ?`, params: [op.lte] };\n }\n if (\"between\" in op) {\n const [lo, hi] = op.between;\n return {\n expression: `${extract} >= ? AND ${extract} <= ?`,\n params: [lo, hi],\n };\n }\n return null;\n}\n\n/** Push a metadata filter into SQLite `json_extract` predicates, or `null` if unsupported. */\nexport function compileMetadataFilterToSql(\n filter: MetadataFilter,\n): CompiledMetadataSql | null {\n if (\"and\" in filter) {\n if (filter.and.length === 0) {\n return { expression: \"1\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n for (const child of filter.and) {\n const compiled = compileMetadataFilterToSql(child);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" AND \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"or\" in filter) {\n if (filter.or.length === 0) {\n return { expression: \"0\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n for (const child of filter.or) {\n const compiled = compileMetadataFilterToSql(child);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" OR \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"not\" in filter) {\n const inner = compileMetadataFilterToSql(filter.not);\n if (!inner) {\n return null;\n }\n return {\n expression: `NOT (${inner.expression})`,\n params: inner.params,\n };\n }\n return compileComparison(filter.field, filter.op);\n}\n","/**\n * Cross-platform structured logger gated by {@link TelemetryLogLevel}.\n *\n * Used internally by {@link TelemetryEmitter}; also exported for adapter packages.\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 /** @param level - Minimum level to print (default `\"info\"`). */\n constructor(private level: TelemetryLogLevel = \"info\") {}\n\n /** Change the minimum log level at runtime. */\n setLevel(level: TelemetryLogLevel): void {\n this.level = level;\n }\n\n /** @returns Current minimum log level. */\n getLevel(): TelemetryLogLevel {\n return this.level;\n }\n\n /** Log at error level. */\n error(message: string, extra?: unknown): void {\n this.write(\"error\", message, extra);\n }\n\n /** Log at warn level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\n */\n warn(message: string, extra?: unknown): void {\n this.write(\"warn\", message, extra);\n }\n\n /** Log at info level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\n */\n info(message: string, extra?: unknown): void {\n this.write(\"info\", message, extra);\n }\n\n /** Log at debug level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\n */\n debug(message: string, extra?: unknown): void {\n this.write(\"debug\", message, extra);\n }\n\n /** Log at trace level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\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 * SQL schema constants and migration statements.\n */\n\n/** Current schema version written to `Wolbarg_meta.schema_version`. */\nexport const SCHEMA_VERSION = 4;\n\n/** Keys stored in the `Wolbarg_meta` key-value table. */\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 content_hash 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', 'updated')),\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/**\n * FTS5 index for keyword / BM25 search.\n * `organization` stays UNINDEXED so tenant IDs are not Porter-tokenized;\n * equality filters and bulk DELETE BY organization still use the stored value.\n */\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_EMBEDDING_CACHE_TABLE = `\nCREATE TABLE IF NOT EXISTS embedding_cache (\n cache_key TEXT PRIMARY KEY NOT NULL,\n model TEXT NOT NULL,\n vector BLOB NOT NULL,\n created_at TEXT NOT NULL,\n last_used_at TEXT NOT NULL\n);\n`;\n\n/**\n * Graph memory tables (SQLite graph provider — separate DB file by default).\n * `type` is the node kind (`memory` | `entity`); entity classification lives in metadata.\n */\nexport const CREATE_GRAPH_NODES_TABLE = `\nCREATE TABLE IF NOT EXISTS graph_nodes (\n id TEXT PRIMARY KEY NOT NULL,\n type TEXT NOT NULL CHECK (type IN ('memory', 'entity')),\n ref_id TEXT NOT NULL,\n name TEXT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n);\n`;\n\nexport const CREATE_GRAPH_EDGES_TABLE = `\nCREATE TABLE IF NOT EXISTS graph_edges (\n id TEXT PRIMARY KEY NOT NULL,\n from_node_id TEXT NOT NULL,\n to_node_id TEXT NOT NULL,\n relation TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n FOREIGN KEY (from_node_id) REFERENCES graph_nodes(id) ON DELETE CASCADE,\n FOREIGN KEY (to_node_id) REFERENCES graph_nodes(id) ON DELETE CASCADE\n);\n`;\n\n/** Indexes required for in-SQL recursive CTE graph walks. */\nexport const CREATE_GRAPH_INDEXES = [\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_graph_nodes_type_ref\n ON graph_nodes(type, ref_id);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_from\n ON graph_edges(from_node_id);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_to\n ON graph_edges(to_node_id);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_from_rel\n ON graph_edges(from_node_id, relation);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_to_rel\n ON graph_edges(to_node_id, relation);`,\n] as const;\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 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 /** Agent-scoped active list (compress / forget-by-agent). */\n `CREATE INDEX IF NOT EXISTS idx_memories_org_agent_active_created\n ON memories(organization, agent, created_at) WHERE archived = 0;`,\n `CREATE INDEX IF NOT EXISTS idx_history_memory_id ON memory_history(memory_id);`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_org_agent_hash_active\n ON memories(organization, agent, content_hash)\n WHERE archived = 0 AND content_hash IS NOT NULL;`,\n `CREATE INDEX IF NOT EXISTS idx_embedding_cache_last_used\n ON embedding_cache(last_used_at);`,\n] as const;\n\n/** Dropped in schema v4 — global created_at index was unused (all queries scope by org). */\nexport const DROP_REDUNDANT_INDEXES_V4 = [\n `DROP INDEX IF EXISTS idx_memories_created_at;`,\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 *\n * @param dimensions - Embedding vector length (positive integer).\n * @returns `CREATE VIRTUAL TABLE … vec0(…)` DDL string.\n * @throws {Error} When dimensions is not a positive integer.\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 * Each property is a parameterized query string consumed by\n * {@link SqliteStorageProvider} — not a public runtime API, but exported\n * for tests, tooling, and custom SQLite adapters.\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, content_hash, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, 0, NULL, ?, ?, ?)\n RETURNING rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n `,\n\n getMemoryById: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, 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, content_hash, 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, content_hash, 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, content_hash, created_at, updated_at\n FROM memories\n WHERE organization = ?\n `,\n\n findActiveByContentHash: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE organization = ? AND agent = ? AND content_hash = ? AND archived = 0\n LIMIT 1\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 OR REPLACE 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 content_hash = COALESCE(?, content_hash),\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\n deleteFtsByOrg: `\n DELETE FROM memories_fts WHERE organization = ?\n `,\n\n deleteFtsByOrgAgent: `\n DELETE FROM memories_fts WHERE organization = ? AND agent = ?\n `,\n\n deleteEmbeddingsByOrg: `\n DELETE FROM memory_embeddings WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ?\n )\n `,\n\n deleteEmbeddingsByOrgAgent: `\n DELETE FROM memory_embeddings WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ? AND agent = ?\n )\n `,\n\n deleteEmbeddingsBlobByOrg: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ?\n )\n `,\n\n deleteEmbeddingsBlobByOrgAgent: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ? AND agent = ?\n )\n `,\n\n deleteArchivedEmbeddings: `\n DELETE FROM memory_embeddings WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE archived = 1\n )\n `,\n\n deleteArchivedEmbeddingsBlob: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE archived = 1\n )\n `,\n\n /** Single-pass org stats (avoids 4 separate COUNT queries). */\n getStats: `\n SELECT\n COUNT(*) AS total,\n COALESCE(SUM(CASE WHEN archived = 0 THEN 1 ELSE 0 END), 0) AS active,\n COALESCE(SUM(CASE WHEN archived = 1 THEN 1 ELSE 0 END), 0) AS archived,\n COUNT(DISTINCT CASE WHEN archived = 0 THEN agent END) AS agents\n FROM memories\n WHERE organization = ?\n `,\n} as const;\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\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 search.\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 /**\n * @param dimensions - Embedding vector length.\n * @param initialCapacity - Initial slot capacity (default `256`).\n */\n constructor(dimensions: number, initialCapacity = 256) {\n this.dims = dimensions;\n this.data = new Float32Array(initialCapacity * dimensions);\n }\n\n /** Number of indexed vectors. */\n get size(): number {\n return this.count;\n }\n\n /** Remove all vectors from the index. */\n clear(): void {\n this.rowids.length = 0;\n this.rowidToSlot.clear();\n this.count = 0;\n }\n\n /**\n * Insert or replace a vector for `rowid` (L2-normalized internally).\n * @param rowid - Memory table row identifier.\n * @param embedding - Raw embedding vector.\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 /**\n * Remove a vector by `rowid`.\n * @param rowid - Memory table row identifier.\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 /**\n * Top-k by cosine distance (1 - dot) assuming query is L2-normalized.\n *\n * @param queryNormalized - L2-normalized query vector (use {@link normalizeEmbedding}).\n * @param topK - Maximum hits to return.\n */\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 const rowid = rowids[i]!;\n\n if (heapSize < k) {\n heapDist[heapSize] = distance;\n heapRow[heapSize] = rowid;\n heapSize += 1;\n if (heapSize === k) {\n buildMaxHeap(heapDist, heapRow, k);\n }\n } else {\n const worstDist = heapDist[0]!;\n const worstRow = heapRow[0]!;\n // Deterministic heap behavior: when distances tie, keep the smaller rowid.\n if (distance < worstDist || (distance === worstDist && rowid < worstRow)) {\n heapDist[0] = distance;\n heapRow[0] = rowid;\n siftDown(heapDist, heapRow, 0, k);\n }\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) => {\n const diff = a.distance - b.distance;\n if (diff !== 0) return diff;\n return a.memoryRowid - b.memoryRowid;\n });\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/**\n * L2-normalize an embedding into a new Float32Array of exactly `dims` length.\n *\n * @param embedding - Source vector (may be shorter than `dims`; padded with zeros).\n * @param dims - Output dimensionality (defaults to `embedding.length`).\n */\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 (\n left < n &&\n (dist[left]! > dist[largest]! ||\n (dist[left]! === dist[largest]! && rows[left]! > rows[largest]!))\n ) largest = left;\n if (\n right < n &&\n (dist[right]! > dist[largest]! ||\n (dist[right]! === dist[largest]! && rows[right]! > rows[largest]!))\n ) 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 multi-writer concurrency defaults and validation.\n */\n\nimport { ConfigurationError } from \"../../errors/index.js\";\n\nexport interface ConcurrencyConfig {\n /** Max retry attempts after SQLITE_BUSY. Default: 5 */\n maxRetries?: number;\n /** Base backoff in ms before jitter. Default: 50 */\n baseBackoffMs?: number;\n /** Cap on backoff delay in ms. Default: 2000 */\n maxBackoffMs?: number;\n /** SQLite busy_timeout pragma in ms. Default: 5000 */\n lockTimeoutMs?: number;\n}\n\nexport interface ResolvedConcurrencyConfig {\n maxRetries: number;\n baseBackoffMs: number;\n maxBackoffMs: number;\n lockTimeoutMs: number;\n}\n\nexport const DEFAULT_CONCURRENCY: ResolvedConcurrencyConfig = {\n maxRetries: 5,\n baseBackoffMs: 50,\n maxBackoffMs: 2000,\n lockTimeoutMs: 5000,\n};\n\nexport function resolveConcurrencyConfig(\n input?: ConcurrencyConfig,\n): ResolvedConcurrencyConfig {\n const resolved: ResolvedConcurrencyConfig = {\n maxRetries: input?.maxRetries ?? DEFAULT_CONCURRENCY.maxRetries,\n baseBackoffMs: input?.baseBackoffMs ?? DEFAULT_CONCURRENCY.baseBackoffMs,\n maxBackoffMs: input?.maxBackoffMs ?? DEFAULT_CONCURRENCY.maxBackoffMs,\n lockTimeoutMs: input?.lockTimeoutMs ?? DEFAULT_CONCURRENCY.lockTimeoutMs,\n };\n\n assertPositiveInt(resolved.maxRetries, \"concurrency.maxRetries\");\n assertPositiveNumber(resolved.baseBackoffMs, \"concurrency.baseBackoffMs\");\n assertPositiveNumber(resolved.maxBackoffMs, \"concurrency.maxBackoffMs\");\n assertPositiveInt(resolved.lockTimeoutMs, \"concurrency.lockTimeoutMs\");\n\n if (resolved.maxBackoffMs < resolved.baseBackoffMs) {\n throw new ConfigurationError(\n \"concurrency.maxBackoffMs must be >= concurrency.baseBackoffMs\",\n );\n }\n\n return resolved;\n}\n\nfunction assertPositiveInt(value: number, field: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new ConfigurationError(`${field} must be a non-negative integer`);\n }\n}\n\nfunction assertPositiveNumber(value: number, field: string): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new ConfigurationError(`${field} must be a non-negative number`);\n }\n}\n","/**\n * BEGIN IMMEDIATE transactions with SQLITE_BUSY retry + jitter backoff.\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\nimport { StorageLockedError } from \"../../errors/index.js\";\nimport type { ResolvedConcurrencyConfig } from \"./concurrency-config.js\";\n\nexport function isSqliteBusyError(error: unknown): boolean {\n const raw = error instanceof Error ? error.message : String(error);\n const lower = raw.toLowerCase();\n return (\n lower.includes(\"database is locked\") ||\n lower.includes(\"sqlite_busy\") ||\n lower.includes(\"busy\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction backoffDelay(\n attempt: number,\n config: ResolvedConcurrencyConfig,\n): number {\n const exp = Math.min(\n config.maxBackoffMs,\n config.baseBackoffMs * 2 ** attempt,\n );\n const jitter = Math.random() * config.baseBackoffMs;\n return Math.min(config.maxBackoffMs, exp + jitter);\n}\n\n/**\n * Run `fn` inside BEGIN IMMEDIATE … COMMIT, retrying on SQLITE_BUSY.\n */\nexport function withImmediateTransactionSync<T>(\n db: DatabaseSync,\n config: ResolvedConcurrencyConfig,\n fn: () => T,\n onRetry?: (attempt: number, delayMs: number, error: unknown) => void,\n): T {\n let lastError: unknown;\n for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {\n try {\n db.exec(\"BEGIN IMMEDIATE\");\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 throw error;\n }\n } catch (error) {\n lastError = error;\n const isBusy = isSqliteBusyError(error);\n if (!isBusy) {\n throw error;\n }\n if (attempt >= config.maxRetries) {\n break;\n }\n const delay = backoffDelay(attempt, config);\n onRetry?.(attempt + 1, delay, error);\n // Sync path: busy-wait is unavoidable for node:sqlite sync API.\n const end = Date.now() + delay;\n while (Date.now() < end) {\n /* spin */\n }\n }\n }\n throw new StorageLockedError(\n `SQLite write lock could not be acquired after ${config.maxRetries} retries`,\n {\n cause: lastError instanceof Error ? lastError : undefined,\n reason: \"SQLITE_BUSY exhausted retries\",\n suggestion:\n \"Increase concurrency.maxRetries or concurrency.lockTimeoutMs, or consider the Postgres backend for high-concurrency multi-agent workloads.\",\n },\n );\n}\n\n/**\n * Async variant — preferred when callers can await between retries.\n */\nexport async function withImmediateTransaction<T>(\n db: DatabaseSync,\n config: ResolvedConcurrencyConfig,\n fn: () => T | Promise<T>,\n onRetry?: (attempt: number, delayMs: number, error: unknown) => void,\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n try {\n const result = await fn();\n db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore\n }\n throw error;\n }\n } catch (error) {\n lastError = error;\n const isBusy = isSqliteBusyError(error);\n if (!isBusy) {\n throw error;\n }\n if (attempt >= config.maxRetries) {\n break;\n }\n const delay = backoffDelay(attempt, config);\n onRetry?.(attempt + 1, delay, error);\n await sleep(delay);\n }\n }\n throw new StorageLockedError(\n `SQLite write lock could not be acquired after ${config.maxRetries} retries`,\n {\n cause: lastError instanceof Error ? lastError : undefined,\n reason: \"SQLITE_BUSY exhausted retries\",\n suggestion:\n \"Increase concurrency.maxRetries or concurrency.lockTimeoutMs, or consider the Postgres backend for high-concurrency multi-agent workloads.\",\n },\n );\n}\n","/**\n * Memory content normalization + hash for write-time dedupe.\n */\n\nimport { createHash } from \"node:crypto\";\n\n/**\n * Normalize memory content for exact-match dedupe:\n * 1. Unicode NFC\n * 2. Trim\n * 3. Collapse internal whitespace runs to a single space\n * 4. Do NOT case-fold\n *\n * @param text - Raw memory text.\n * @returns Normalized string used for hashing and comparison.\n */\nexport function normalizeMemoryContent(text: string): string {\n return text.normalize(\"NFC\").trim().replace(/\\s+/g, \" \");\n}\n\n/**\n * SHA-256 hash of normalized memory content for write-time exact dedupe.\n *\n * @param text - Raw memory text (normalized internally).\n */\nexport function hashMemoryContent(text: string): string {\n const normalized = normalizeMemoryContent(text);\n return createHash(\"sha256\").update(normalized, \"utf8\").digest(\"hex\");\n}\n\nexport type MemoryDedupeStrategy = \"exact\" | \"near\" | \"exact-or-near\";\n\nexport interface MemoryDedupeConfig {\n enabled?: boolean;\n strategy?: MemoryDedupeStrategy;\n /** Cosine similarity threshold for near-dup. Default 0.92 */\n nearThreshold?: number;\n /** Max vector candidates for near-dup. Default 8 */\n nearCandidateLimit?: number;\n}\n\nexport interface ResolvedMemoryDedupeConfig {\n enabled: boolean;\n strategy: MemoryDedupeStrategy;\n nearThreshold: number;\n nearCandidateLimit: number;\n}\n\n/** Default resolved dedupe settings when dedupe is disabled or omitted. */\nexport const DEFAULT_MEMORY_DEDUPE: ResolvedMemoryDedupeConfig = {\n enabled: false,\n strategy: \"exact-or-near\",\n nearThreshold: 0.92,\n nearCandidateLimit: 8,\n};\n\n/**\n * Resolve dedupe config from constructor options or per-call override.\n *\n * @param input - `true`/`false`, partial config, or `undefined` for defaults.\n */\nexport function resolveMemoryDedupeConfig(\n input?: boolean | MemoryDedupeConfig,\n): ResolvedMemoryDedupeConfig {\n if (input === undefined) {\n return { ...DEFAULT_MEMORY_DEDUPE };\n }\n if (typeof input === \"boolean\") {\n return { ...DEFAULT_MEMORY_DEDUPE, enabled: input };\n }\n return {\n enabled: input.enabled ?? true,\n strategy: input.strategy ?? DEFAULT_MEMORY_DEDUPE.strategy,\n nearThreshold: input.nearThreshold ?? DEFAULT_MEMORY_DEDUPE.nearThreshold,\n nearCandidateLimit:\n input.nearCandidateLimit ?? DEFAULT_MEMORY_DEDUPE.nearCandidateLimit,\n };\n}\n\n/**\n * Shallow-merge incoming metadata onto existing keys (incoming wins).\n *\n * @param existing - Stored metadata object.\n * @param incoming - New metadata from remember/update.\n */\nexport function mergeMemoryMetadata(\n existing: Record<string, unknown>,\n incoming: Record<string, unknown>,\n): Record<string, unknown> {\n return { ...existing, ...incoming };\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 { compileMetadataFilterToSql } from \"../../filters/sql-compile.js\";\nimport { WolbargLogger } from \"../../telemetry/logger.js\";\nimport {\n CREATE_BLOB_EMBEDDINGS_TABLE,\n CREATE_EMBEDDING_CACHE_TABLE,\n CREATE_FTS_TABLE,\n CREATE_HISTORY_TABLE,\n CREATE_INDEXES,\n CREATE_MEMORIES_TABLE,\n CREATE_META_TABLE,\n DROP_REDUNDANT_INDEXES_V4,\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\";\nimport {\n resolveConcurrencyConfig,\n type ConcurrencyConfig,\n type ResolvedConcurrencyConfig,\n} from \"../sqlite/concurrency-config.js\";\nimport { withImmediateTransaction } from \"../sqlite/transaction.js\";\nimport { hashMemoryContent } from \"../../memory/dedupe.js\";\n\n/** Hard cap when metadata cannot be fully pushed to SQL (prevents O(n) RAM blowups). */\nconst MAX_METADATA_SCAN = 50_000;\nconst METADATA_PAGE_SIZE = 500;\n/**\n * Multi-row INSERT chunk size. SQLite default bind limit is 999; 9 binds/row → 110.\n * Leave headroom for side-table multi-value inserts in the same transaction.\n */\nconst BATCH_INSERT_CHUNK = 96;\n/** Max ANN overfetch when post-filtering by org/agent/archived. */\nconst MAX_ANN_OVERFETCH = 8192;\n/** Coalesce concurrent single-row inserts (multi-writer throughput). */\nconst INSERT_COALESCE_THRESHOLD = 24;\nconst INSERT_COALESCE_MAX = 96;\n\nconst warnLogger = new WolbargLogger(\"warn\");\nlet warnedSqliteVecFallback = false;\nlet warnedFtsKeywordSearch = false;\n\ninterface PreparedStatements {\n getMeta: StatementSync;\n setMeta: StatementSync;\n insertMemory: StatementSync;\n updateMemoryContent: StatementSync;\n getMemoryById: StatementSync;\n getMemoryByRowid: StatementSync;\n findActiveByContentHash: 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 getStats: StatementSync;\n listRowidsForOrg: StatementSync;\n listRowidsForOrgAgent: StatementSync;\n vectorTableExists: StatementSync;\n blobTableExists: StatementSync;\n insertFts: StatementSync | null;\n deleteFts: StatementSync | null;\n deleteFtsByOrg: StatementSync | null;\n deleteFtsByOrgAgent: StatementSync | null;\n searchFts: StatementSync | null;\n deleteEmbeddingsByOrg: StatementSync | null;\n deleteEmbeddingsByOrgAgent: StatementSync | null;\n deleteEmbeddingsBlobByOrg: StatementSync | null;\n deleteEmbeddingsBlobByOrgAgent: StatementSync | null;\n}\n\nexport interface SqliteProviderOptions {\n /** Filesystem path or `:memory:` connection string. */\n connectionString: string;\n /** Optional write-lock tuning for concurrent async callers. */\n concurrency?: ConcurrencyConfig;\n}\n\n/**\n * SQLite + sqlite-vec {@link StorageProvider} (Node.js built-in `node:sqlite`).\n */\nexport class SqliteStorageProvider implements StorageProvider {\n readonly name = \"sqlite\";\n\n private readonly connectionString: string;\n private readonly concurrency: ResolvedConcurrencyConfig;\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 /** Tracks nesting depth for {@link withTransaction} so we can use savepoints. */\n private transactionDepth = 0;\n /** Incrementing counter for deterministic savepoint names. */\n private savepointCounter = 0;\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 private retryLog: ((msg: string) => void) | null = null;\n /** Cached prepared statements for `rowid IN (…)` lookups keyed by list length. */\n private rowidInStatements = new Map<number, StatementSync>();\n /** Cached list SQL statements keyed by clause shape. */\n private listStatements = new Map<string, StatementSync>();\n /** Cached multi-row insert statements keyed by row count. */\n private batchInsertStatements = new Map<number, StatementSync>();\n /** Cached multi-row history inserts keyed by row count. */\n private batchHistoryStatements = new Map<number, StatementSync>();\n /** Cached multi-row FTS inserts keyed by row count. */\n private batchFtsStatements = new Map<number, StatementSync>();\n /** Cached multi-row blob embedding inserts keyed by row count. */\n private batchBlobEmbStatements = new Map<number, StatementSync>();\n /** Coalesce concurrent insertMemory callers into one IMMEDIATE transaction. */\n private insertQueue: Array<{\n input: InsertMemoryInput;\n resolve: (row: MemoryRow) => void;\n reject: (err: unknown) => void;\n }> = [];\n private insertFlushScheduled = false;\n\n /**\n * @param options - SQLite path / `:memory:` and optional concurrency config.\n */\n constructor(options: SqliteProviderOptions) {\n this.connectionString = options.connectionString;\n this.concurrency = resolveConcurrencyConfig(options.concurrency);\n }\n\n /** Absolute or relative path / `:memory:` used by this provider. */\n get path(): string {\n return this.connectionString;\n }\n\n /** Expose DB for embedding cache store (same connection). */\n getDatabase(): DatabaseSync | null {\n return this.db;\n }\n\n /** Register a callback invoked when SQLite busy retries occur (tests / diagnostics). */\n setRetryLogger(fn: ((msg: string) => void) | null): void {\n this.retryLog = fn;\n }\n\n /** Open the database, run migrations, and prepare statements. */\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 = ${this.concurrency.lockTimeoutMs};\n PRAGMA temp_store = MEMORY;\n PRAGMA cache_size = -32768;\n PRAGMA mmap_size = 134217728;\n PRAGMA wal_autocheckpoint = 2000;\n PRAGMA recursive_triggers = OFF;\n `);\n\n this.sqliteVecLoaded = this.tryLoadSqliteVec(db);\n this.runMigrations(db);\n this.statements = this.prepareStatements(db);\n // FTS consistency check only on fresh / upgraded DBs (see runMigrations).\n // Re-scanning every warm open costs measurable ms for no benefit.\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 if (!warnedSqliteVecFallback) {\n warnedSqliteVecFallback = true;\n warnLogger.warn(\n \"sqlite-vec unavailable on this platform; using blob ANN fallback.\",\n );\n }\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 /** Drain pending inserts, optimize, and close the SQLite connection. */\n async close(): Promise<void> {\n // Drain coalesced inserts before tearing down the connection.\n const deadline = Date.now() + 2_000;\n while (this.insertQueue.length > 0 && Date.now() < deadline) {\n await this.flushInsertQueue();\n }\n if (!this.db) {\n return;\n }\n try {\n // Refresh query planner stats before close (cheap; measurable on large DBs).\n try {\n this.db.exec(\"PRAGMA optimize;\");\n } catch {\n // ignore — optimize is best-effort\n }\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 this.rowidInStatements.clear();\n this.listStatements.clear();\n this.batchInsertStatements.clear();\n this.batchHistoryStatements.clear();\n this.batchFtsStatements.clear();\n this.batchBlobEmbStatements.clear();\n }\n }\n\n /**\n * Create or validate vec0 / blob vector storage for the given dimensionality.\n *\n * @param dimensions - Embedding length from the configured model.\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 /** @inheritdoc StorageProvider.getEmbeddingDimensions */\n async getEmbeddingDimensions(): Promise<number | null> {\n return this.readMetaNumber(META_KEYS.embeddingDimensions);\n }\n\n /** @inheritdoc StorageProvider.setEmbeddingDimensions */\n async setEmbeddingDimensions(dimensions: number): Promise<void> {\n await this.setMeta(META_KEYS.embeddingDimensions, String(dimensions));\n this.vectorDimensions = dimensions;\n }\n\n /** Insert a single memory row (coalesced under concurrent writers). */\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n this.requireVectorReady();\n // Coalesce concurrent writers into one BEGIN IMMEDIATE + multi-row insert.\n // Without this, each remember() pays a full fsync-bound commit.\n return new Promise<MemoryRow>((resolve, reject) => {\n this.insertQueue.push({ input, resolve, reject });\n if (this.insertQueue.length >= INSERT_COALESCE_THRESHOLD) {\n this.insertFlushScheduled = false;\n void this.flushInsertQueue();\n return;\n }\n this.scheduleInsertFlush();\n });\n }\n\n private scheduleInsertFlush(): void {\n if (this.insertFlushScheduled) {\n return;\n }\n this.insertFlushScheduled = true;\n // setImmediate lets concurrent remember() callers join one IMMEDIATE tx.\n setImmediate(() => {\n this.insertFlushScheduled = false;\n void this.flushInsertQueue();\n });\n }\n\n private async flushInsertQueue(): Promise<void> {\n if (this.insertQueue.length === 0) {\n return;\n }\n const batch = this.insertQueue.splice(0, INSERT_COALESCE_MAX);\n try {\n if (batch.length === 1) {\n const row = await this.insertMemoryImmediate(batch[0]!.input);\n batch[0]!.resolve(row);\n } else {\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 }\n } catch (error) {\n for (const item of batch) {\n item.reject(error);\n }\n }\n if (this.insertQueue.length > 0) {\n void this.flushInsertQueue();\n }\n }\n\n /** Single-row insert without coalescing (used by flush of size 1). */\n private async insertMemoryImmediate(input: InsertMemoryInput): Promise<MemoryRow> {\n const stmts = this.requireStatements();\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\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 contentHash,\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 /** Batch insert memories in chunked multi-row transactions. */\n async insertMemoriesBatch(inputs: InsertMemoryInput[]): Promise<MemoryRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n this.requireVectorReady();\n\n return this.withTransaction(() => {\n const rows: MemoryRow[] = [];\n for (let offset = 0; offset < inputs.length; offset += BATCH_INSERT_CHUNK) {\n const chunk = inputs.slice(offset, offset + BATCH_INSERT_CHUNK);\n const inserted = this.insertMemoryChunk(chunk);\n rows.push(...inserted);\n }\n return rows;\n });\n }\n\n /** Update memory content, metadata, embedding, and content hash. */\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 const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : input.contentText !== undefined\n ? hashMemoryContent(input.contentText)\n : (existing.content_hash ?? null);\n\n stmts.updateMemoryContent.run(\n input.contentText ?? null,\n input.metadata !== undefined ? metadataJson : null,\n contentHash,\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 stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"updated\",\n null,\n input.updatedAt,\n );\n\n return stmts.getMemoryById.get(input.id, input.organization) as unknown as MemoryRow;\n });\n }\n\n /** Find an active memory by org, agent, and content hash (dedupe). */\n async findActiveByContentHash(\n organization: string,\n agent: string,\n contentHash: string,\n ): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n const row = stmts.findActiveByContentHash.get(\n organization,\n agent,\n contentHash,\n ) as unknown as MemoryRow | undefined;\n return row ?? null;\n }\n\n /** Scan memories matching metadata filters (may paginate in SQL). */\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 /** BM25 keyword search via FTS5 (`memories_fts`). */\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 if (!warnedFtsKeywordSearch) {\n warnedFtsKeywordSearch = true;\n warnLogger.warn(\n \"FTS keyword search is unavailable; returning empty keyword hits.\",\n );\n }\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 (error) {\n if (!warnedFtsKeywordSearch) {\n warnedFtsKeywordSearch = true;\n warnLogger.warn(\n \"FTS keyword search failed; returning empty keyword hits.\",\n {\n cause: error instanceof Error ? error.message : String(error),\n },\n );\n }\n return [];\n }\n }\n\n /** Fetch a memory row by UUID within an organization. */\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 /** Fetch a memory row by SQLite integer rowid within an organization. */\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 /** Batch-fetch memory rows by SQLite rowids within an organization. */\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 chunkSize = 400;\n for (let offset = 0; offset < rowids.length; offset += chunkSize) {\n const chunk = rowids.slice(offset, offset + chunkSize);\n const stmt = this.getRowidInStatement(chunk.length);\n const rows = stmt.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 /** List memories matching repository filters with optional limit. */\n async listMemories(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n try {\n if (filter.metadata) {\n return this.listMemoriesWithMetadata(filter, limit);\n }\n return this.listMemoriesIndexed(filter, limit);\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 /** Approximate nearest-neighbor search (vec0 or in-memory blob index). */\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 with adaptive overfetch.\n * Global ANN is post-filtered by org/agent/archived; underfill triggers larger k.\n */\n /** ANN search joined with memory rows and org/archived post-filters. */\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 (topK <= 0) {\n return [];\n }\n\n let fetchK = topK;\n const maxFetch = Math.min(Math.max(topK * 64, 512), MAX_ANN_OVERFETCH);\n let out: Array<{ row: MemoryRow; distance: number }> = [];\n\n while (true) {\n const hits = await this.searchVectors(embedding, fetchK);\n if (hits.length === 0) {\n return [];\n }\n const map = await this.getMemoriesByRowids(\n hits.map((h) => h.memoryRowid),\n organization,\n );\n out = [];\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 if (out.length >= topK) {\n return out;\n }\n }\n if (hits.length < fetchK) {\n break;\n }\n if (fetchK >= maxFetch) {\n break;\n }\n fetchK = Math.min(fetchK * 4, maxFetch);\n }\n return out;\n }\n\n /** Soft-archive memories (compression / forget paths). */\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 existing = stmts.getMemoryById.get(id, organization) as unknown as\n | MemoryRow\n | undefined;\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 from ANN + FTS so recall never resurfaces archived rows.\n if (existing?.rowid !== undefined) {\n this.deleteEmbedding(existing.rowid);\n }\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 /** Hard-delete a single memory by id; returns whether a row was removed. */\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 /** Hard-delete memories matching org / agent / metadata filters. */\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 this.deleteEmbeddingsForScope(filter.organization, agent);\n this.deleteFtsForScope(filter.organization, agent);\n const result = stmts.deleteMemoriesByOrgAgent.run(\n filter.organization,\n agent,\n );\n return Number(result.changes);\n });\n }\n\n /** Remove all memories (and side tables) for an organization. */\n async clearOrganization(organization: string): Promise<number> {\n const stmts = this.requireStatements();\n\n return this.withTransaction(() => {\n this.deleteEmbeddingsForScope(organization);\n this.deleteFtsForScope(organization);\n const result = stmts.deleteMemoriesByOrg.run(organization);\n // Remove orphaned blob rows (memories may already be empty).\n try {\n this.requireDb().exec(`\n DELETE FROM memory_embeddings_blob\n WHERE memory_rowid NOT IN (SELECT rowid FROM memories)\n `);\n } catch {\n // ignore if blob table missing\n }\n return Number(result.changes);\n });\n }\n\n /** List audit history events for a memory id. */\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 /** Append a history row (created / archived / compressed / updated). */\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 /** Aggregate memory counts for an organization (single-pass SQL). */\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 row = stmts.getStats.get(organization) as unknown as {\n total: number | bigint;\n active: number | bigint;\n archived: number | bigint;\n agents: number | bigint;\n };\n return {\n totalMemories: Number(row.total),\n activeMemories: Number(row.active),\n archivedMemories: Number(row.archived),\n totalAgents: Number(row.agents),\n };\n }\n\n /** On-disk database file size in bytes (0 for `:memory:`). */\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 async withTransaction<T>(fn: () => T | Promise<T>): Promise<T> {\n const db = this.requireDb();\n // Nested writes can happen (e.g. compress() wrapping storage.withTransaction()\n // while provider methods also use withTransaction internally).\n // SQLite forbids BEGIN/COMMIT inside a transaction, so we use SAVEPOINTs.\n if (this.transactionDepth > 0) {\n const savepointName = `wolbarg_sp_${this.savepointCounter++}`;\n db.exec(`SAVEPOINT ${savepointName}`);\n try {\n this.transactionDepth += 1;\n const result = await fn();\n db.exec(`RELEASE SAVEPOINT ${savepointName}`);\n return result;\n } catch (error) {\n try {\n db.exec(`ROLLBACK TO SAVEPOINT ${savepointName}`);\n } catch {\n // ignore rollback-to-savepoint failures; original error is more important\n }\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n this.transactionDepth = 1;\n try {\n return await withImmediateTransaction(\n db,\n this.concurrency,\n fn,\n (attempt, delayMs) => {\n this.retryLog?.(\n `SQLITE_BUSY retry attempt=${attempt} backoffMs=${Math.round(delayMs)}`,\n );\n },\n );\n } finally {\n this.transactionDepth = 0;\n }\n }\n\n // ─── internals ───────────────────────────────────────────────────────────\n\n private tryLoadSqliteVec(db: DatabaseSync): boolean {\n // win32-arm64 (and similar) cannot load sqlite-vec — skip the failed\n // load attempt on every open (saves cold-start ms).\n const plat = `${process.platform}-${process.arch}`;\n if (SqliteStorageProvider.sqliteVecUnsupported.has(plat)) {\n return false;\n }\n try {\n sqliteVec.load(db);\n return true;\n } catch {\n SqliteStorageProvider.sqliteVecUnsupported.add(plat);\n return false;\n }\n }\n\n private static sqliteVecUnsupported = new Set<string>();\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 db.exec(CREATE_EMBEDDING_CACHE_TABLE);\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 this.migrateToV3(db);\n for (const dropSql of DROP_REDUNDANT_INDEXES_V4) {\n db.exec(dropSql);\n }\n for (const indexSql of CREATE_INDEXES) {\n db.exec(indexSql);\n }\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n this.ensureFtsConsistency(db);\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 if (current < 3) {\n db.exec(CREATE_FTS_TABLE);\n this.backfillFts(db);\n this.migrateToV3(db);\n }\n if (current < 4) {\n this.migrateToV4(db);\n }\n for (const indexSql of CREATE_INDEXES) {\n db.exec(indexSql);\n }\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n this.ensureFtsConsistency(db);\n }\n // current === SCHEMA_VERSION: skip index churn and FTS rescans (warm-start path).\n }\n\n /**\n * Schema v4: drop unused global created_at index, strip archived vectors\n * from ANN, add agent-active covering index (via CREATE_INDEXES).\n */\n private migrateToV4(db: DatabaseSync): void {\n for (const dropSql of DROP_REDUNDANT_INDEXES_V4) {\n db.exec(dropSql);\n }\n\n // Archived memories must not remain in ANN (recall post-filter waste).\n try {\n db.prepare(SQL.deleteArchivedEmbeddings).run();\n } catch {\n // vec table may not exist yet\n }\n try {\n db.prepare(SQL.deleteArchivedEmbeddingsBlob).run();\n } catch {\n // ignore\n }\n this.memoryIndexDirty = true;\n }\n\n /**\n * Schema v3: content_hash column, history 'updated' event, embedding_cache.\n * SQLite cannot ALTER CHECK constraints — rebuild memory_history when needed.\n */\n private migrateToV3(db: DatabaseSync): void {\n // Add content_hash if missing\n const cols = db\n .prepare(`PRAGMA table_info(memories)`)\n .all() as unknown as Array<{ name: string }>;\n const hasHash = cols.some((c) => c.name === \"content_hash\");\n if (!hasHash) {\n db.exec(`ALTER TABLE memories ADD COLUMN content_hash TEXT`);\n }\n\n // Backfill content_hash for active rows (newest wins on collision via unique index)\n const active = db\n .prepare(\n `SELECT id, content_text, updated_at FROM memories WHERE archived = 0 ORDER BY updated_at DESC`,\n )\n .all() as unknown as Array<{\n id: string;\n content_text: string;\n updated_at: string;\n }>;\n const seen = new Set<string>();\n const updateHash = db.prepare(\n `UPDATE memories SET content_hash = ? WHERE id = ?`,\n );\n for (const row of active) {\n const hash = hashMemoryContent(row.content_text);\n // Scope uniqueness is (org, agent, hash) — we only have id here; full\n // uniqueness is enforced after org/agent-aware backfill below.\n updateHash.run(hash, row.id);\n }\n\n // Re-backfill with org+agent awareness: null out older duplicates\n const activeFull = db\n .prepare(\n `SELECT id, organization, agent, content_text, updated_at\n FROM memories WHERE archived = 0\n ORDER BY updated_at DESC`,\n )\n .all() as unknown as Array<{\n id: string;\n organization: string;\n agent: string;\n content_text: string;\n updated_at: string;\n }>;\n seen.clear();\n const clearHash = db.prepare(\n `UPDATE memories SET content_hash = NULL WHERE id = ?`,\n );\n const setHash = db.prepare(\n `UPDATE memories SET content_hash = ? WHERE id = ?`,\n );\n for (const row of activeFull) {\n const hash = hashMemoryContent(row.content_text);\n const key = `${row.organization}\\0${row.agent}\\0${hash}`;\n if (seen.has(key)) {\n clearHash.run(row.id);\n } else {\n seen.add(key);\n setHash.run(hash, row.id);\n }\n }\n\n // Rebuild history table to allow 'updated' in CHECK\n this.migrateHistoryAllowUpdated(db);\n db.exec(CREATE_EMBEDDING_CACHE_TABLE);\n }\n\n private migrateHistoryAllowUpdated(db: DatabaseSync): void {\n const sql = db\n .prepare(\n `SELECT sql FROM sqlite_master WHERE type='table' AND name='memory_history'`,\n )\n .get() as { sql?: string } | undefined;\n if (sql?.sql?.includes(\"'updated'\")) {\n return;\n }\n db.exec(`\n CREATE TABLE IF NOT EXISTS memory_history_v3 (\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', 'updated')),\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 INSERT INTO memory_history_v3 (id, memory_id, event_type, related_memory_id, created_at)\n SELECT id, memory_id, event_type, related_memory_id, created_at FROM memory_history;\n DROP TABLE memory_history;\n ALTER TABLE memory_history_v3 RENAME TO memory_history;\n CREATE INDEX IF NOT EXISTS idx_history_memory_id ON memory_history(memory_id);\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 deleteFtsByOrg: StatementSync | null = null;\n let deleteFtsByOrgAgent: StatementSync | null = null;\n let searchFts: StatementSync | null = null;\n try {\n insertFts = db.prepare(SQL.insertFts);\n deleteFts = db.prepare(SQL.deleteFts);\n deleteFtsByOrg = db.prepare(SQL.deleteFtsByOrg);\n deleteFtsByOrgAgent = db.prepare(SQL.deleteFtsByOrgAgent);\n searchFts = db.prepare(SQL.searchFts);\n } catch {\n // FTS optional\n }\n\n let deleteEmbeddingsByOrg: StatementSync | null = null;\n let deleteEmbeddingsByOrgAgent: StatementSync | null = null;\n let deleteEmbeddingsBlobByOrg: StatementSync | null = null;\n let deleteEmbeddingsBlobByOrgAgent: StatementSync | null = null;\n try {\n deleteEmbeddingsByOrg = db.prepare(SQL.deleteEmbeddingsByOrg);\n deleteEmbeddingsByOrgAgent = db.prepare(SQL.deleteEmbeddingsByOrgAgent);\n } catch {\n // vec table may not exist yet\n }\n try {\n deleteEmbeddingsBlobByOrg = db.prepare(SQL.deleteEmbeddingsBlobByOrg);\n deleteEmbeddingsBlobByOrgAgent = db.prepare(\n SQL.deleteEmbeddingsBlobByOrgAgent,\n );\n } catch {\n // ignore\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 findActiveByContentHash: db.prepare(SQL.findActiveByContentHash),\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 getStats: db.prepare(SQL.getStats),\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 deleteFtsByOrg,\n deleteFtsByOrgAgent,\n searchFts,\n deleteEmbeddingsByOrg,\n deleteEmbeddingsByOrgAgent,\n deleteEmbeddingsBlobByOrg,\n deleteEmbeddingsBlobByOrgAgent,\n };\n }\n\n private listMemoriesIndexed(\n filter: RepositoryFilter,\n limit?: number,\n ): MemoryRow[] {\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 key = `${filter.agent ? \"a\" : \"_\"}:${filter.includeArchived ? \"A\" : \"0\"}:${limit !== undefined ? \"L\" : \"_\"}`;\n let stmt = this.listStatements.get(key);\n if (!stmt) {\n let sql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n `;\n if (limit !== undefined) {\n sql += ` LIMIT ?`;\n }\n stmt = this.requireDb().prepare(sql);\n this.listStatements.set(key, stmt);\n }\n if (limit !== undefined) {\n return stmt.all(...params, limit) as unknown as MemoryRow[];\n }\n return stmt.all(...params) as unknown as MemoryRow[];\n }\n\n /**\n * Metadata-filtered list: push filters to json_extract when possible;\n * otherwise page with a hard scan cap (never load unbounded orgs into RAM).\n */\n private listMemoriesWithMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): MemoryRow[] {\n const want = limit ?? MAX_METADATA_SCAN;\n const compiled = filter.metadata\n ? compileMetadataFilterToSql(filter.metadata)\n : null;\n\n if (compiled) {\n const clauses: string[] = [`organization = ?`, `(${compiled.expression})`];\n const params: unknown[] = [filter.organization, ...compiled.params];\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, content_hash, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n LIMIT ?\n `;\n params.push(want);\n return this.requireDb()\n .prepare(sql)\n .all(...(params as never[])) as unknown as MemoryRow[];\n }\n\n // Fallback: paged JS filter with hard scan ceiling.\n const matched: MemoryRow[] = [];\n let offset = 0;\n const db = this.requireDb();\n const clauses: string[] = [`organization = ?`];\n const baseParams: Array<string | number> = [filter.organization];\n if (filter.agent) {\n clauses.push(`agent = ?`);\n baseParams.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = 0`);\n }\n const pageSql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n LIMIT ? OFFSET ?\n `;\n const pageStmt = db.prepare(pageSql);\n while (matched.length < want && offset < MAX_METADATA_SCAN) {\n const pageLimit = Math.min(METADATA_PAGE_SIZE, MAX_METADATA_SCAN - offset);\n const page = pageStmt.all(\n ...baseParams,\n pageLimit,\n offset,\n ) as unknown as MemoryRow[];\n if (page.length === 0) {\n break;\n }\n for (const row of page) {\n if (\n matchesMetadata(\n deserializeMetadata(row.metadata_json),\n filter.metadata!,\n )\n ) {\n matched.push(row);\n if (matched.length >= want) {\n return matched;\n }\n }\n }\n offset += page.length;\n if (page.length < pageLimit) {\n break;\n }\n }\n return matched;\n }\n\n private getRowidInStatement(count: number): StatementSync {\n let stmt = this.rowidInStatements.get(count);\n if (!stmt) {\n const placeholders = Array.from({ length: count }, () => \"?\").join(\",\");\n const sql = `${SQL.getMemoriesByRowidsPrefix}${placeholders})`;\n stmt = this.requireDb().prepare(sql);\n this.rowidInStatements.set(count, stmt);\n }\n return stmt;\n }\n\n private insertMemoryChunk(inputs: InsertMemoryInput[]): MemoryRow[] {\n const stmts = this.requireStatements();\n const n = inputs.length;\n if (n === 1) {\n const input = inputs[0]!;\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n const row = stmts.insertMemory.get(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n contentHash,\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 this.insertEmbedding(row.rowid, input.embedding);\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n return [row];\n }\n\n let stmt = this.batchInsertStatements.get(n);\n if (!stmt) {\n const valueRow =\n \"(?, ?, ?, ?, ?, 0, NULL, ?, ?, ?)\";\n const values = Array.from({ length: n }, () => valueRow).join(\", \");\n const sql = `\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n ) VALUES ${values}\n RETURNING rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n `;\n stmt = this.requireDb().prepare(sql);\n this.batchInsertStatements.set(n, stmt);\n }\n\n const binds: unknown[] = [];\n for (const input of inputs) {\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n binds.push(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n contentHash,\n input.createdAt,\n input.updatedAt,\n );\n }\n\n const rows = stmt.all(...(binds as never[])) as unknown as MemoryRow[];\n if (rows.length !== n) {\n throw new DatabaseError(\"Failed to read memories after batch insert\");\n }\n for (const row of rows) {\n if (row.rowid === undefined) {\n throw new DatabaseError(\"Failed to read memory rowid after batch insert\");\n }\n }\n\n // Multi-row side tables — one statement each instead of 3N run() calls.\n this.insertEmbeddingsBatch(rows, inputs);\n this.insertFtsBatch(inputs);\n this.insertHistoryBatch(inputs);\n return rows;\n }\n\n private insertEmbeddingsBatch(\n rows: MemoryRow[],\n inputs: InsertMemoryInput[],\n ): void {\n const n = rows.length;\n if (this.vectorBackend === \"sqlite-vec\") {\n for (let i = 0; i < n; i += 1) {\n this.insertEmbedding(rows[i]!.rowid!, inputs[i]!.embedding);\n }\n return;\n }\n // Blob backend: multi-value INSERT + incremental in-memory index upsert.\n let stmt = this.batchBlobEmbStatements.get(n);\n if (!stmt) {\n const values = Array.from({ length: n }, () => \"(?, ?)\").join(\", \");\n stmt = this.requireDb().prepare(\n `INSERT OR REPLACE INTO memory_embeddings_blob (memory_rowid, embedding) VALUES ${values}`,\n );\n this.batchBlobEmbStatements.set(n, stmt);\n }\n const binds: unknown[] = [];\n for (let i = 0; i < n; i += 1) {\n binds.push(rows[i]!.rowid!, embeddingToBuffer(inputs[i]!.embedding));\n }\n stmt.run(...(binds as never[]));\n if (this.memoryIndex && this.vectorDimensions !== null) {\n for (let i = 0; i < n; i += 1) {\n this.memoryIndex.upsert(rows[i]!.rowid!, inputs[i]!.embedding);\n }\n this.memoryIndexDirty = false;\n } else {\n this.memoryIndexDirty = true;\n }\n }\n\n private insertFtsBatch(inputs: InsertMemoryInput[]): void {\n const stmts = this.requireStatements();\n if (!stmts.insertFts) {\n return;\n }\n const n = inputs.length;\n let stmt = this.batchFtsStatements.get(n);\n if (!stmt) {\n const values = Array.from({ length: n }, () => \"(?, ?, ?, ?)\").join(\", \");\n stmt = this.requireDb().prepare(\n `INSERT INTO memories_fts (content_text, memory_id, organization, agent) VALUES ${values}`,\n );\n this.batchFtsStatements.set(n, stmt);\n }\n const binds: unknown[] = [];\n for (const input of inputs) {\n binds.push(\n input.contentText,\n input.id,\n input.organization,\n input.agent,\n );\n }\n try {\n stmt.run(...(binds as never[]));\n } catch {\n // Fall back to per-row if FTS shape differs.\n for (const input of inputs) {\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n }\n }\n }\n\n private insertHistoryBatch(inputs: InsertMemoryInput[]): void {\n const n = inputs.length;\n let stmt = this.batchHistoryStatements.get(n);\n if (!stmt) {\n const values = Array.from({ length: n }, () => \"(?, ?, ?, ?, ?)\").join(\n \", \",\n );\n stmt = this.requireDb().prepare(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ${values}`,\n );\n this.batchHistoryStatements.set(n, stmt);\n }\n const binds: unknown[] = [];\n for (const input of inputs) {\n binds.push(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n }\n stmt.run(...(binds as never[]));\n }\n\n private deleteEmbeddingsForScope(\n organization: string,\n agent?: string,\n ): void {\n const stmts = this.requireStatements();\n try {\n if (this.vectorBackend === \"sqlite-vec\") {\n if (agent) {\n stmts.deleteEmbeddingsByOrgAgent?.run(organization, agent);\n } else {\n stmts.deleteEmbeddingsByOrg?.run(organization);\n }\n } else {\n if (agent) {\n stmts.deleteEmbeddingsBlobByOrgAgent?.run(organization, agent);\n } else {\n stmts.deleteEmbeddingsBlobByOrg?.run(organization);\n }\n this.memoryIndexDirty = true;\n if (!agent) {\n this.memoryIndex?.clear();\n }\n }\n } catch {\n // Vector table may not exist yet on a fresh DB.\n }\n }\n\n private deleteFtsForScope(organization: string, agent?: string): void {\n const stmts = this.requireStatements();\n try {\n if (agent) {\n stmts.deleteFtsByOrgAgent?.run(organization, agent);\n } else {\n stmts.deleteFtsByOrg?.run(organization);\n }\n } catch {\n // FTS optional\n }\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 try {\n stmts.deleteEmbeddingsByOrg = db.prepare(SQL.deleteEmbeddingsByOrg);\n stmts.deleteEmbeddingsByOrgAgent = db.prepare(\n SQL.deleteEmbeddingsByOrgAgent,\n );\n } catch {\n // ignore\n }\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 try {\n stmts.deleteEmbeddingsBlobByOrg = db.prepare(SQL.deleteEmbeddingsBlobByOrg);\n stmts.deleteEmbeddingsBlobByOrgAgent = db.prepare(\n SQL.deleteEmbeddingsBlobByOrgAgent,\n );\n } catch {\n // ignore\n }\n }\n\n private insertEmbedding(rowid: number | bigint, embedding: Float32Array): void {\n const stmts = this.requireStatements();\n if (this.vectorBackend === \"sqlite-vec\") {\n // node:sqlite + sqlite-vec require BigInt for vec0 integer PKs (esp. Linux).\n stmts.insertEmbedding!.run(this.toVecRowid(rowid), this.toVectorParam(embedding));\n return;\n }\n const id = Number(rowid);\n stmts.insertEmbeddingBlob!.run(id, embeddingToBuffer(embedding));\n // Keep the hot in-memory ANN index incremental — avoid O(n) rebuilds.\n if (this.memoryIndex) {\n this.memoryIndex.upsert(id, embedding);\n this.memoryIndexDirty = false;\n } else {\n this.memoryIndexDirty = true;\n }\n }\n\n private deleteEmbedding(rowid: number | bigint): void {\n const stmts = this.requireStatements();\n try {\n if (this.vectorBackend === \"sqlite-vec\" && stmts.deleteEmbedding) {\n stmts.deleteEmbedding.run(this.toVecRowid(rowid));\n } else if (stmts.deleteEmbeddingBlob) {\n const id = Number(rowid);\n stmts.deleteEmbeddingBlob.run(id);\n this.memoryIndex?.remove(id);\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: Number(row.memory_rowid),\n distance: Number(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 /** sqlite-vec vec0 PKs must be bound as BigInt under node:sqlite. */\n private toVecRowid(rowid: number | bigint): bigint {\n return typeof rowid === \"bigint\" ? rowid : BigInt(rowid);\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 * Compile MetadataFilter ASTs into PostgreSQL JSONB predicates.\n * Returns null when the filter cannot be pushed down safely.\n */\n\nimport type { MetadataComparison, MetadataFilter } from \"./types.js\";\nimport type { CompiledMetadataSql } from \"./sql-compile.js\";\n\nconst FIELD_RE =\n /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\n\n/** Safe identifier path → JSONB text extract expression (no bind params). */\nfunction jsonbTextExtract(field: string): string | null {\n if (!FIELD_RE.test(field)) {\n return null;\n }\n const parts = field.split(\".\");\n if (parts.length === 1) {\n return `metadata_json->>'${parts[0]}'`;\n }\n const path = parts.join(\",\");\n return `metadata_json #>> '{${path}}'`;\n}\n\nfunction jsonbContainment(\n field: string,\n value: string | number | boolean | null,\n paramIndex: number,\n): CompiledMetadataSql | null {\n if (!FIELD_RE.test(field)) {\n return null;\n }\n const parts = field.split(\".\");\n let obj: unknown = value;\n for (let i = parts.length - 1; i >= 0; i -= 1) {\n obj = { [parts[i]!]: obj };\n }\n return {\n expression: `metadata_json @> $${paramIndex}::jsonb`,\n params: [JSON.stringify(obj)],\n };\n}\n\nfunction compileComparison(\n field: string,\n op: MetadataComparison,\n startIndex: number,\n): CompiledMetadataSql | null {\n if (\"eq\" in op) {\n const value = op.eq;\n if (\n value !== null &&\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n return null;\n }\n return jsonbContainment(field, value, startIndex);\n }\n\n const extract = jsonbTextExtract(field);\n if (!extract) {\n return null;\n }\n\n if (\"contains\" in op) {\n return {\n expression: `${extract} LIKE '%' || $${startIndex} || '%'`,\n params: [op.contains],\n };\n }\n if (\"gt\" in op) {\n return {\n expression: `(${extract})::numeric > $${startIndex}`,\n params: [op.gt],\n };\n }\n if (\"gte\" in op) {\n return {\n expression: `(${extract})::numeric >= $${startIndex}`,\n params: [op.gte],\n };\n }\n if (\"lt\" in op) {\n return {\n expression: `(${extract})::numeric < $${startIndex}`,\n params: [op.lt],\n };\n }\n if (\"lte\" in op) {\n return {\n expression: `(${extract})::numeric <= $${startIndex}`,\n params: [op.lte],\n };\n }\n if (\"between\" in op) {\n const [lo, hi] = op.between;\n return {\n expression: `(${extract})::numeric >= $${startIndex} AND (${extract})::numeric <= $${startIndex + 1}`,\n params: [lo, hi],\n };\n }\n return null;\n}\n\nfunction compileInner(\n filter: MetadataFilter,\n startIndex: number,\n): CompiledMetadataSql | null {\n if (\"and\" in filter) {\n if (filter.and.length === 0) {\n return { expression: \"TRUE\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n let idx = startIndex;\n for (const child of filter.and) {\n const compiled = compileInner(child, idx);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n idx += compiled.params.length;\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" AND \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"or\" in filter) {\n if (filter.or.length === 0) {\n return { expression: \"FALSE\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n let idx = startIndex;\n for (const child of filter.or) {\n const compiled = compileInner(child, idx);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n idx += compiled.params.length;\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" OR \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"not\" in filter) {\n const inner = compileInner(filter.not, startIndex);\n if (!inner) {\n return null;\n }\n return {\n expression: `NOT (${inner.expression})`,\n params: inner.params,\n };\n }\n return compileComparison(filter.field, filter.op, startIndex);\n}\n\n/**\n * Push a metadata filter into PostgreSQL JSONB predicates, or `null` if unsupported.\n * Parameter placeholders are `$N` starting at `startIndex` (default `1`).\n *\n * @param filter - Metadata filter AST.\n * @param startIndex - First `$N` index for bound parameters.\n */\nexport function compileMetadataFilterToPostgres(\n filter: MetadataFilter,\n startIndex = 1,\n): CompiledMetadataSql | null {\n return compileInner(filter, startIndex);\n}\n","/**\n * Postgres LISTEN/NOTIFY backend for cross-process subscribe().\n *\n * Uses a dedicated connection (not the pool). Payload is IDs + metadata only.\n */\n\nimport type { Pool, PoolClient } from \"pg\";\nimport type {\n MemoryChangeCallback,\n MemoryChangeEvent,\n SubscribeBackend,\n SubscribeFilter,\n SubscribableEvent,\n Unsubscribe,\n} from \"./types.js\";\n\n/** Postgres `LISTEN` channel name for cross-process memory change events. */\nexport const WOLBARG_NOTIFY_CHANNEL = \"wolbarg_events\";\n\ninterface Subscription {\n filter: SubscribeFilter;\n callback: MemoryChangeCallback;\n}\n\nfunction matchesFilter(\n filter: SubscribeFilter,\n event: MemoryChangeEvent,\n): boolean {\n if (filter.organization !== event.organization) {\n return false;\n }\n if (filter.agent !== undefined && filter.agent !== event.agent) {\n return false;\n }\n if (filter.event === undefined) {\n return true;\n }\n const events = Array.isArray(filter.event) ? filter.event : [filter.event];\n return events.some(\n (e: SubscribableEvent) => e === \"*\" || e === event.event,\n );\n}\n\n/**\n * Serialize a {@link MemoryChangeEvent} for `pg_notify` (≤ ~7900 bytes).\n *\n * @param event - Change event emitted after a memory write.\n */\nexport function serializeNotifyPayload(event: MemoryChangeEvent): string {\n const payload = JSON.stringify({\n event: event.event,\n organization: event.organization,\n agent: event.agent,\n memoryId: event.memoryId,\n timestamp: event.timestamp,\n traceId: event.traceId,\n sessionId: event.sessionId,\n upsertAction: event.upsertAction,\n });\n if (payload.length > 7900) {\n // Hard Postgres NOTIFY limit is 8000 bytes — drop optional fields.\n return JSON.stringify({\n event: event.event,\n organization: event.organization,\n agent: event.agent,\n memoryId: Array.isArray(event.memoryId)\n ? event.memoryId.slice(0, 20)\n : event.memoryId,\n timestamp: event.timestamp,\n });\n }\n return payload;\n}\n\n/**\n * Parse a NOTIFY payload back into a {@link MemoryChangeEvent}.\n *\n * @param raw - JSON string from `pg_notify`.\n * @returns Parsed event or `null` when invalid.\n */\nexport function parseNotifyPayload(raw: string): MemoryChangeEvent | null {\n try {\n const parsed = JSON.parse(raw) as MemoryChangeEvent;\n if (\n !parsed ||\n typeof parsed.event !== \"string\" ||\n typeof parsed.organization !== \"string\" ||\n typeof parsed.agent !== \"string\" ||\n typeof parsed.timestamp !== \"string\"\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport interface PostgresListenerOptions {\n /** Factory that returns a dedicated client (not from the write pool). */\n connect: () => Promise<PoolClient>;\n /** Optional reconnect delay in ms. Default 1000. */\n reconnectDelayMs?: number;\n onError?: (error: unknown) => void;\n}\n\n/** Cross-process {@link SubscribeBackend} using Postgres LISTEN/NOTIFY. */\nexport class PostgresSubscribeListener implements SubscribeBackend {\n private readonly subscriptions = new Map<number, Subscription>();\n private nextId = 1;\n private client: PoolClient | null = null;\n private closed = false;\n private reconnecting = false;\n private listenInFlight: Promise<void> | null = null;\n private readonly reconnectDelayMs: number;\n private readonly connect: () => Promise<PoolClient>;\n private readonly onError?: (error: unknown) => void;\n\n /**\n * @param options.connect - Factory returning a dedicated LISTEN client.\n * @param options.reconnectDelayMs - Delay before reconnect attempts (default 1000).\n * @param options.onError - Optional error hook for connection failures.\n */\n constructor(options: PostgresListenerOptions) {\n this.connect = options.connect;\n this.reconnectDelayMs = options.reconnectDelayMs ?? 1000;\n this.onError = options.onError;\n }\n\n /** Open the LISTEN connection (lazy — also started on first subscribe). */\n async start(): Promise<void> {\n if (this.closed) {\n return;\n }\n await this.ensureListening();\n }\n\n private async ensureListening(): Promise<void> {\n if (this.client || this.closed) {\n return;\n }\n if (this.listenInFlight) {\n await this.listenInFlight;\n return;\n }\n this.listenInFlight = this.openListenConnection();\n try {\n await this.listenInFlight;\n } finally {\n this.listenInFlight = null;\n }\n }\n\n private async openListenConnection(): Promise<void> {\n if (this.client || this.closed) {\n return;\n }\n const client = await this.connect();\n if (this.closed) {\n try {\n client.release(true);\n } catch {\n // ignore\n }\n return;\n }\n this.client = client;\n client.on(\"notification\", (msg) => {\n if (msg.channel !== WOLBARG_NOTIFY_CHANNEL || !msg.payload) {\n return;\n }\n const event = parseNotifyPayload(msg.payload);\n if (!event) {\n return;\n }\n this.dispatch(event);\n });\n client.on(\"error\", (error) => {\n this.onError?.(error);\n void this.handleDisconnect();\n });\n client.on(\"end\", () => {\n void this.handleDisconnect();\n });\n await client.query(`LISTEN ${WOLBARG_NOTIFY_CHANNEL}`);\n }\n\n private async handleDisconnect(): Promise<void> {\n if (this.closed || this.reconnecting) {\n return;\n }\n this.reconnecting = true;\n const prev = this.client;\n this.client = null;\n if (prev) {\n try {\n prev.release(true);\n } catch {\n // ignore\n }\n }\n try {\n await new Promise((r) => setTimeout(r, this.reconnectDelayMs));\n if (!this.closed) {\n await this.ensureListening();\n }\n } catch (error) {\n this.onError?.(error);\n this.reconnecting = false;\n if (!this.closed) {\n void this.handleDisconnect();\n }\n return;\n }\n this.reconnecting = false;\n }\n\n private dispatch(event: MemoryChangeEvent): void {\n for (const sub of this.subscriptions.values()) {\n if (!matchesFilter(sub.filter, event)) {\n continue;\n }\n try {\n sub.callback(event);\n } catch (error) {\n console.error(\n \"[wolbarg] subscribe callback error:\",\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n\n /**\n * Register a filtered callback for memory change events.\n *\n * @param filter - Organization / agent / event-type filter.\n * @param callback - Invoked synchronously on each matching NOTIFY.\n * @returns Unsubscribe function.\n */\n subscribe(\n filter: SubscribeFilter,\n callback: MemoryChangeCallback,\n ): Unsubscribe {\n if (this.closed) {\n throw new Error(\"Subscribe backend is closed\");\n }\n const id = this.nextId++;\n this.subscriptions.set(id, { filter, callback });\n void this.ensureListening();\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /** True when at least one subscribe() callback is registered. */\n hasSubscribers(): boolean {\n return this.subscriptions.size > 0;\n }\n\n /**\n * Local emit is a no-op for Postgres — writers use NOTIFY in-transaction.\n * Kept so the shared SubscribeBackend interface is uniform.\n */\n emit(_event: MemoryChangeEvent): void {\n // Cross-process delivery happens via NOTIFY from the storage layer.\n }\n\n /** Tear down LISTEN connection and clear subscriptions. */\n async close(): Promise<void> {\n this.closed = true;\n this.subscriptions.clear();\n const pending = this.listenInFlight;\n if (pending) {\n await pending.catch(() => undefined);\n }\n const client = this.client;\n this.client = null;\n if (!client) {\n return;\n }\n // Destroy the pooled LISTEN client — UNLISTEN+release can hang while the\n // connection sits in ClientRead waiting for notifications.\n try {\n client.release(true);\n } catch {\n try {\n (client as { end?: () => Promise<void> }).end?.();\n } catch {\n // ignore\n }\n }\n }\n}\n\n/** Issue NOTIFY inside an already-open transaction client. */\nexport async function notifyMemoryChange(\n client: { query: (sql: string, params?: unknown[]) => Promise<unknown> },\n event: MemoryChangeEvent,\n): Promise<void> {\n const payload = serializeNotifyPayload(event);\n await client.query(`SELECT pg_notify($1, $2)`, [\n WOLBARG_NOTIFY_CHANNEL,\n payload,\n ]);\n}\n\n/**\n * Build a {@link PostgresSubscribeListener} from an existing `pg` Pool.\n *\n * @param pool - Postgres connection pool (uses `pool.connect()` for LISTEN).\n * @param onError - Optional connection error callback.\n */\nexport function createPostgresListenerFromPool(\n pool: Pool,\n onError?: (error: unknown) => void,\n): PostgresSubscribeListener {\n return new PostgresSubscribeListener({\n connect: () => pool.connect(),\n onError,\n });\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\n * - float4[] vector bind (no text \"[f,f,…]\" parse tax)\n * - Org/agent/archived denormalized on embeddings for filtered ANN\n * - Large bulk inserts via sequential fat unnest (COPY-class amortization)\n * - JSONB metadata filter pushdown\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { DatabaseError, InitializationError, ConfigurationError } from \"../../errors/index.js\";\nimport { matchesMetadata } from \"../../filters/match.js\";\nimport { compileMetadataFilterToPostgres } from \"../../filters/sql-compile-postgres.js\";\nimport { SCHEMA_VERSION, META_KEYS } from \"../../schema/index.js\";\nimport { WolbargLogger } from \"../../telemetry/logger.js\";\nimport {\n deserializeMetadata,\n serializeMetadata,\n} from \"../../utils/index.js\";\nimport { cosineDistance } from \"../../utils/vector.js\";\nimport { hashMemoryContent } from \"../../memory/dedupe.js\";\nimport { notifyMemoryChange } from \"../../subscribe/postgres-listener.js\";\nimport type { MemoryChangeEvent } from \"../../subscribe/types.js\";\nimport type {\n HistoryRow,\n InsertMemoryInput,\n MemoryRow,\n RepositoryFilter,\n StorageProvider,\n UpdateMemoryInput,\n VectorSearchHit,\n} from \"../types.js\";\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 on?: (event: \"connect\", listener: (client: PgPoolClient) => void) => void;\n totalCount?: number;\n idleCount?: number;\n waitingCount?: number;\n};\n\nexport interface PostgresProviderOptions {\n connectionString: string;\n maxPoolSize?: number;\n /**\n * When false, uses `synchronous_commit=off` on every pool connection.\n * Much higher write throughput; recent commits can be lost on OS crash.\n * Default true (full durability).\n */\n durableWrites?: boolean;\n}\n\nconst txStore = new AsyncLocalStorage<PgPoolClient>();\n\nconst warnLogger = new WolbargLogger(\"warn\");\nlet warnedPgvectorFallback = false;\nlet warnedFtsKeywordSearch = false;\nlet warnedHnswSoftFail = false;\n\n/** Statement names for per-connection prepared-statement cache. */\nconst STMT = {\n insertOne: \"Wolbarg_insert_one_v5\",\n insertBatch: \"Wolbarg_insert_batch_v6\",\n} as const;\n\n/**\n * Bind embedding as float4[] for `$n::float4[]::vector` (single-row path).\n * Avoids multi-KB text literals and Postgres vector text parse.\n */\nfunction toFloat4Param(embedding: Float32Array): number[] {\n const out = new Array<number>(embedding.length);\n for (let i = 0; i < embedding.length; i += 1) {\n out[i] = embedding[i]!;\n }\n return out;\n}\n\n/**\n * pgvector text literal for batch unnest.\n * node-pg cannot reliably bind float4[][] (collapses to float4[] → cast errors).\n */\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\n/** Append/override a libpq query param (e.g. options=-c synchronous_commit=off). */\nfunction appendConnectionOption(\n connectionString: string,\n key: string,\n value: string,\n): string {\n try {\n const url = new URL(connectionString);\n if (key === \"options\") {\n const existing = url.searchParams.get(\"options\");\n url.searchParams.set(\n \"options\",\n existing ? `${existing} ${value}`.trim() : value,\n );\n } else {\n url.searchParams.set(key, value);\n }\n return url.toString();\n } catch {\n const sep = connectionString.includes(\"?\") ? \"&\" : \"?\";\n return `${connectionString}${sep}${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n }\n}\n\n/** Session GUCs that must be set before the pool hands out a client. */\nfunction withPoolStartupOptions(\n connectionString: string,\n durableWrites: boolean,\n): string {\n const flags = [\n \"-c jit=off\",\n // Bake HNSW search GUCs into the connection — avoids per-recall set_config.\n \"-c hnsw.ef_search=40\",\n \"-c hnsw.iterative_scan=relaxed_order\",\n ];\n if (!durableWrites) {\n flags.unshift(\"-c synchronous_commit=off\");\n }\n return appendConnectionOption(connectionString, \"options\", flags.join(\" \"));\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, content_hash, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$9,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, content_hash, 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 gen_random_uuid()::text, 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, organization, agent, archived)\n SELECT id, $8::float4[]::vector, $2, $3, false FROM mem\n )\n SELECT * FROM mem`;\n\n/** Batch: RETURNING id only — caller rebuilds MemoryRow from inputs. */\nconst INSERT_BATCH_SQL = `WITH mem AS (\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n )\n SELECT id, org, agent, txt, meta::jsonb, false, NULL, h, c, u\n FROM unnest(\n $1::text[], $2::text[], $3::text[], $4::text[],\n $5::text[], $6::timestamptz[], $7::timestamptz[], $8::text[]\n ) AS t(id, org, agent, txt, meta, c, u, h)\n RETURNING id\n ),\n hist AS (\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT gen_random_uuid()::text, id, 'created', NULL, c\n FROM unnest($1::text[], $6::timestamptz[]) AS t(id, 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, organization, agent, archived)\n SELECT id, emb::vector, org, agent, false\n FROM unnest($1::text[], $9::text[], $2::text[], $3::text[]) AS t(id, emb, org, agent)\n )\n SELECT id FROM mem`;\n\n/** Cap per flush so multiple batches pipeline across the pool. */\nconst COALESCE_FLUSH_MAX = 128;\nconst COALESCE_FLUSH_THRESHOLD = 48;\nconst COALESCE_MAX_PARALLEL = 24;\nconst BULK_CHUNK_NO_HNSW = 500;\nconst BULK_CHUNK_WITH_HNSW = 250;\nconst COPY_BATCH_THRESHOLD = 48;\n\n/** PostgreSQL + pgvector {@link StorageProvider} (`pg` optional peer). */\nexport class PostgresStorageProvider implements StorageProvider {\n readonly name = \"postgres\";\n\n private readonly connectionString: string;\n private readonly maxPoolSize: number;\n private readonly durableWrites: boolean;\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 /** Dedup concurrent CREATE INDEX so mixed read/write storms don't pile up. */\n private hnswBuildInFlight: Promise<void> | null = null;\n private hasContentTsv = 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 insertFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private insertFlushInFlight = 0;\n\n /**\n * @param options - Connection string, pool size, and durability flags.\n */\n constructor(options: PostgresProviderOptions) {\n this.maxPoolSize = options.maxPoolSize ?? 64;\n this.durableWrites = options.durableWrites !== false;\n // Bake GUCs into the URL — never SET on 'connect' (races with pool checkout).\n this.connectionString = withPoolStartupOptions(\n options.connectionString,\n this.durableWrites,\n );\n }\n\n /** Current pg pool occupancy stats (for diagnostics / subscribe setup). */\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 /** Dedicated pool accessor for LISTEN/NOTIFY subscribe backend. */\n getPool(): PgPool | null {\n return this.pool;\n }\n\n /** Open the connection pool and run migrations. */\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 connectionTimeoutMillis: 10_000,\n allowExitOnIdle: true,\n keepAlive: true,\n });\n // Do NOT query on 'connect' — node-pg may check the client out concurrently\n // (overlapping query warning + multi-second stalls under concurrency).\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 const schemaKey = `${this.connectionString}::${dims}`;\n if (!PostgresStorageProvider.vectorSchemaReady.has(schemaKey)) {\n await this.ensureVectorTables(dims);\n PostgresStorageProvider.vectorSchemaReady.add(schemaKey);\n } else {\n this.hasPgvector = true;\n // HNSW may have been dropped by a prior bulk load — check cheaply.\n const idx = await this.query(\n `SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embeddings_hnsw' LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n this.hnswIndexEnsured = idx.rows.length > 0;\n }\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 /** Drain coalesced inserts and end the connection pool. */\n async close(): Promise<void> {\n if (this.insertFlushTimer) {\n clearTimeout(this.insertFlushTimer);\n this.insertFlushTimer = null;\n }\n // Drain coalesced inserts before tearing down the pool.\n const deadline = Date.now() + 5_000;\n while (\n (this.insertQueue.length > 0 || this.insertFlushInFlight > 0) &&\n Date.now() < deadline\n ) {\n if (this.insertQueue.length > 0) {\n await this.flushInsertQueue();\n } else {\n await new Promise<void>((r) => setTimeout(r, 5));\n }\n }\n if (!this.pool) {\n return;\n }\n await this.pool.end();\n this.pool = null;\n }\n\n /**\n * Run a search query. HNSW GUCs are baked into pool startup options —\n * no per-recall connect()+set_config round-trip.\n */\n private async withSearchSession<T>(\n fn: (client: PgQueryable) => Promise<T>,\n ): Promise<T> {\n return fn(this.requirePool());\n }\n\n /**\n * Drop HNSW so bulk / concurrent inserts avoid graph maintenance.\n * Next recall rebuilds the index (lazy).\n */\n async dropVectorIndex(): Promise<void> {\n await this.query(`DROP INDEX IF EXISTS idx_memory_embeddings_hnsw`).catch(\n () => undefined,\n );\n this.hnswIndexEnsured = false;\n }\n\n /** Force HNSW build now (e.g. before timed recall benches). */\n async ensureVectorIndex(): Promise<void> {\n await this.ensureHnswIndex();\n }\n\n /**\n * Create pgvector tables and HNSW index for the given dimensionality.\n *\n * @param dimensions - Embedding length from the configured model.\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 // Denormalize tenant filters onto embeddings so ANN can pre-filter.\n await this.query(\n `ALTER TABLE memory_embeddings ADD COLUMN IF NOT EXISTS organization TEXT`,\n ).catch(() => undefined);\n await this.query(\n `ALTER TABLE memory_embeddings ADD COLUMN IF NOT EXISTS agent TEXT`,\n ).catch(() => undefined);\n await this.query(\n `ALTER TABLE memory_embeddings ADD COLUMN IF NOT EXISTS archived BOOLEAN NOT NULL DEFAULT false`,\n ).catch(() => undefined);\n // One-shot denormalization — skip when columns are already populated.\n const needsBackfill = await this.query(\n `SELECT 1 FROM memory_embeddings WHERE organization IS NULL LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n if (needsBackfill.rows.length > 0) {\n await this.query(`\n UPDATE memory_embeddings e\n SET organization = m.organization,\n agent = m.agent,\n archived = m.archived\n FROM memories m\n WHERE m.id = e.memory_id\n AND e.organization IS NULL\n `).catch(() => undefined);\n }\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memory_embeddings_org_active\n ON memory_embeddings (organization)\n WHERE archived = false`,\n ).catch(() => undefined);\n // Do not create HNSW here — defer until first search so bulk inserts stay fast.\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 /** Cross-process subscribe: NOTIFY after a committed write. */\n /**\n * Issue `pg_notify` for cross-process {@link subscribe} delivery.\n *\n * @param event - Memory change payload (IDs + metadata only).\n */\n async notifyChange(event: MemoryChangeEvent): Promise<void> {\n await notifyMemoryChange(this.requirePool(), event);\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 /** Delete all rows for an organization (dev / test helper). */\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 /** Truncate all Wolbarg tables (dev / test helper). */\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 if (this.hnswBuildInFlight) {\n await this.hnswBuildInFlight;\n return;\n }\n this.hnswBuildInFlight = this.buildHnswIndex();\n try {\n await this.hnswBuildInFlight;\n } finally {\n this.hnswBuildInFlight = null;\n }\n }\n\n private async buildHnswIndex(): Promise<void> {\n if (this.hnswIndexEnsured) {\n return;\n }\n try {\n // CONCURRENTLY avoids blocking writers during mixed read/write storms.\n // IF NOT EXISTS is safe when another backend already finished the build.\n await this.query(`\n CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_memory_embeddings_hnsw\n ON memory_embeddings USING hnsw (embedding vector_cosine_ops)\n WITH (m = 16, ef_construction = 32)\n `);\n this.hnswIndexEnsured = true;\n this.hnswCreateFailures = 0;\n } catch (error) {\n // Another session may have created it; treat as success when present.\n const idx = await this.query(\n `SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embeddings_hnsw' LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n if (idx.rows.length > 0) {\n this.hnswIndexEnsured = true;\n this.hnswCreateFailures = 0;\n return;\n }\n this.hnswCreateFailures += 1;\n if (this.hnswCreateFailures === 1 && !warnedHnswSoftFail) {\n warnedHnswSoftFail = true;\n warnLogger.warn(\n \"HNSW index creation failed; ANN will fall back to sequential scan.\",\n );\n }\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 // Soft-fail: ANN can still run as a sequential scan this round.\n }\n }\n\n /** @inheritdoc StorageProvider.getEmbeddingDimensions */\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 /** @inheritdoc StorageProvider.setEmbeddingDimensions */\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 /** Insert a single memory row (coalesced under concurrent writers). */\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n this.requireVectorReady();\n\n // Always coalesce briefly so concurrent remember() calls share one unnest.\n // Do NOT hold a global inFlight mutex — that serializes Postgres like SQLite.\n return new Promise<MemoryRow>((resolve, reject) => {\n this.insertQueue.push({ input, resolve, reject });\n if (this.insertQueue.length >= COALESCE_FLUSH_THRESHOLD) {\n this.clearInsertFlushTimer();\n void this.flushInsertQueue();\n return;\n }\n this.scheduleInsertFlush();\n });\n }\n\n private clearInsertFlushTimer(): void {\n if (this.insertFlushTimer) {\n clearImmediate(this.insertFlushTimer as unknown as NodeJS.Immediate);\n clearTimeout(this.insertFlushTimer);\n this.insertFlushTimer = null;\n }\n this.insertFlushScheduled = false;\n }\n\n /** Flush coalesced inserts after a turn so concurrent remember() can join. */\n private scheduleInsertFlush(): void {\n if (this.insertFlushScheduled) {\n return;\n }\n this.insertFlushScheduled = true;\n // setImmediate > queueMicrotask: concurrent awaiters after embed can join.\n this.insertFlushTimer = setImmediate(() => {\n this.insertFlushTimer = null;\n this.insertFlushScheduled = false;\n void this.flushInsertQueue();\n }) as unknown as ReturnType<typeof setTimeout>;\n }\n\n private async flushInsertQueue(): Promise<void> {\n if (this.insertFlushInFlight >= COALESCE_MAX_PARALLEL) {\n this.scheduleInsertFlush();\n return;\n }\n // Cap flush size so remaining queue can pipeline on other pool connections.\n const batch = this.insertQueue.splice(0, COALESCE_FLUSH_MAX);\n this.clearInsertFlushTimer();\n if (batch.length === 0) {\n return;\n }\n this.insertFlushInFlight += 1;\n // Kick another flush immediately if more work remains (parallel drains).\n if (\n this.insertQueue.length > 0 &&\n this.insertFlushInFlight < COALESCE_MAX_PARALLEL\n ) {\n void this.flushInsertQueue();\n }\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 -= 1;\n if (this.insertQueue.length > 0) {\n void this.flushInsertQueue();\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 contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\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 toFloat4Param(input.embedding),\n contentHash,\n ]);\n return this.mapRow(inserted.rows[0]!);\n }\n return this.insertOneBlob(input);\n }\n\n /** Batch insert via unnest / COPY paths with optional HNSW deferral. */\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 contentHashes = new Array<string | null>(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 contentHashes[i] =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n vectors[i] = toVectorLiteral(input.embedding);\n }\n\n await this.queryNamed(STMT.insertBatch, INSERT_BATCH_SQL, [\n ids,\n orgs,\n agents,\n texts,\n metas,\n created,\n updated,\n contentHashes,\n vectors,\n ]);\n\n // RETURNING id only — rebuild rows from inputs (avoids shipping JSONB back).\n return inputs.map((_, i) => ({\n id: ids[i]!,\n organization: orgs[i]!,\n agent: agents[i]!,\n content_text: texts[i]!,\n metadata_json: metas[i]!,\n archived: 0,\n compressed_into: null,\n content_hash: contentHashes[i] ?? null,\n created_at: created[i]!,\n updated_at: updated[i]!,\n }));\n }\n\n /** Parallel unnest when HNSW is absent; sequential when index must stay consistent. */\n private async insertBatchChunked(\n inputs: InsertMemoryInput[],\n ): Promise<MemoryRow[]> {\n const chunkSize = this.hnswIndexEnsured\n ? BULK_CHUNK_WITH_HNSW\n : BULK_CHUNK_NO_HNSW;\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 // No HNSW → pipeline chunks across the pool. With HNSW → sequential (lock-friendly).\n if (!this.hnswIndexEnsured) {\n const parts = 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 parts) {\n for (let j = 0; j < part.length; j += 1) {\n out[offset + j] = part[j]!;\n }\n offset += part.length;\n }\n return out;\n }\n const out: MemoryRow[] = new Array(inputs.length);\n let offset = 0;\n for (const chunk of chunks) {\n const part = await this.insertBatchPgvector(chunk);\n for (let j = 0; j < part.length; j += 1) {\n out[offset + j] = part[j]!;\n }\n offset += part.length;\n }\n return out;\n }\n\n private async insertOneBlob(input: InsertMemoryInput): Promise<MemoryRow> {\n return this.withTransaction(async () => {\n const buf = Buffer.from(\n input.embedding.buffer,\n input.embedding.byteOffset,\n input.embedding.byteLength,\n );\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n const inserted = await this.query(\n `INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$8,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, content_hash, 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 contentHash,\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\n /** Update memory content, metadata, embedding, and content hash. */\n async updateMemory(input: UpdateMemoryInput): Promise<MemoryRow | null> {\n return this.withTransaction(async () => {\n const existing = await this.getMemoryById(input.id, input.organization);\n if (!existing) {\n return null;\n }\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : input.contentText !== undefined\n ? hashMemoryContent(input.contentText)\n : (existing.content_hash ?? null);\n await this.query(\n `UPDATE memories SET\n content_text = COALESCE($1, content_text),\n metadata_json = COALESCE($2::jsonb, metadata_json),\n content_hash = COALESCE($3, content_hash),\n updated_at = $4\n WHERE id = $5 AND organization = $6`,\n [\n input.contentText ?? null,\n input.metadata !== undefined ? serializeMetadata(input.metadata) : null,\n contentHash,\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 await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ($1,$2,'updated',NULL,$3)`,\n [crypto.randomUUID(), input.id, input.updatedAt],\n );\n return this.getMemoryById(input.id, input.organization);\n });\n }\n\n /** Find an active memory by org, agent, and content hash (dedupe). */\n async findActiveByContentHash(\n organization: string,\n agent: string,\n contentHash: string,\n ): 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, content_hash, created_at, updated_at\n FROM memories\n WHERE organization = $1 AND agent = $2 AND content_hash = $3 AND archived = false\n LIMIT 1`,\n [organization, agent, contentHash],\n );\n const row = result.rows[0];\n return row ? this.mapRow(row) : null;\n }\n\n /** Fetch a memory row by UUID within an organization. */\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, content_hash, 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 /** Fetch a memory row by internal rowid within an organization. */\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 /** Batch-fetch memory rows by rowids within an organization. */\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 /** List memories matching repository filters with optional limit. */\n async listMemories(filter: RepositoryFilter, limit?: number): Promise<MemoryRow[]> {\n const want =\n limit !== undefined ? limit : filter.metadata ? 10_000 : undefined;\n const compiled = filter.metadata\n ? compileMetadataFilterToPostgres(filter.metadata, 2)\n : null;\n\n if (compiled) {\n const clauses = [`organization = $1`, `(${compiled.expression})`];\n const params: unknown[] = [filter.organization, ...compiled.params];\n let idx = params.length + 1;\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 (want !== undefined) {\n sql += ` LIMIT $${idx}`;\n params.push(want);\n }\n const result = await this.query(sql, params);\n return result.rows.map((r) => this.mapRow(r));\n }\n\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 /** Scan memories matching metadata filters. */\n async searchByMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n return this.listMemories(filter, limit);\n }\n\n /** Full-text keyword search via `tsvector` / GIN index. */\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 (error) {\n if (!warnedFtsKeywordSearch) {\n warnedFtsKeywordSearch = true;\n warnLogger.warn(\n \"FTS keyword search failed; returning empty keyword hits.\",\n {\n cause: error instanceof Error ? error.message : String(error),\n },\n );\n }\n return [];\n }\n }\n\n /** pgvector cosine ANN search (HNSW when index is present). */\n async searchVectors(\n embedding: Float32Array,\n topK: number,\n ): Promise<VectorSearchHit[]> {\n this.requireVectorReady();\n if (this.hasPgvector) {\n await this.ensureHnswIndex();\n return this.withSearchSession(async (client) => {\n const result = await client.query(\n `SELECT r.row_num AS memory_rowid, ann.distance\n FROM (\n SELECT e.memory_id, (e.embedding <=> $1::float4[]::vector) AS distance\n FROM memory_embeddings e\n WHERE e.archived = false\n ORDER BY e.embedding <=> $1::float4[]::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 [toFloat4Param(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\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 /** ANN search joined with memory rows and org/archived post-filters. */\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 // Scope to organization before scoring — shared DBs accumulate many orgs\n // across a suite; global topK + post-filter underfills tenant recalls.\n const clauses = [`m.organization = $1`];\n const params: unknown[] = [organization];\n if (options?.agent) {\n clauses.push(`m.agent = $2`);\n params.push(options.agent);\n }\n if (!options?.includeArchived) {\n clauses.push(`m.archived = false`);\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 r.row_num AS rowid, e.embedding\n FROM memory_embeddings_blob e\n JOIN memory_row_map r ON r.memory_id = e.memory_id\n JOIN memories m ON m.id = e.memory_id\n WHERE ${clauses.join(\" AND \")}`,\n params,\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 row: this.mapRow(row),\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 await this.ensureHnswIndex();\n const vec = toFloat4Param(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 // Org-scoped exact KNN — avoids filtered-HNSW iterative_scan tax when the\n // shared DB holds many tenants (common in long-lived Postgres). For typical\n // agent memory corpora (<~50k/org) this is faster and more predictable.\n const agentClause = options?.agent ? \"AND e.agent = $4\" : \"\";\n const archivedClause = options?.includeArchived\n ? \"\"\n : \"AND e.archived = false\";\n const params = options?.agent\n ? [vec, topK, organization, options.agent]\n : [vec, topK, organization];\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 r.row_num AS rowid,\n (e.embedding <=> $1::float4[]::vector) AS distance\n FROM memory_embeddings e\n JOIN memory_row_map r ON r.memory_id = e.memory_id\n JOIN memories m ON m.id = e.memory_id\n WHERE e.organization = $3\n ${agentClause}\n ${archivedClause}\n AND m.organization = $3\n ORDER BY e.embedding <=> $1::float4[]::vector\n LIMIT $2`,\n params,\n );\n return mapHits(result.rows);\n }\n\n /** Soft-archive memories (compression / forget paths). */\n async archiveMemories(\n ids: string[],\n organization: string,\n compressedIntoId: string,\n archivedAt: string,\n ): Promise<string[]> {\n return this.withTransaction(async () => {\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 await this.query(\n `UPDATE memory_embeddings\n SET archived = true\n WHERE memory_id = ANY($1::text[])`,\n [archived],\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\n /** Hard-delete a single memory by id; returns whether a row was removed. */\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 /** Hard-delete memories matching org / agent / metadata filters. */\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 /** Remove all memories for an organization. */\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 /** List audit history events for a memory id. */\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 /** Append a history row (created / archived / compressed / updated). */\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 /** Aggregate memory counts for an organization. */\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 /** Approximate on-disk database size in bytes (`pg_database_size`). */\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\n const versionRow = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.schemaVersion],\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n const current =\n versionRow.rows[0]?.value !== undefined\n ? Number(versionRow.rows[0].value)\n : null;\n\n if (current !== null && current > SCHEMA_VERSION) {\n throw new InitializationError(\n `Database schema version ${current} is newer than this Wolbarg SDK (${SCHEMA_VERSION}). Please upgrade Wolbarg to open this database.`,\n );\n }\n\n // Fast path: schema already current — skip DDL churn and hash backfill.\n if (current === SCHEMA_VERSION) {\n const tsvProbe = await this.query(\n `SELECT 1 FROM information_schema.columns\n WHERE table_name = 'memories' AND column_name = 'content_tsv'\n LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n this.hasContentTsv = tsvProbe.rows.length > 0;\n return;\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', 'updated')),\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 // Drop redundant archived btree — partial active indexes cover the hot path.\n await this.query(\n `DROP INDEX IF EXISTS idx_memories_org_archived`,\n ).catch(() => undefined);\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 // Schema v3: content_hash + unique active index + history updated event\n await this.query(\n `ALTER TABLE memories ADD COLUMN IF NOT EXISTS content_hash TEXT`,\n ).catch(() => undefined);\n await this.query(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_org_agent_hash_active\n ON memories(organization, agent, content_hash)\n WHERE archived = false AND content_hash IS NOT NULL`,\n ).catch(() => undefined);\n await this.query(`\n CREATE TABLE IF NOT EXISTS embedding_cache (\n cache_key TEXT PRIMARY KEY NOT NULL,\n model TEXT NOT NULL,\n vector BYTEA NOT NULL,\n created_at TIMESTAMPTZ NOT NULL,\n last_used_at TIMESTAMPTZ NOT NULL\n )\n `).catch(() => undefined);\n\n // Widen history CHECK to allow 'updated' (drop + recreate constraint if present)\n await this.query(`\n DO $$\n BEGIN\n ALTER TABLE memory_history DROP CONSTRAINT IF EXISTS memory_history_event_type_check;\n ALTER TABLE memory_history ADD CONSTRAINT memory_history_event_type_check\n CHECK (event_type IN ('created', 'archived', 'compressed', 'updated'));\n EXCEPTION WHEN others THEN\n NULL;\n END $$;\n `).catch(() => undefined);\n\n // Backfill content_hash ONLY when upgrading from a pre-v3 schema.\n // Running this on every open() was the dominant cold-start cost (~100ms+).\n const priorVersion = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.schemaVersion],\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n const prior =\n priorVersion.rows[0]?.value !== undefined\n ? Number(priorVersion.rows[0].value)\n : null;\n const needsHashBackfill = prior === null || !Number.isFinite(prior) || prior < 3;\n\n if (needsHashBackfill) {\n const active = await this.query(\n `SELECT id, organization, agent, content_text, updated_at\n FROM memories WHERE archived = false AND content_hash IS NULL\n ORDER BY updated_at DESC`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n const seen = new Set<string>();\n for (const row of active.rows) {\n const hash = hashMemoryContent(String(row.content_text));\n const key = `${row.organization}\\0${row.agent}\\0${hash}`;\n if (seen.has(key)) {\n await this.query(\n `UPDATE memories SET content_hash = NULL WHERE id = $1`,\n [row.id],\n ).catch(() => undefined);\n } else {\n seen.add(key);\n await this.query(\n `UPDATE memories SET content_hash = $1 WHERE id = $2`,\n [hash, row.id],\n ).catch(() => undefined);\n }\n }\n }\n\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.schemaVersion, String(SCHEMA_VERSION)],\n ).catch(() => undefined);\n\n // Stored tsvector column — keyword/hybrid avoid re-computing to_tsvector.\n // Probe first: ALTER on every open is expensive when the column exists.\n const tsvProbe = await this.query(\n `SELECT 1 FROM information_schema.columns\n WHERE table_name = 'memories' AND column_name = 'content_tsv'\n LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n if (tsvProbe.rows.length > 0) {\n this.hasContentTsv = true;\n } else {\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 }\n\n private async tryEnablePgvector(): Promise<boolean> {\n const cached = PostgresStorageProvider.pgvectorByConn.get(\n this.connectionString,\n );\n if (cached !== undefined) {\n return cached;\n }\n try {\n await this.query(`CREATE EXTENSION IF NOT EXISTS vector`);\n PostgresStorageProvider.pgvectorByConn.set(this.connectionString, true);\n return true;\n } catch (error) {\n PostgresStorageProvider.pgvectorByConn.set(this.connectionString, false);\n if (!warnedPgvectorFallback) {\n warnedPgvectorFallback = true;\n warnLogger.warn(\n \"pgvector extension is unavailable; using blob cosine search fallback.\",\n {\n cause:\n error instanceof Error ? error.message : `unknown error: ${String(error)}`,\n },\n );\n }\n return false;\n }\n }\n\n private static pgvectorByConn = new Map<string, boolean>();\n private static vectorSchemaReady = new Set<string>();\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 meta AS (\n SELECT organization, agent, archived FROM memories WHERE id = $1\n )\n INSERT INTO memory_embeddings (memory_id, embedding, organization, agent, archived)\n SELECT $1, $2::float4[]::vector, meta.organization, meta.agent, meta.archived\n FROM meta\n ON CONFLICT (memory_id) DO UPDATE SET\n embedding = EXCLUDED.embedding,\n organization = EXCLUDED.organization,\n agent = EXCLUDED.agent,\n archived = EXCLUDED.archived`,\n [memoryId, toFloat4Param(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 content_hash:\n row.content_hash === null || row.content_hash === undefined\n ? null\n : String(row.content_hash),\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 * Creates SQLite or PostgreSQL {@link StorageProvider} instances from config.\n * Prefer {@link createStorageProvider} over the deprecated {@link createDatabaseProvider}.\n *\n * @example\n * ```ts\n * import { createStorageProvider } from \"wolbarg/storage\";\n *\n * const storage = createStorageProvider({\n * provider: \"sqlite\",\n * url: \"./memory.db\",\n * });\n * await storage.open();\n * ```\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\n/**\n * Create a storage provider from SQLite or PostgreSQL configuration.\n *\n * @param config - Storage or database config with `provider` and connection URL.\n * @param options - Optional SQLite concurrency tuning.\n * @param options.concurrency - Lock retry / timeout settings for SQLite writes.\n * @returns An unopened {@link StorageProvider} — call `open()` before use.\n * @throws {@link ConfigurationError} when URL or provider is invalid.\n *\n * @example\n * ```ts\n * const storage = createStorageProvider(\n * { provider: \"postgres\", url: process.env.DATABASE_URL! },\n * { concurrency: { maxRetries: 5 } },\n * );\n * ```\n */\nexport function createStorageProvider(\n config: StorageConfig | DatabaseConfig,\n options?: { concurrency?: import(\"../types/index.js\").ConcurrencyConfig },\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 concurrency: options?.concurrency,\n });\n }\n\n if (config.provider === \"postgres\") {\n return new PostgresStorageProvider({\n connectionString,\n maxPoolSize: config.maxPoolSize,\n durableWrites: config.durableWrites,\n });\n }\n\n throw new ConfigurationError(\n `Unsupported storage provider: ${String((config as { provider: string }).provider)}`,\n );\n}\n\n/**\n * @deprecated Prefer {@link createStorageProvider}.\n * @param config - Legacy database configuration object.\n * @returns A {@link StorageProvider} instance.\n */\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","/** Published SDK semver — keep in sync with `package.json` `version`. */\nexport const SDK_VERSION = \"0.5.5\";\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\";\nimport { SDK_VERSION } from \"../version.js\";\n\nlet warnedMissingExportManifest = false;\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 /** Embedding provider model captured at export time. */\n embeddingModel?: string;\n /** Expected embedding vector dimensionality captured at export time. */\n embeddingDimensions?: number;\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\n/**\n * Portable memory database import / export contract.\n *\n * Implement for S3, tarball, or remote backup targets. Built-in:\n * {@link SqliteMemoryTransferProvider} (file copy + manifest).\n */\nexport interface MemoryTransferProvider {\n exportTo(\n path: string,\n sourcePath: string,\n organization?: string,\n embeddingModel?: string,\n embeddingDimensions?: number,\n ): Promise<MemoryExportResult>;\n importFrom(\n path: string,\n targetPath: string,\n expected?: {\n organization?: string;\n embeddingModel?: string;\n embeddingDimensions?: number;\n },\n ): Promise<MemoryImportResult>;\n}\n\n/** SQLite file copy + JSON manifest export/import implementation. */\nexport class SqliteMemoryTransferProvider implements MemoryTransferProvider {\n async exportTo(\n exportPath: string,\n sourcePath: string,\n organization?: string,\n embeddingModel?: string,\n embeddingDimensions?: number,\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 ...(embeddingModel ? { embeddingModel } : {}),\n ...(embeddingDimensions ? { embeddingDimensions } : {}),\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 expected?: {\n organization?: string;\n embeddingModel?: string;\n embeddingDimensions?: number;\n },\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 | undefined;\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 if (!warnedMissingExportManifest) {\n warnedMissingExportManifest = true;\n console.warn(\n \"[wolbarg:warn] export manifest is missing; skipping manifest-based import validation.\",\n );\n }\n }\n\n if (manifest) {\n if (\n expected?.organization &&\n manifest.organization &&\n expected.organization !== manifest.organization\n ) {\n throw new ValidationError(\n \"Import failed: export organization does not match the current Wolbarg organization.\",\n );\n }\n if (\n expected?.embeddingDimensions != null &&\n manifest.embeddingDimensions != null &&\n expected.embeddingDimensions !== manifest.embeddingDimensions\n ) {\n throw new ValidationError(\n `Import failed: embedding dimension mismatch (expected ${expected.embeddingDimensions}, got ${manifest.embeddingDimensions}).`,\n );\n }\n if (\n expected?.embeddingModel &&\n manifest.embeddingModel &&\n expected.embeddingModel !== manifest.embeddingModel\n ) {\n throw new ValidationError(\n `Import failed: embedding model mismatch (expected ${expected.embeddingModel}, got ${manifest.embeddingModel}).`,\n );\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 const tmpTarget = `${resolvedTarget}.tmp-import-${Date.now()}`;\n\n // Import into a temporary path first, then do an atomic swap. This keeps\n // the original database intact if the copy fails mid-way.\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n const side = `${tmpTarget}${suffix}`;\n if (fs.existsSync(side)) {\n fs.rmSync(side, { force: true });\n }\n }\n\n await copySqlite(dbExportPath, tmpTarget);\n\n // Swap temp -> target (main file + WAL/SHM siblings).\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\n fs.renameSync(tmpTarget, resolvedTarget);\n for (const suffix of [\"-wal\", \"-shm\"]) {\n const from = `${tmpTarget}${suffix}`;\n const to = `${resolvedTarget}${suffix}`;\n if (fs.existsSync(from)) {\n fs.renameSync(from, to);\n }\n }\n\n return { path: resolvedTarget, manifest: manifest ?? undefined };\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 * Conversation → memory helpers for {@link Wolbarg.rememberFromMessages}.\n * Experimental until 1.0 — keep extraction thin; apps own richer pipelines.\n */\n\nimport type { ChatMessage } from \"../llm/index.js\";\nimport type {\n ConversationMessage,\n MemoryDedupeConfig,\n MemoryMetadata,\n RememberFromMessagesOptions,\n RememberFromMessagesRawStrategy,\n} from \"../types/index.js\";\nimport { ValidationError } from \"../errors/index.js\";\n\nconst DEFAULT_RAW_STRATEGY: RememberFromMessagesRawStrategy = \"last_user\";\n\n/** Normalize and validate incoming chat messages. */\nexport function normalizeConversationMessages(\n messages: ConversationMessage[],\n): ConversationMessage[] {\n if (!Array.isArray(messages)) {\n throw new ValidationError(\"messages must be an array\");\n }\n if (messages.length === 0) {\n throw new ValidationError(\"messages must be a non-empty array\");\n }\n\n return messages.map((message, index) => {\n if (!message || typeof message !== \"object\") {\n throw new ValidationError(`messages[${index}] must be an object`);\n }\n if (typeof message.role !== \"string\" || message.role.trim().length === 0) {\n throw new ValidationError(`messages[${index}].role must be a non-empty string`);\n }\n if (typeof message.content !== \"string\") {\n throw new ValidationError(`messages[${index}].content must be a string`);\n }\n return {\n role: message.role.trim(),\n content: message.content.trim(),\n };\n });\n}\n\n/**\n * Resolve and validate options for {@link Wolbarg.rememberFromMessages}.\n *\n * @param options - Agent, mode, rawStrategy, metadata, dedupe overrides.\n */\nexport function resolveRememberFromMessagesOptions(\n options: RememberFromMessagesOptions,\n): {\n agent: string;\n mode: \"raw\" | \"extract\";\n rawStrategy: RememberFromMessagesRawStrategy;\n metadata?: MemoryMetadata;\n dedupe?: boolean | MemoryDedupeConfig;\n} {\n if (!options || typeof options !== \"object\") {\n throw new ValidationError(\"options is required\");\n }\n if (typeof options.agent !== \"string\" || options.agent.trim().length === 0) {\n throw new ValidationError(\"agent must be a non-empty string\");\n }\n\n const mode = options.mode ?? \"raw\";\n if (mode !== \"raw\" && mode !== \"extract\") {\n throw new ValidationError('mode must be \"raw\" or \"extract\"');\n }\n\n const rawStrategy = options.rawStrategy ?? DEFAULT_RAW_STRATEGY;\n if (rawStrategy !== \"last_user\" && rawStrategy !== \"all_user\") {\n throw new ValidationError('rawStrategy must be \"last_user\" or \"all_user\"');\n }\n\n return {\n agent: options.agent.trim(),\n mode,\n rawStrategy,\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n ...(options.dedupe !== undefined ? { dedupe: options.dedupe } : {}),\n };\n}\n\n/** Select user texts to store in `mode: \"raw\"`. */\nexport function selectRawUserTexts(\n messages: ConversationMessage[],\n strategy: RememberFromMessagesRawStrategy,\n): string[] {\n const userTexts = messages\n .filter((m) => m.role === \"user\" && m.content.length > 0)\n .map((m) => m.content);\n\n if (userTexts.length === 0) {\n throw new ValidationError(\n 'no user messages with non-empty content — nothing to remember in mode \"raw\"',\n );\n }\n\n if (strategy === \"last_user\") {\n return [userTexts[userTexts.length - 1]!];\n }\n return userTexts;\n}\n\n/** Build the fixed experimental extract prompt. */\nexport function buildExtractMessages(\n messages: ConversationMessage[],\n): ChatMessage[] {\n const transcript = messages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n\n return [\n {\n role: \"system\",\n content:\n \"Extract durable factual memories from the conversation. \" +\n \"Return only atomic facts, one per line. \" +\n \"No numbering, bullets, or commentary. \" +\n \"If there are no facts worth storing, reply with exactly NONE.\",\n },\n {\n role: \"user\",\n content: transcript,\n },\n ];\n}\n\n/** Parse LLM extract output into fact strings. */\nexport function parseExtractedFacts(llmOutput: string): string[] {\n const trimmed = llmOutput.trim();\n if (trimmed.length === 0 || /^none$/i.test(trimmed)) {\n return [];\n }\n\n const facts: string[] = [];\n for (const line of trimmed.split(/\\r?\\n/)) {\n let fact = line.trim();\n if (fact.length === 0) continue;\n fact = fact.replace(/^[-*•]\\s+/, \"\");\n fact = fact.replace(/^\\d+[.)]\\s+/, \"\");\n if (fact.length === 0 || /^none$/i.test(fact)) continue;\n facts.push(fact);\n }\n return facts;\n}\n","/**\n * Memory domain helpers — map storage rows to public API types.\n *\n * Used internally by the Wolbarg facade and exportable for custom tooling.\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\n/**\n * Convert a storage {@link MemoryRow} to a public {@link MemoryRecord}.\n *\n * @param row - Raw database row.\n * @returns Parsed memory with Date objects and deserialized metadata.\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\n/**\n * Convert a storage row plus similarity score to a {@link RecallResult}.\n *\n * @param row - Raw database row.\n * @param similarity - Cosine similarity in `[0, 1]` (higher is better).\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\n/**\n * Convert a history table row to a public {@link HistoryEvent}.\n *\n * @param row - Raw history row from storage.\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\nexport {\n normalizeConversationMessages,\n resolveRememberFromMessagesOptions,\n selectRawUserTexts,\n buildExtractMessages,\n parseExtractedFacts,\n} from \"./from-messages.js\";\n","/**\n * Retrieval pipeline — score fusion, MMR diversification, and adaptive over-fetch.\n *\n * Internal helpers used by `recall()` to combine semantic and keyword signals,\n * diversify results, and size candidate pools before reranking.\n */\n\nimport type { HybridConfig, MmrConfig, RecallResult } from \"../types/index.js\";\n\n/** Candidate with separate semantic, keyword, and fused scores during recall. */\nexport interface ScoredCandidate {\n /** Memory UUID. */\n id: string;\n /** Normalized semantic similarity score. */\n semanticScore: number;\n /** Normalized keyword / BM25 score. */\n keywordScore: number;\n /** Weighted combination of semantic and keyword scores. */\n fusedScore: number;\n /** Full recall result for downstream ranking. */\n result: RecallResult;\n}\n\n/**\n * Fuse semantic and keyword score maps using configured weights.\n *\n * Scores are max-normalized per channel before weighting so scales are comparable.\n *\n * @param semantic - Memory id → raw semantic score.\n * @param keyword - Memory id → raw keyword score.\n * @param weights - Hybrid weights (must sum conceptually to 1.0 in typical configs).\n * @returns Memory id → fused score.\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\n/**\n * Resolve hybrid recall config to concrete weights, or `null` when hybrid is off.\n *\n * @param hybrid - `true` (defaults), `false`, or partial {@link HybridConfig}.\n * @returns Resolved weights or `null` when hybrid search is disabled.\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\n/**\n * Resolve MMR lambda from config, or `null` when MMR is off.\n *\n * @param mmr - `true` (lambda 0.5), `false`, or {@link MmrConfig}.\n * @returns Lambda in `[0, 1]` or `null` when diversification is disabled.\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 (MMR) diversification of recall candidates.\n *\n * Balances relevance (`similarity`) against redundancy using character Jaccard\n * as a cheap token-overlap proxy for embedding similarity.\n *\n * @param candidates - Scored recall results (pre-sorted by relevance).\n * @param topK - Number of diverse results to select.\n * @param lambda - Trade-off: `1` = pure relevance, `0` = pure diversity.\n * @returns Reordered subset of at most `topK` candidates.\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 const best = remaining[bestIdx]!;\n if (\n score > bestScore ||\n (score === bestScore && candidate.id < best.id)\n ) {\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\n/** Token-set Jaccard similarity between two strings (case-insensitive). */\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\n/**\n * Compute how many vector candidates to fetch before filtering / reranking.\n *\n * Uses a higher over-fetch factor when metadata filters are active because\n * post-filtering shrinks the candidate pool.\n *\n * @param topK - Final number of results requested by the caller.\n * @param overFetchFactor - Base multiplier from retrieval config.\n * @param hasFilters - Whether metadata or agent filters will post-filter hits.\n * @returns Candidate pool size capped at 1000.\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 * Shared Memory / Entity serialization helpers for graph backends.\n */\n\nimport type { MemoryRecord } from \"../types/index.js\";\n\n/** Minimal stub when only an id is known. */\nexport function stubMemoryRecord(id: string): MemoryRecord {\n return {\n id,\n organization: \"\",\n agent: \"\",\n content: { text: \"\" },\n metadata: {},\n archived: false,\n compressedInto: null,\n createdAt: new Date(0),\n updatedAt: new Date(0),\n };\n}\n\n/** Serialize graph node metadata to a JSON string (`{}` when undefined). */\nexport function serializeMetadata(meta: Record<string, unknown> | undefined): string {\n return JSON.stringify(meta ?? {});\n}\n\n/**\n * Deserialize graph node metadata from storage (object, JSON string, or empty).\n *\n * @param raw - Value from SQLite / Neo4j column.\n * @returns Plain metadata object; invalid input becomes `{}`.\n */\nexport function deserializeMetadata(raw: unknown): Record<string, unknown> {\n if (raw == null || raw === \"\") return {};\n if (typeof raw === \"object\" && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n if (typeof raw !== \"string\") return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n /* ignore */\n }\n return {};\n}\n\n/**\n * Map a storage or Cypher row into a {@link MemoryRecord}.\n *\n * @param row - Snake_case or camelCase column names from graph backends.\n */\nexport function rowToMemoryRecord(row: Record<string, unknown>): MemoryRecord {\n const id = String(row.id ?? row.n_id ?? \"\");\n const createdAt = parseDate(row.created_at ?? row.createdAt);\n const updatedAt = parseDate(row.updated_at ?? row.updatedAt);\n return {\n id,\n organization: String(row.organization ?? \"\"),\n agent: String(row.agent ?? \"\"),\n content: { text: String(row.content_text ?? row.contentText ?? \"\") },\n metadata: deserializeMetadata(row.metadata_json ?? row.metadata),\n archived: Boolean(row.archived),\n compressedInto:\n row.compressed_into == null || row.compressed_into === \"\"\n ? null\n : String(row.compressed_into),\n createdAt,\n updatedAt,\n };\n}\n\nfunction parseDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === \"string\" || typeof value === \"number\") {\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return d;\n }\n return new Date(0);\n}\n\n/**\n * Stable entity id from name+type (portable across backends).\n *\n * @param name - Human-readable entity label.\n * @param type - Entity classification (e.g. `\"person\"`, `\"project\"`).\n * @returns Deterministic id prefixed with `ent_`.\n */\nexport function entityIdFrom(name: string, type: string): string {\n const key = `${type.trim().toLowerCase()}::${name.trim().toLowerCase()}`;\n // Simple deterministic hash → hex (no crypto dependency required).\n let h = 2166136261;\n for (let i = 0; i < key.length; i += 1) {\n h ^= key.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n const a = (h >>> 0).toString(16).padStart(8, \"0\");\n let h2 = 5381;\n for (let i = 0; i < key.length; i += 1) {\n h2 = (h2 * 33) ^ key.charCodeAt(i);\n }\n const b = (h2 >>> 0).toString(16).padStart(8, \"0\");\n return `ent_${a}${b}`;\n}\n","/**\n * Cascade delete helpers for the SQLite graph schema.\n *\n * Removes a memory graph node (and all incident edges) when the matching\n * memory is hard-deleted via forget/clear. Edge FK CASCADE covers edges when\n * the node row is deleted; we still delete edges explicitly first so partial\n * failures never leave dangling REFERENCES if FKs are off.\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\n\n/** Relation used for entity → memory links (never walked by getRelated). */\nexport const ENTITY_MENTIONS_RELATION = \"MENTIONS\";\n\n/**\n * Delete the memory graph node for `memoryId` and all edges that reference it.\n *\n * @param db - Open SQLite graph database handle.\n * @param memoryId - Wolbarg memory UUID (`graph_nodes.ref_id` for type `memory`).\n */\nexport function cascadeDeleteMemoryNode(\n db: DatabaseSync,\n memoryId: string,\n): void {\n const node = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'memory' AND ref_id = ?`,\n )\n .get(memoryId) as { id: string } | undefined;\n if (!node) return;\n\n db.prepare(\n `DELETE FROM graph_edges WHERE from_node_id = ? OR to_node_id = ?`,\n ).run(node.id, node.id);\n db.prepare(`DELETE FROM graph_nodes WHERE id = ?`).run(node.id);\n}\n","/**\n * Embedded SQLite graph provider (file-backed, local/dev).\n *\n * Implements the five typed {@link GraphProvider} methods with plain SQL and\n * recursive CTEs — no Cypher. Schema is created on open (plain CREATE TABLE IF\n * NOT EXISTS; no graph-engine DDL / schema-creation-on-first-write complexity).\n *\n * Uses the same `node:sqlite` + {@link withImmediateTransaction} patterns as\n * {@link SqliteStorageProvider}. Graph data lives in a separate SQLite file from\n * the memory store by default.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport { ConfigurationError, DatabaseError } from \"../../errors/index.js\";\nimport {\n CREATE_GRAPH_EDGES_TABLE,\n CREATE_GRAPH_INDEXES,\n CREATE_GRAPH_NODES_TABLE,\n} from \"../../schema/index.js\";\nimport {\n resolveConcurrencyConfig,\n type ConcurrencyConfig,\n type ResolvedConcurrencyConfig,\n} from \"../../storage/sqlite/concurrency-config.js\";\nimport { withImmediateTransaction } from \"../../storage/sqlite/transaction.js\";\nimport type { MemoryRecord } from \"../../types/index.js\";\nimport {\n entityIdFrom,\n serializeMetadata,\n stubMemoryRecord,\n} from \"../memory-node.js\";\nimport {\n cascadeDeleteMemoryNode,\n ENTITY_MENTIONS_RELATION,\n} from \"../sync/cascade.js\";\nimport type {\n GetRelatedOptions,\n GraphEntityInput,\n GraphHealthResult,\n GraphProvider,\n} from \"../types.js\";\n\n/** Default traversal depth when `options.depth` is omitted (matches Neo4j). */\nexport const DEFAULT_GET_RELATED_DEPTH = 1;\nconst MAX_GET_RELATED_DEPTH = 16;\n\nexport interface SqliteGraphProviderOptions {\n /** Path to the graph SQLite file (separate from the memory store by default). */\n path: string;\n /** Optional write-concurrency tuning (same shape as memory SQLite). */\n concurrency?: ConcurrencyConfig;\n}\n\n/**\n * File-backed {@link GraphProvider} using recursive SQL CTEs over `graph_nodes` / `graph_edges`.\n */\nexport class SqliteGraphProvider implements GraphProvider {\n readonly name = \"sqlite\";\n private readonly dbPath: string;\n private readonly concurrency: ResolvedConcurrencyConfig;\n private db: DatabaseSync | null = null;\n private opened = false;\n\n /**\n * @param options - Graph SQLite path and optional concurrency tuning.\n */\n constructor(options: SqliteGraphProviderOptions) {\n if (!options?.path || typeof options.path !== \"string\" || !options.path.trim()) {\n throw new ConfigurationError(\"sqlite graph requires a non-empty path\");\n }\n this.dbPath = path.resolve(options.path.trim());\n this.concurrency = resolveConcurrencyConfig(options.concurrency);\n }\n\n /** Whether this provider supports file snapshots for checkpoint / export. */\n supportsFileSnapshot(): boolean {\n return this.dbPath !== \":memory:\";\n }\n\n /** Absolute graph database path, or `null` for `:memory:`. */\n getDataPath(): string | null {\n return this.dbPath === \":memory:\" ? null : this.dbPath;\n }\n\n /** Open the graph SQLite file, apply pragmas, and create schema if needed. */\n async open(): Promise<void> {\n if (this.opened) return;\n\n try {\n if (this.dbPath !== \":memory:\") {\n fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });\n }\n\n const db = new DatabaseSync(this.dbPath);\n db.exec(\"PRAGMA journal_mode = WAL;\");\n db.exec(`\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n PRAGMA busy_timeout = ${this.concurrency.lockTimeoutMs};\n PRAGMA temp_store = MEMORY;\n PRAGMA cache_size = -8192;\n PRAGMA wal_autocheckpoint = 1000;\n `);\n\n db.exec(CREATE_GRAPH_NODES_TABLE);\n db.exec(CREATE_GRAPH_EDGES_TABLE);\n for (const indexSql of CREATE_GRAPH_INDEXES) {\n db.exec(indexSql);\n }\n\n this.db = db;\n this.opened = true;\n } catch (error) {\n try {\n this.db?.close();\n } catch {\n /* ignore */\n }\n this.db = null;\n this.opened = false;\n throw new DatabaseError(\n `Failed to open SQLite graph database: ${describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /** Close the graph database connection. */\n async close(): Promise<void> {\n if (!this.db) {\n this.opened = false;\n return;\n }\n try {\n try {\n this.db.exec(\"PRAGMA optimize;\");\n } catch {\n /* best-effort */\n }\n this.db.close();\n } catch (error) {\n throw new DatabaseError(\n `Failed to close SQLite graph database: ${describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n } finally {\n this.db = null;\n this.opened = false;\n }\n }\n\n /**\n * Create or replace a directed memory↔memory edge.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - Edge label (e.g. `\"related_to\"`, `\"caused_by\"`).\n * @param metadata - Optional JSON metadata stored on the edge.\n */\n async linkMemories(\n fromId: string,\n toId: string,\n relation: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n const fromNode = this.ensureMemoryNodeSync(db, fromId);\n const toNode = this.ensureMemoryNodeSync(db, toId);\n db.prepare(\n `DELETE FROM graph_edges\n WHERE from_node_id = ? AND to_node_id = ? AND relation = ?`,\n ).run(fromNode, toNode, relation);\n db.prepare(\n `INSERT INTO graph_edges (id, from_node_id, to_node_id, relation, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n crypto.randomUUID(),\n fromNode,\n toNode,\n relation,\n serializeMetadata(metadata),\n nowIso(),\n );\n });\n }\n\n /**\n * Remove edges between two memories.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - When set, only delete edges with this relation label.\n */\n async unlinkMemories(\n fromId: string,\n toId: string,\n relation?: string,\n ): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n const fromNode = this.findMemoryNodeId(db, fromId);\n const toNode = this.findMemoryNodeId(db, toId);\n if (!fromNode || !toNode) return;\n if (relation !== undefined) {\n db.prepare(\n `DELETE FROM graph_edges\n WHERE from_node_id = ? AND to_node_id = ? AND relation = ?`,\n ).run(fromNode, toNode, relation);\n return;\n }\n db.prepare(\n `DELETE FROM graph_edges WHERE from_node_id = ? AND to_node_id = ?`,\n ).run(fromNode, toNode);\n });\n }\n\n /**\n * Bounded recursive CTE over `graph_edges`.\n *\n * Default depth: {@link DEFAULT_GET_RELATED_DEPTH} (1). Cap: 16.\n * Only memory↔memory edges are walked (entity MENTIONS edges are excluded).\n * Cycle-safe via path membership (`instr`) so A→B→C→A terminates.\n *\n * Returns stub {@link MemoryRecord}s (id + empty fields). The facade\n * re-hydrates full rows via `toMemoryRecord` from storage when possible.\n */\n async getRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const db = this.requireDb();\n const depth = Math.max(\n 1,\n Math.min(options?.depth ?? DEFAULT_GET_RELATED_DEPTH, MAX_GET_RELATED_DEPTH),\n );\n const direction = options?.direction ?? \"both\";\n const relation = options?.relation ?? null;\n\n const start = this.findMemoryNodeId(db, memoryId);\n if (!start) return [];\n\n const sql = buildGetRelatedSql(direction);\n // Bind: start id (anchor), start id (path seed), max depth, relation×2 (nullable filter).\n const rows = db\n .prepare(sql)\n .all(start, start, depth, relation, relation) as Array<{\n ref_id: string;\n }>;\n\n const seen = new Set<string>();\n const out: MemoryRecord[] = [];\n for (const row of rows) {\n if (row.ref_id === memoryId || seen.has(row.ref_id)) continue;\n seen.add(row.ref_id);\n out.push(stubMemoryRecord(row.ref_id));\n }\n return out;\n }\n\n /**\n * Insert or update a named entity node.\n *\n * @param entity - Entity name, type, and optional metadata.\n * @returns Stable entity id ({@link entityIdFrom}).\n */\n async upsertEntity(entity: GraphEntityInput): Promise<string> {\n const id = entityIdFrom(entity.name, entity.type);\n const db = this.requireDb();\n const meta = serializeMetadata({\n ...(entity.metadata ?? {}),\n entityType: entity.type,\n });\n await this.withTx(() => {\n const existing = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'entity' AND ref_id = ?`,\n )\n .get(id) as { id: string } | undefined;\n if (existing) {\n db.prepare(\n `UPDATE graph_nodes SET name = ?, metadata = ? WHERE id = ?`,\n ).run(entity.name, meta, existing.id);\n } else {\n db.prepare(\n `INSERT INTO graph_nodes (id, type, ref_id, name, metadata, created_at)\n VALUES (?, 'entity', ?, ?, ?, ?)`,\n ).run(id, id, entity.name, meta, nowIso());\n }\n });\n return id;\n }\n\n /**\n * Link an entity to a memory via a `MENTIONS` edge (not traversed by {@link getRelated}).\n *\n * @param entityId - Entity id from {@link upsertEntity}.\n * @param memoryId - Target memory UUID.\n * @param role - Optional role string stored on the edge metadata.\n */\n async linkEntityToMemory(\n entityId: string,\n memoryId: string,\n role?: string,\n ): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n const entity = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'entity' AND ref_id = ?`,\n )\n .get(entityId) as { id: string } | undefined;\n if (!entity) {\n throw new DatabaseError(`Entity not found: ${entityId}`, {\n operation: \"linkEntityToMemory\",\n });\n }\n const memoryNode = this.ensureMemoryNodeSync(db, memoryId);\n db.prepare(\n `DELETE FROM graph_edges\n WHERE from_node_id = ? AND to_node_id = ? AND relation = ?`,\n ).run(entity.id, memoryNode, ENTITY_MENTIONS_RELATION);\n db.prepare(\n `INSERT INTO graph_edges (id, from_node_id, to_node_id, relation, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n crypto.randomUUID(),\n entity.id,\n memoryNode,\n ENTITY_MENTIONS_RELATION,\n serializeMetadata({ role: role ?? \"\" }),\n nowIso(),\n );\n });\n }\n\n /**\n * Remove the memory node and incident edges when a memory is hard-deleted.\n *\n * @param memoryId - Wolbarg memory UUID.\n */\n async deleteMemory(memoryId: string): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n cascadeDeleteMemoryNode(db, memoryId);\n });\n }\n\n /**\n * Raw Cypher escape hatch — **not supported** on the SQLite graph provider.\n * Use the typed methods, or open the underlying SQLite file yourself for raw SQL.\n */\n async query(_cypher: string, _params?: Record<string, unknown>): Promise<unknown> {\n throw new DatabaseError(\n \"raw Cypher queries are not supported by the SQLite graph provider — use the typed methods, or query the underlying SQLite tables directly via your own connection if you need raw access\",\n {\n operation: \"query\",\n suggestion:\n \"Use linkMemories / getRelated / upsertEntity / linkEntityToMemory, or open the graph .db file with node:sqlite for ad-hoc SQL\",\n },\n );\n }\n\n /** Lightweight connectivity and schema statistics check. */\n async health(): Promise<GraphHealthResult> {\n try {\n if (!this.opened || !this.db) {\n return { ok: false, backend: \"sqlite\", details: { reason: \"not open\" } };\n }\n const nodeCount = Number(\n (this.db.prepare(`SELECT COUNT(*) AS c FROM graph_nodes`).get() as { c: number | bigint })\n .c,\n );\n const edgeCount = Number(\n (this.db.prepare(`SELECT COUNT(*) AS c FROM graph_edges`).get() as { c: number | bigint })\n .c,\n );\n return {\n ok: true,\n backend: \"sqlite\",\n details: {\n path: this.dbPath,\n embedded: true,\n nodeCount,\n edgeCount,\n exists: this.dbPath === \":memory:\" || fs.existsSync(this.dbPath),\n },\n };\n } catch (error) {\n return {\n ok: false,\n backend: \"sqlite\",\n details: {\n path: this.dbPath,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n private async withTx<T>(fn: () => T): Promise<T> {\n const db = this.requireDb();\n return withImmediateTransaction(db, this.concurrency, fn);\n }\n\n private requireDb(): DatabaseSync {\n if (!this.db || !this.opened) {\n throw new DatabaseError(\"SQLite graph is not open\", {\n operation: \"graph\",\n suggestion: \"Call ready() / open() before graph operations\",\n });\n }\n return this.db;\n }\n\n private findMemoryNodeId(db: DatabaseSync, memoryId: string): string | null {\n const row = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'memory' AND ref_id = ?`,\n )\n .get(memoryId) as { id: string } | undefined;\n return row?.id ?? null;\n }\n\n private ensureMemoryNodeSync(db: DatabaseSync, memoryId: string): string {\n const existing = this.findMemoryNodeId(db, memoryId);\n if (existing) return existing;\n db.prepare(\n `INSERT INTO graph_nodes (id, type, ref_id, name, metadata, created_at)\n VALUES (?, 'memory', ?, NULL, '{}', ?)`,\n ).run(memoryId, memoryId, nowIso());\n return memoryId;\n }\n}\n\n/**\n * Build a recursive CTE for getRelated.\n * Bind order: startId, startId, maxDepth, relation, relation.\n * Path membership (`instr`) terminates cycles.\n */\nfunction buildGetRelatedSql(direction: \"in\" | \"out\" | \"both\"): string {\n const mentions = ENTITY_MENTIONS_RELATION;\n\n if (direction === \"out\") {\n return `\n WITH RECURSIVE walk(node_id, depth, path) AS (\n SELECT ? AS node_id, 0, '/' || ? || '/'\n UNION ALL\n SELECT e.to_node_id, w.depth + 1, w.path || e.to_node_id || '/'\n FROM walk w\n JOIN graph_edges e ON e.from_node_id = w.node_id\n JOIN graph_nodes dest ON dest.id = e.to_node_id AND dest.type = 'memory'\n WHERE w.depth < ?\n AND instr(w.path, '/' || e.to_node_id || '/') = 0\n AND (? IS NULL OR e.relation = ?)\n AND e.relation != '${mentions}'\n )\n SELECT DISTINCT n.ref_id AS ref_id\n FROM walk w\n JOIN graph_nodes n ON n.id = w.node_id\n WHERE w.depth > 0 AND n.type = 'memory'\n `;\n }\n\n if (direction === \"in\") {\n return `\n WITH RECURSIVE walk(node_id, depth, path) AS (\n SELECT ? AS node_id, 0, '/' || ? || '/'\n UNION ALL\n SELECT e.from_node_id, w.depth + 1, w.path || e.from_node_id || '/'\n FROM walk w\n JOIN graph_edges e ON e.to_node_id = w.node_id\n JOIN graph_nodes src ON src.id = e.from_node_id AND src.type = 'memory'\n WHERE w.depth < ?\n AND instr(w.path, '/' || e.from_node_id || '/') = 0\n AND (? IS NULL OR e.relation = ?)\n AND e.relation != '${mentions}'\n )\n SELECT DISTINCT n.ref_id AS ref_id\n FROM walk w\n JOIN graph_nodes n ON n.id = w.node_id\n WHERE w.depth > 0 AND n.type = 'memory'\n `;\n }\n\n return `\n WITH RECURSIVE walk(node_id, depth, path) AS (\n SELECT ? AS node_id, 0, '/' || ? || '/'\n UNION ALL\n SELECT neighbor.id, w.depth + 1, w.path || neighbor.id || '/'\n FROM walk w\n JOIN graph_edges e\n ON e.from_node_id = w.node_id OR e.to_node_id = w.node_id\n JOIN graph_nodes neighbor\n ON neighbor.id = CASE\n WHEN e.from_node_id = w.node_id THEN e.to_node_id\n ELSE e.from_node_id\n END\n AND neighbor.type = 'memory'\n WHERE w.depth < ?\n AND instr(w.path, '/' || neighbor.id || '/') = 0\n AND (? IS NULL OR e.relation = ?)\n AND e.relation != '${mentions}'\n )\n SELECT DISTINCT n.ref_id AS ref_id\n FROM walk w\n JOIN graph_nodes n ON n.id = w.node_id\n WHERE w.depth > 0 AND n.type = 'memory'\n `;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Neo4j graph provider (networked, production).\n *\n * Uses neo4j-driver session.run with parameterized Cypher for typed methods —\n * NOT GraphProvider.query(). Schema-flexible: nodes/relationships are created\n * freely without DDL.\n *\n * Install as optional peer: `npm install neo4j-driver`.\n */\n\nimport { ConfigurationError, DatabaseError } from \"../../errors/index.js\";\nimport type { MemoryRecord } from \"../../types/index.js\";\nimport {\n entityIdFrom,\n rowToMemoryRecord,\n serializeMetadata,\n} from \"../memory-node.js\";\nimport type {\n GetRelatedOptions,\n GraphEntityInput,\n GraphHealthResult,\n GraphProvider,\n} from \"../types.js\";\n\ntype Neo4jRecord = {\n get: (key: string) => unknown;\n keys: string[];\n toObject: () => Record<string, unknown>;\n};\n\ntype Neo4jResult = {\n records: Neo4jRecord[];\n};\n\ntype Neo4jSession = {\n run: (\n cypher: string,\n params?: Record<string, unknown>,\n ) => Promise<Neo4jResult>;\n close: () => Promise<void>;\n};\n\ntype Neo4jDriver = {\n session: (options?: { database?: string }) => Neo4jSession;\n verifyConnectivity: () => Promise<void>;\n close: () => Promise<void>;\n getServerInfo?: () => Promise<unknown>;\n};\n\ntype Neo4jModule = {\n driver: (\n url: string,\n auth: { username: string; password: string } | unknown,\n options?: Record<string, unknown>,\n ) => Neo4jDriver;\n auth: {\n basic: (username: string, password: string) => unknown;\n };\n};\n\nexport interface Neo4jGraphProviderOptions {\n /** Bolt / Neo4j URI (e.g. `neo4j://localhost:7687`). */\n url: string;\n /** Neo4j username. */\n username: string;\n /** Neo4j password. */\n password: string;\n /** Optional multi-database name (Neo4j 4+). */\n database?: string;\n}\n\n/**\n * Networked {@link GraphProvider} backed by Neo4j (`neo4j-driver` optional peer).\n */\nexport class Neo4jGraphProvider implements GraphProvider {\n readonly name = \"neo4j\";\n private readonly url: string;\n private readonly username: string;\n private readonly password: string;\n private readonly database: string | undefined;\n private driver: Neo4jDriver | null = null;\n private opened = false;\n\n /**\n * @param options - Bolt URL, credentials, and optional database name.\n */\n constructor(options: Neo4jGraphProviderOptions) {\n if (!options?.url?.trim()) {\n throw new ConfigurationError(\"neo4j graph requires a non-empty url\");\n }\n if (!options?.username?.trim()) {\n throw new ConfigurationError(\"neo4j graph requires a non-empty username\");\n }\n if (typeof options.password !== \"string\") {\n throw new ConfigurationError(\"neo4j graph requires a password string\");\n }\n this.url = options.url.trim();\n this.username = options.username.trim();\n this.password = options.password;\n this.database = options.database?.trim() || undefined;\n }\n\n /** Neo4j does not support local file snapshots for checkpoint pairing. */\n supportsFileSnapshot(): boolean {\n return false;\n }\n\n /** Always `null` — graph data lives in the remote Neo4j cluster. */\n getDataPath(): string | null {\n return null;\n }\n\n /** Connect to Neo4j, verify connectivity, and ensure uniqueness constraints. */\n async open(): Promise<void> {\n if (this.opened) return;\n\n let mod: Neo4jModule;\n try {\n mod = (await import(\"neo4j-driver\")) as unknown as Neo4jModule;\n } catch {\n throw new ConfigurationError(\n 'Neo4j graph requires the optional \"neo4j-driver\" package. Install it with: npm install neo4j-driver',\n );\n }\n\n this.driver = mod.driver(\n this.url,\n mod.auth.basic(this.username, this.password),\n );\n await this.driver.verifyConnectivity();\n this.opened = true;\n // Ensure uniqueness constraints (best-effort; Neo4j is schema-flexible).\n await this.withSession(async (session) => {\n try {\n await session.run(\n `CREATE CONSTRAINT memory_id IF NOT EXISTS FOR (m:Memory) REQUIRE m.id IS UNIQUE`,\n );\n } catch {\n /* older Neo4j / community editions may lack IF NOT EXISTS */\n }\n try {\n await session.run(\n `CREATE CONSTRAINT entity_id IF NOT EXISTS FOR (e:Entity) REQUIRE e.id IS UNIQUE`,\n );\n } catch {\n /* ignore */\n }\n });\n }\n\n /** Close the neo4j-driver connection. */\n async close(): Promise<void> {\n if (this.driver) {\n await this.driver.close();\n }\n this.driver = null;\n this.opened = false;\n }\n\n private requireDriver(): Neo4jDriver {\n if (!this.driver || !this.opened) {\n throw new DatabaseError(\"Neo4j graph is not open\", {\n operation: \"graph\",\n suggestion: \"Call ready() / open() before graph operations\",\n });\n }\n return this.driver;\n }\n\n private async withSession<T>(fn: (session: Neo4jSession) => Promise<T>): Promise<T> {\n const driver = this.requireDriver();\n const session = this.database\n ? driver.session({ database: this.database })\n : driver.session();\n try {\n return await fn(session);\n } finally {\n await session.close();\n }\n }\n\n private async run(\n cypher: string,\n params: Record<string, unknown> = {},\n ): Promise<Record<string, unknown>[]> {\n return this.withSession((session) =>\n this.runOnSession(session, cypher, params),\n );\n }\n\n private async runOnSession(\n session: Neo4jSession,\n cypher: string,\n params: Record<string, unknown> = {},\n ): Promise<Record<string, unknown>[]> {\n const result = await session.run(cypher, params);\n return result.records.map((rec) => {\n try {\n return rec.toObject();\n } catch {\n const obj: Record<string, unknown> = {};\n for (const key of rec.keys) {\n obj[key] = unwrapNeo4jValue(rec.get(key));\n }\n return obj;\n }\n });\n }\n\n private async ensureMemoryNode(\n id: string,\n session?: Neo4jSession,\n ): Promise<void> {\n const cypher = `MERGE (m:Memory { id: $id })\n ON CREATE SET\n m.organization = '',\n m.agent = '',\n m.content_text = '',\n m.metadata_json = '{}',\n m.archived = false,\n m.compressed_into = '',\n m.created_at = '',\n m.updated_at = ''`;\n\n if (session) {\n await this.runOnSession(session, cypher, { id });\n return;\n }\n await this.run(cypher, { id });\n }\n\n /**\n * MERGE a directed `RELATED` relationship between two memory nodes.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - Relationship label stored on `RELATED.relation`.\n * @param metadata - Optional JSON metadata on the relationship.\n */\n async linkMemories(\n fromId: string,\n toId: string,\n relation: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n // Single session for the whole typed write (avoid 3 separate sessions).\n await this.withSession(async (session) => {\n await this.ensureMemoryNode(fromId, session);\n await this.ensureMemoryNode(toId, session);\n await this.runOnSession(\n session,\n `MATCH (a:Memory { id: $fromId }), (b:Memory { id: $toId })\n MERGE (a)-[r:RELATED { relation: $relation }]->(b)\n SET r.metadata_json = $metadata`,\n {\n fromId,\n toId,\n relation,\n metadata: serializeMetadata(metadata),\n },\n );\n });\n }\n\n /**\n * Delete `RELATED` relationship(s) between two memories.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - When set, only delete edges with this relation property.\n */\n async unlinkMemories(\n fromId: string,\n toId: string,\n relation?: string,\n ): Promise<void> {\n if (relation !== undefined) {\n await this.run(\n `MATCH (a:Memory { id: $fromId })-[r:RELATED { relation: $relation }]->(b:Memory { id: $toId })\n DELETE r`,\n { fromId, toId, relation },\n );\n return;\n }\n await this.run(\n `MATCH (a:Memory { id: $fromId })-[r:RELATED]->(b:Memory { id: $toId })\n DELETE r`,\n { fromId, toId },\n );\n }\n\n /**\n * Native Neo4j variable-length path traversal.\n * Relationship filter uses RELATED.relation property for parity with Kuzu.\n */\n async getRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const depth = Math.max(1, Math.min(options?.depth ?? 1, 16));\n const direction = options?.direction ?? \"both\";\n const relation = options?.relation;\n\n // Build direction-specific pattern. Depth is inlined (integer) — Neo4j\n // does not allow parameters inside [*1..n] in all versions.\n const pathPattern =\n direction === \"out\"\n ? `(start)-[:RELATED*1..${depth}]->(n:Memory)`\n : direction === \"in\"\n ? `(start)<-[:RELATED*1..${depth}]-(n:Memory)`\n : `(start)-[:RELATED*1..${depth}]-(n:Memory)`;\n\n const cypher = relation\n ? `MATCH (start:Memory { id: $id }), p = ${pathPattern}\n WHERE ALL(r IN relationships(p) WHERE r.relation = $relation)\n AND n.id <> $id\n RETURN DISTINCT\n n.id AS id, n.organization AS organization, n.agent AS agent,\n n.content_text AS content_text, n.metadata_json AS metadata_json,\n n.archived AS archived, n.compressed_into AS compressed_into,\n n.created_at AS created_at, n.updated_at AS updated_at`\n : `MATCH (start:Memory { id: $id }), p = ${pathPattern}\n WHERE n.id <> $id\n RETURN DISTINCT\n n.id AS id, n.organization AS organization, n.agent AS agent,\n n.content_text AS content_text, n.metadata_json AS metadata_json,\n n.archived AS archived, n.compressed_into AS compressed_into,\n n.created_at AS created_at, n.updated_at AS updated_at`;\n\n const params: Record<string, unknown> = { id: memoryId };\n if (relation !== undefined) params.relation = relation;\n\n const rows = await this.run(cypher, params);\n return rows.map((row) =>\n rowToMemoryRecord(unwrapRow(row)),\n );\n }\n\n /**\n * MERGE an `Entity` node keyed by deterministic id.\n *\n * @param entity - Entity name, type, and optional metadata.\n * @returns Stable entity id ({@link entityIdFrom}).\n */\n async upsertEntity(entity: GraphEntityInput): Promise<string> {\n const id = entityIdFrom(entity.name, entity.type);\n await this.run(\n `MERGE (e:Entity { id: $id })\n SET e.name = $name, e.type = $type, e.metadata_json = $metadata`,\n {\n id,\n name: entity.name,\n type: entity.type,\n metadata: serializeMetadata(entity.metadata),\n },\n );\n return id;\n }\n\n /**\n * MERGE a `MENTIONS` relationship from entity to memory.\n *\n * @param entityId - Entity id from {@link upsertEntity}.\n * @param memoryId - Target memory UUID.\n * @param role - Optional role string on the relationship.\n */\n async linkEntityToMemory(\n entityId: string,\n memoryId: string,\n role?: string,\n ): Promise<void> {\n // Single session for the whole typed write (avoid 3 separate sessions).\n await this.withSession(async (session) => {\n await this.ensureMemoryNode(memoryId, session);\n const found = await this.runOnSession(\n session,\n `MATCH (e:Entity { id: $id }) RETURN e.id AS id`,\n { id: entityId },\n );\n if (found.length === 0) {\n throw new DatabaseError(`Entity not found: ${entityId}`, {\n operation: \"linkEntityToMemory\",\n });\n }\n await this.runOnSession(\n session,\n `MATCH (e:Entity { id: $entityId }), (m:Memory { id: $memoryId })\n MERGE (e)-[r:MENTIONS]->(m)\n SET r.role = $role`,\n { entityId, memoryId, role: role ?? \"\" },\n );\n });\n }\n\n /**\n * DETACH DELETE the memory node and all incident relationships.\n *\n * @param memoryId - Wolbarg memory UUID.\n */\n async deleteMemory(memoryId: string): Promise<void> {\n await this.run(\n `MATCH (m:Memory { id: $id })\n DETACH DELETE m`,\n { id: memoryId },\n );\n }\n\n /**\n * Run arbitrary parameterized Cypher (escape hatch for advanced graph queries).\n *\n * @param cypher - Cypher query string.\n * @param params - Bound parameters for the query.\n * @returns Raw row objects from the driver.\n */\n async query(\n cypher: string,\n params?: Record<string, unknown>,\n ): Promise<unknown> {\n return this.run(cypher, params ?? {});\n }\n\n /** Verify connectivity and return server metadata when available. */\n async health(): Promise<GraphHealthResult> {\n try {\n if (!this.opened || !this.driver) {\n return { ok: false, backend: \"neo4j\", details: { reason: \"not open\" } };\n }\n await this.driver.verifyConnectivity();\n let serverInfo: unknown = undefined;\n if (typeof this.driver.getServerInfo === \"function\") {\n serverInfo = await this.driver.getServerInfo();\n }\n return {\n ok: true,\n backend: \"neo4j\",\n details: {\n url: this.url,\n database: this.database ?? \"default\",\n networked: true,\n serverInfo,\n },\n };\n } catch (error) {\n return {\n ok: false,\n backend: \"neo4j\",\n details: {\n url: this.url,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n}\n\nfunction unwrapNeo4jValue(value: unknown): unknown {\n if (value == null) return value;\n if (typeof value === \"object\" && value !== null && \"toNumber\" in value) {\n try {\n return (value as { toNumber: () => number }).toNumber();\n } catch {\n /* Integer overflow — keep as-is */\n }\n }\n if (typeof value === \"object\" && value !== null && \"properties\" in value) {\n return unwrapRow(\n (value as { properties: Record<string, unknown> }).properties,\n );\n }\n return value;\n}\n\nfunction unwrapRow(row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = unwrapNeo4jValue(v);\n }\n return out;\n}\n","/**\n * Configuration validation for SDK initialization and constructor options.\n *\n * All validators throw {@link ConfigurationError} or {@link ValidationError}\n * with field-scoped messages suitable for IDE hover documentation.\n */\n\nimport type {\n WolbargOptions,\n StorageInput,\n GraphInput,\n} from \"./options.js\";\nimport {\n isEmbeddingProvider,\n isGraphProvider,\n isLlmProvider,\n isStorageProvider,\n isTelemetryProvider,\n resolveDatabaseUrl,\n} from \"./options.js\";\nimport type {\n DatabaseConfig,\n EmbeddingConfig,\n EmbeddingCacheConfig,\n InitOptions,\n LlmConfig,\n MemoryDedupeConfig,\n StorageConfig,\n TelemetryConfig,\n RetrievalConfig,\n} from \"../types/index.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport { SqliteGraphProvider } from \"../graph/providers/sqlite-graph.js\";\nimport { Neo4jGraphProvider } from \"../graph/providers/neo4j.js\";\nimport type { GraphConfig, GraphProvider } from \"../graph/types.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 assertFiniteNumber(value: unknown, fieldName: string): asserts value is number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ConfigurationError(`${fieldName} must be a finite number`);\n }\n}\n\nfunction assertNumberMin(value: number, fieldName: string, min: number): void {\n if (!Number.isFinite(value) || value < min) {\n throw new ConfigurationError(`${fieldName} must be >= ${min}`);\n }\n}\n\nfunction assertNumberInRange(\n value: number,\n fieldName: string,\n min: number,\n max: number,\n): void {\n if (!Number.isFinite(value) || value < min || value > max) {\n throw new ConfigurationError(`${fieldName} must be between ${min} and ${max}`);\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\n/**\n * Validate and normalize embedding provider configuration.\n *\n * @param config - Raw embedding config from `wolbarg({ embedding })`.\n * @returns Trimmed, normalized config with trailing slashes removed from `baseUrl`.\n * @throws {@link ConfigurationError} when required fields are missing or invalid.\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\n/**\n * Validate and normalize LLM provider configuration.\n *\n * @param config - Raw LLM config from `wolbarg({ llm })`.\n * @returns Normalized config with validated temperature and token limits.\n * @throws {@link ConfigurationError} when URLs, models, or numeric ranges are invalid.\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\nfunction validateRetrievalConfig(config: RetrievalConfig): RetrievalConfig {\n if (config === null || typeof config !== \"object\") {\n throw new ConfigurationError(\"retrieval must be an object\");\n }\n\n const out: RetrievalConfig = {};\n\n if (config.overFetchFactor !== undefined) {\n assertFiniteNumber(config.overFetchFactor, \"retrieval.overFetchFactor\");\n assertNumberMin(config.overFetchFactor, \"retrieval.overFetchFactor\", 0);\n if (config.overFetchFactor <= 0) {\n throw new ConfigurationError(\"retrieval.overFetchFactor must be > 0\");\n }\n out.overFetchFactor = config.overFetchFactor;\n }\n\n if (config.hybrid !== undefined) {\n if (config.hybrid === null || typeof config.hybrid !== \"object\") {\n throw new ConfigurationError(\"retrieval.hybrid must be an object\");\n }\n const hybrid = config.hybrid;\n const outHybrid: NonNullable<RetrievalConfig[\"hybrid\"]> = {};\n\n if (hybrid.semanticWeight !== undefined) {\n assertFiniteNumber(hybrid.semanticWeight, \"retrieval.hybrid.semanticWeight\");\n if (hybrid.semanticWeight < 0) {\n throw new ConfigurationError(\n \"retrieval.hybrid.semanticWeight must be >= 0\",\n );\n }\n outHybrid.semanticWeight = hybrid.semanticWeight;\n }\n\n if (hybrid.keywordWeight !== undefined) {\n assertFiniteNumber(hybrid.keywordWeight, \"retrieval.hybrid.keywordWeight\");\n if (hybrid.keywordWeight < 0) {\n throw new ConfigurationError(\n \"retrieval.hybrid.keywordWeight must be >= 0\",\n );\n }\n outHybrid.keywordWeight = hybrid.keywordWeight;\n }\n\n if (Object.keys(outHybrid).length > 0) {\n out.hybrid = outHybrid;\n }\n }\n\n if (config.mmr !== undefined) {\n if (config.mmr === null || typeof config.mmr !== \"object\") {\n throw new ConfigurationError(\"retrieval.mmr must be an object\");\n }\n const mmr = config.mmr;\n const outMmr: NonNullable<RetrievalConfig[\"mmr\"]> = {};\n\n if (mmr.lambda !== undefined) {\n assertFiniteNumber(mmr.lambda, \"retrieval.mmr.lambda\");\n assertNumberInRange(mmr.lambda, \"retrieval.mmr.lambda\", 0, 1);\n outMmr.lambda = mmr.lambda;\n }\n\n if (Object.keys(outMmr).length > 0) {\n out.mmr = outMmr;\n }\n }\n\n return out;\n}\n\nfunction validateMemoryDedupeConfig(config: MemoryDedupeConfig): MemoryDedupeConfig {\n if (config === null || typeof config !== \"object\") {\n throw new ConfigurationError(\"memory.dedupe must be an object\");\n }\n const out: MemoryDedupeConfig = {};\n\n if (config.enabled !== undefined) {\n if (typeof config.enabled !== \"boolean\") {\n throw new ConfigurationError(\"memory.dedupe.enabled must be a boolean\");\n }\n out.enabled = config.enabled;\n }\n\n if (config.strategy !== undefined) {\n const allowed = new Set([\"exact\", \"near\", \"exact-or-near\"]);\n if (!allowed.has(config.strategy)) {\n throw new ConfigurationError(\n `memory.dedupe.strategy must be one of ${Array.from(allowed).join(\", \")}`,\n );\n }\n out.strategy = config.strategy;\n }\n\n if (config.nearThreshold !== undefined) {\n assertFiniteNumber(config.nearThreshold, \"memory.dedupe.nearThreshold\");\n assertNumberInRange(\n config.nearThreshold,\n \"memory.dedupe.nearThreshold\",\n 0,\n 1,\n );\n out.nearThreshold = config.nearThreshold;\n }\n\n if (config.nearCandidateLimit !== undefined) {\n assertFiniteNumber(\n config.nearCandidateLimit,\n \"memory.dedupe.nearCandidateLimit\",\n );\n assertNumberMin(\n config.nearCandidateLimit,\n \"memory.dedupe.nearCandidateLimit\",\n 1,\n );\n out.nearCandidateLimit = config.nearCandidateLimit;\n }\n\n return out;\n}\n\nfunction validateEmbeddingCacheConfig(\n config: EmbeddingCacheConfig,\n): EmbeddingCacheConfig {\n if (config === null || typeof config !== \"object\") {\n throw new ConfigurationError(\"embeddingCache must be an object\");\n }\n\n const out: EmbeddingCacheConfig = {};\n\n if (config.enabled !== undefined) {\n if (typeof config.enabled !== \"boolean\") {\n throw new ConfigurationError(\"embeddingCache.enabled must be a boolean\");\n }\n out.enabled = config.enabled;\n }\n\n if (config.ttlMs !== undefined) {\n assertFiniteNumber(config.ttlMs, \"embeddingCache.ttlMs\");\n if (config.ttlMs < 0) {\n throw new ConfigurationError(\"embeddingCache.ttlMs must be >= 0\");\n }\n out.ttlMs = config.ttlMs;\n }\n\n if (config.maxEntries !== undefined) {\n assertFiniteNumber(config.maxEntries, \"embeddingCache.maxEntries\");\n if (config.maxEntries < 0) {\n throw new ConfigurationError(\"embeddingCache.maxEntries must be >= 0\");\n }\n out.maxEntries = config.maxEntries;\n }\n\n return out;\n}\n\n/**\n * Normalize SQLite or PostgreSQL database configuration.\n *\n * Resolves `url` / `connectionString` aliases and validates the provider name.\n *\n * @param config - Storage or database config object.\n * @returns Normalized {@link DatabaseConfig} with both `url` and `connectionString` set.\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 ...(\"durableWrites\" in config && config.durableWrites !== undefined\n ? { durableWrites: config.durableWrites }\n : {}),\n };\n }\n return {\n provider: \"sqlite\",\n connectionString,\n url: connectionString,\n };\n}\n\n/**\n * Validate telemetry configuration (independent database from memory storage).\n *\n * @param config - Telemetry block from `wolbarg({ telemetry })`.\n * @returns Normalized config with defaults for capture flags and log level.\n * @throws {@link ConfigurationError} for unsupported providers (Neo4j/Kuzu) or missing URL.\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 const providerName = String(\n (config.database as { provider?: string }).provider ?? \"\",\n );\n if (providerName === \"kuzu\" || providerName === \"neo4j\") {\n throw new ConfigurationError(\n `telemetry supports sqlite or postgres only (got \"${providerName}\")`,\n {\n reason: `provider=${providerName}`,\n suggestion:\n 'Use telemetry: { database: { provider: \"sqlite\", url: \"./telemetry.db\" } }. Graph backends (kuzu/neo4j) are not valid telemetry stores.',\n },\n );\n }\n if (config.database.provider !== \"sqlite\") {\n throw new ConfigurationError(\n `Unsupported telemetry provider \"${config.database.provider}\". Only \"sqlite\" is implemented; PostgreSQL typed but not implemented. Telemetry supports sqlite or postgres only — not kuzu/neo4j.`,\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 compatibility entry point).\n *\n * @param options - Legacy `init()` shape with organization, database, embedding, optional llm.\n * @returns Trimmed organization and normalized nested configs.\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\n/**\n * Validate and normalize the full `wolbarg()` constructor options object.\n *\n * Resolves storage/database aliases, validates retrieval, dedupe, embedding cache,\n * telemetry, and graph inputs.\n *\n * @param options - Raw constructor options.\n * @returns Normalized options safe for Wolbarg construction.\n * @throws {@link ConfigurationError} on invalid or conflicting configuration.\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 checkpointDirectory =\n options.checkpointDirectory !== undefined\n ? (() => {\n assertNonEmpty(options.checkpointDirectory, \"checkpointDirectory\");\n return options.checkpointDirectory.trim();\n })()\n : undefined;\n\n const storageInput = resolveStorageInput(options);\n let storage: StorageInput = storageInput;\n if (!isStorageProvider(storageInput)) {\n storage = normalizeDatabaseConfig(storageInput);\n }\n\n if (\n !isStorageProvider(storageInput) &&\n storageInput.provider === \"postgres\" &&\n storageInput.maxPoolSize !== undefined\n ) {\n assertFiniteNumber(\n storageInput.maxPoolSize,\n \"database.maxPoolSize\",\n );\n assertNumberMin(storageInput.maxPoolSize, \"database.maxPoolSize\", 1);\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 let graph = options.graph;\n if (graph !== undefined) {\n graph = resolveGraphInput(graph);\n }\n\n const retrieval =\n options.retrieval !== undefined ? validateRetrievalConfig(options.retrieval) : undefined;\n\n const embeddingCache =\n options.embeddingCache !== undefined\n ? validateEmbeddingCacheConfig(options.embeddingCache)\n : undefined;\n\n const memory =\n options.memory !== undefined && options.memory.dedupe !== undefined\n ? { ...options.memory, dedupe: validateMemoryDedupeConfig(options.memory.dedupe) }\n : options.memory;\n\n return {\n ...options,\n organization: options.organization.trim(),\n storage,\n database: undefined,\n ...(telemetry ? { telemetry } : {}),\n ...(graph !== undefined ? { graph } : {}),\n ...(retrieval !== undefined ? { retrieval } : {}),\n ...(embeddingCache !== undefined ? { embeddingCache } : {}),\n ...(checkpointDirectory !== undefined ? { checkpointDirectory } : {}),\n ...(memory !== undefined ? { memory } : {}),\n };\n}\n\n/**\n * Accept a {@link GraphProvider} instance or `{ provider: \"sqlite\" | \"neo4j\", … }` config.\n *\n * Instantiates built-in SQLite / Neo4j providers from config objects.\n *\n * @param input - Graph provider instance or config.\n * @returns Resolved {@link GraphProvider} ready for `open()`.\n * @throws {@link ConfigurationError} on garbage input or unsupported provider names.\n *\n * @example\n * ```ts\n * const graph = resolveGraphInput({ provider: \"sqlite\", path: \"./graph.db\" });\n * ```\n */\nexport function resolveGraphInput(input: GraphInput): GraphProvider {\n if (input == null || typeof input !== \"object\") {\n throw new ConfigurationError(\n \"graph must be a GraphProvider instance or a config object\",\n {\n suggestion:\n \"Use graph: sqliteGraph({ path }) or graph: neo4jGraph({ url, username, password })\",\n },\n );\n }\n if (Array.isArray(input)) {\n throw new ConfigurationError(\n \"graph must be a GraphProvider instance or a config object\",\n {\n suggestion:\n \"Use graph: sqliteGraph({ path }) or graph: neo4jGraph({ url, username, password })\",\n },\n );\n }\n if (isGraphProvider(input)) {\n return input;\n }\n const config = input as GraphConfig;\n if (config.provider === \"sqlite\") {\n if (typeof config.path !== \"string\" || !config.path.trim()) {\n throw new ConfigurationError(\n 'graph sqlite config requires a non-empty \"path\"',\n );\n }\n return new SqliteGraphProvider({ path: config.path });\n }\n if (config.provider === \"neo4j\") {\n if (typeof config.url !== \"string\" || !config.url.trim()) {\n throw new ConfigurationError('graph neo4j config requires a non-empty \"url\"');\n }\n if (typeof config.username !== \"string\" || !config.username.trim()) {\n throw new ConfigurationError(\n 'graph neo4j config requires a non-empty \"username\"',\n );\n }\n if (typeof config.password !== \"string\") {\n throw new ConfigurationError('graph neo4j config requires a \"password\" string');\n }\n return new Neo4jGraphProvider({\n url: config.url,\n username: config.username,\n password: config.password,\n database: config.database,\n });\n }\n throw new ConfigurationError(\n `Unsupported graph provider \"${String((config as { provider?: string }).provider)}\". Supported: \"sqlite\", \"neo4j\", or a GraphProvider instance.`,\n {\n suggestion:\n 'Use graph: sqliteGraph({ path: \"./local-graph.db\" }) or graph: neo4jGraph({ url, username, password })',\n },\n );\n}\n","/**\n * Trace context helpers — `session_id`, `trace_id`, `parent_trace_id`.\n *\n * Used by {@link TelemetryEmitter} to correlate memory operations in Studio.\n */\n\nimport { createId } from \"../utils/index.js\";\n\n/** Distributed trace context attached to telemetry events. */\nexport interface TraceContext {\n /** Wolbarg instance session id (stable for process lifetime). */\n sessionId: string;\n /** Unique id for this operation span. */\n traceId: string;\n /** Parent span id when nested, else `null`. */\n parentTraceId: string | null;\n}\n\n/** Create a new session id (UUID v4). */\nexport function createSessionId(): string {\n return createId();\n}\n\n/** Create a new trace id (UUID v4). */\nexport function createTraceId(): string {\n return createId();\n}\n\n/**\n * Create a root trace context for a top-level operation.\n *\n * @param sessionId - Session from {@link createSessionId} or {@link TelemetryEmitter.sessionId}.\n */\nexport function createRootTrace(sessionId: string): TraceContext {\n return {\n sessionId,\n traceId: createTraceId(),\n parentTraceId: null,\n };\n}\n\n/**\n * Create a child trace linked to a parent span.\n *\n * @param parent - Parent operation trace context.\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\n/** No-op telemetry provider used when observability is disabled. */\nexport class NoopTelemetryProvider implements TelemetryProvider {\n readonly name = \"noop\";\n\n /** @inheritdoc TelemetryProvider.open */\n async open(): Promise<void> {}\n /** @inheritdoc TelemetryProvider.close */\n async close(): Promise<void> {}\n /** @inheritdoc TelemetryProvider.emit */\n emit(_event: TelemetryEventInput): void {}\n /** @inheritdoc TelemetryProvider.flush */\n async flush(): Promise<void> {}\n}\n\n/**\n * Handle for an in-flight traced operation.\n *\n * Created by {@link TelemetryEmitter.start}. Call `success()` or `failure()`\n * exactly once when the operation completes.\n */\nexport interface OperationTraceHandle {\n /** Distributed trace context (session, trace, parent ids). */\n context: TraceContext;\n /** `performance.now()` at operation start. */\n startedAt: number;\n /** Partial latency breakdown filled via {@link OperationTraceHandle.mark}. */\n latency: Partial<LatencyBreakdown>;\n /** Start a child trace for nested operations. */\n child(operation: TelemetryOperation): OperationTraceHandle;\n /** Record stage latency in milliseconds. */\n mark(stage: keyof Omit<LatencyBreakdown, \"totalMs\">, ms: number): void;\n /** Emit a successful completion event. */\n success(fields?: Partial<TelemetryEventInput>): void;\n /** Emit a failed completion event. */\n failure(error: unknown, fields?: Partial<TelemetryEventInput>): void;\n}\n\n/** Default organization injected into events when not overridden per-call. */\nexport interface TelemetryEmitterContext {\n /** Organization namespace from Wolbarg constructor. */\n organization?: string | null;\n}\n\n/**\n * Async telemetry emitter — never blocks memory operations.\n *\n * Wraps a {@link TelemetryProvider} with session/trace lifecycle helpers and\n * configurable capture flags (queries, latency, errors, similarity scores).\n */\nexport class TelemetryEmitter {\n /** Stable session id for this Wolbarg instance lifetime. */\n readonly sessionId: string;\n /** Structured logger gated by telemetry log level. */\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 /**\n * @param provider - Telemetry backend, or `null` for {@link NoopTelemetryProvider}.\n * @param config - Capture flags and log level.\n * @param context - Default organization injected into events.\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 /** Whether telemetry is enabled and backed by a non-noop provider. */\n get enabled(): boolean {\n return this.config.enabled && this.provider.name !== \"noop\";\n }\n\n /** Replace the underlying telemetry provider (e.g. after lazy init). */\n setProvider(provider: TelemetryProvider): void {\n this.provider = provider;\n }\n\n /** Open the underlying telemetry provider when enabled. */\n async open(): Promise<void> {\n if (!this.config.enabled) {\n return;\n }\n await this.provider.open();\n }\n\n /** Flush pending events and close the telemetry provider. */\n async close(): Promise<void> {\n await this.provider.flush();\n await this.provider.close();\n }\n\n /** Flush pending telemetry events without closing the provider. */\n async flush(): Promise<void> {\n await this.provider.flush();\n }\n\n /**\n * Begin tracing an operation.\n *\n * @param operation - Public telemetry operation name.\n * @param parent - Optional parent trace for nested spans.\n * @returns Handle — call `success()` or `failure()` when done.\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 (!self.config.enabled) {\n return;\n }\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 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 /** Emit a startup telemetry event. */\n emitStartup(provider: string): void {\n const trace = this.start(\"startup\");\n trace.success({ provider });\n }\n\n /** Emit a shutdown telemetry event. */\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 /**\n * @param options.url - Path to the telemetry SQLite file.\n * @param options.readonly - Open read-only (Studio / analytics).\n */\n constructor(options: SqliteEventDatabaseOptions) {\n this.url = options.url;\n this.readonly = options.readonly ?? false;\n }\n\n /** Open the telemetry database and run schema migrations. */\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 /** Close the telemetry database connection. */\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 /** Insert one normalized telemetry event row. */\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 /** Insert many events in a single transaction. */\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 /** Query telemetry events with filters, sort, and pagination. */\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 // Exact membership match (avoid substring false-positives).\n clauses.push(\n `EXISTS (SELECT 1 FROM json_each(memory_ids_json) WHERE json_each.value = ?)`,\n );\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 /** Fetch one event by primary key. */\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 /** Count events optionally filtered by time and operation. */\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\nconst MAX_QUEUE_SIZE = 10_000;\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 private warnedQueueDrop = false;\n private warnedFlushFailure = false;\n\n /**\n * @param options.url - Path to the independent telemetry SQLite database file.\n */\n constructor(options: SqliteTelemetryProviderOptions) {\n this.db = new SqliteEventDatabase({ url: options.url });\n }\n\n /** Open the telemetry EventDatabase (lazy — also invoked on first emit). */\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 /** Flush pending events and close the telemetry database. */\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 /**\n * Enqueue a telemetry event for async persistence (never throws).\n *\n * @param event - Partial or complete {@link TelemetryEventInput}.\n */\n emit(event: TelemetryEventInput): void {\n if (this.closed) {\n return;\n }\n if (this.queue.length >= MAX_QUEUE_SIZE) {\n // Drop oldest to keep memory bounded under sustained write failures.\n this.queue.shift();\n if (!this.warnedQueueDrop) {\n this.warnedQueueDrop = true;\n console.warn(\n `[wolbarg telemetry] event queue capped at ${MAX_QUEUE_SIZE}; dropping oldest events`,\n );\n }\n }\n this.queue.push(event);\n void this.scheduleFlush();\n }\n\n /** Block until all queued events are written (or dropped on failure). */\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 /** Query persisted telemetry events with filters and pagination. */\n async query(options: TelemetryQuery): Promise<TelemetryQueryResult> {\n await this.open();\n return this.db.query(options);\n }\n\n /** Fetch a single telemetry event by id. */\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 (error) {\n // Telemetry must never crash the host application.\n // Drop failed batch rather than re-queue forever.\n if (!this.warnedFlushFailure) {\n this.warnedFlushFailure = true;\n console.warn(\n `[wolbarg telemetry] flush failed; dropping batch: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\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\";\nimport { SDK_VERSION } from \"../../version.js\";\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 /**\n * @param options.directory - Folder for `.json` metadata and `.db` snapshot files.\n */\n constructor(options?: SqliteCheckpointProviderOptions) {\n this.directory =\n options?.directory ??\n path.resolve(process.cwd(), \".wolbarg\", \"checkpoints\");\n }\n\n /** Ensure the checkpoint directory exists. */\n async open(): Promise<void> {\n fs.mkdirSync(this.directory, { recursive: true });\n this.ready = true;\n }\n\n /** Mark the provider closed (does not delete snapshots). */\n async close(): Promise<void> {\n this.ready = false;\n }\n\n /**\n * Create an immutable SQLite backup of `sourcePath` under a unique name.\n *\n * @param name - Checkpoint label (must not already exist).\n * @param sourcePath - Live memory database path to snapshot.\n * @param options.description - Optional human-readable description stored in metadata.\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 const tmpSnapshotPath = `${snapshotPath}.tmp-${Date.now()}`;\n try {\n await safeSqliteBackup(resolvedSource, tmpSnapshotPath);\n } catch (error) {\n if (fs.existsSync(tmpSnapshotPath)) {\n fs.rmSync(tmpSnapshotPath, { force: true });\n }\n throw error;\n }\n\n const stats = fs.statSync(tmpSnapshotPath);\n if (fs.existsSync(snapshotPath)) {\n fs.rmSync(snapshotPath, { force: true });\n }\n fs.renameSync(tmpSnapshotPath, 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\n const tmpMetaPath = `${metaPath}.tmp-${Date.now()}`;\n fs.writeFileSync(tmpMetaPath, JSON.stringify(meta, null, 2), \"utf8\");\n fs.renameSync(tmpMetaPath, metaPath);\n return meta;\n }\n\n /**\n * Restore a named checkpoint over `targetPath` (replaces WAL/SHM side files).\n *\n * @param name - Existing checkpoint name.\n * @param targetPath - Live memory database path to overwrite.\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 /** Delete checkpoint metadata and snapshot files for `name`. */\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 /** List all checkpoints sorted by creation time. */\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 /** Load checkpoint metadata by name, or `null` if missing / corrupt. */\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 /**\n * Consistent SQLite file backup (WAL checkpoint + backup API / copy).\n * Used for memory snapshots and for secondary files such as the graph DB.\n */\n async backupSqliteFile(sourcePath: string, destPath: string): Promise<void> {\n this.requireReady();\n const resolved = resolveDbPath(sourcePath);\n if (resolved === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot backup an in-memory database. Use a file-backed SQLite database.\",\n );\n }\n if (!fs.existsSync(resolved)) {\n throw new DatabaseError(\n `SQLite file not found at ${resolved}`,\n {\n suggestion: \"Ensure the source database exists before backing up.\",\n },\n );\n }\n await safeSqliteBackup(resolved, destPath);\n }\n\n /**\n * Snapshot a secondary SQLite file (typically the graph DB) next to a named\n * memory checkpoint as `{name}.graph.db`.\n */\n async checkpointGraph(\n name: string,\n graphSourcePath: string,\n ): Promise<string> {\n this.requireReady();\n assertCheckpointName(name);\n const dest = this.graphSnapshotPath(name);\n await this.backupSqliteFile(graphSourcePath, dest);\n return dest;\n }\n\n /**\n * Restore a previously snapshotted graph SQLite file into `targetPath`.\n */\n async rollbackGraph(name: string, targetPath: string): Promise<void> {\n this.requireReady();\n const snapshot = this.graphSnapshotPath(name);\n if (!fs.existsSync(snapshot)) {\n return;\n }\n const resolvedTarget = resolveDbPath(targetPath);\n if (resolvedTarget === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot rollback graph into an in-memory database.\",\n );\n }\n fs.mkdirSync(path.dirname(resolvedTarget), { recursive: true });\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(snapshot, resolvedTarget);\n }\n\n /** Absolute path of the graph snapshot for a named checkpoint, if present. */\n graphSnapshotPath(name: string): string {\n return path.join(this.directory, `${sanitize(name)}.graph.db`);\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 * In-process EventEmitter backend for SQLite subscribe().\n *\n * Limitation: only delivers events within the same Node.js process.\n */\n\nimport { EventEmitter } from \"node:events\";\nimport type {\n MemoryChangeCallback,\n MemoryChangeEvent,\n SubscribeBackend,\n SubscribeFilter,\n SubscribableEvent,\n Unsubscribe,\n} from \"./types.js\";\n\ninterface Subscription {\n filter: SubscribeFilter;\n callback: MemoryChangeCallback;\n}\n\nfunction matchesFilter(\n filter: SubscribeFilter,\n event: MemoryChangeEvent,\n): boolean {\n if (filter.organization !== event.organization) {\n return false;\n }\n if (filter.agent !== undefined && filter.agent !== event.agent) {\n return false;\n }\n if (filter.event === undefined) {\n return true;\n }\n const events = Array.isArray(filter.event) ? filter.event : [filter.event];\n return events.some(\n (e: SubscribableEvent) => e === \"*\" || e === event.event,\n );\n}\n\n/** In-process {@link SubscribeBackend} for SQLite (same Node.js process only). */\nexport class SqliteSubscribeEmitter implements SubscribeBackend {\n private readonly emitter = new EventEmitter();\n private readonly subscriptions = new Map<number, Subscription>();\n private nextId = 1;\n private closed = false;\n\n constructor() {\n this.emitter.setMaxListeners(0);\n this.emitter.on(\"change\", (event: MemoryChangeEvent) => {\n for (const sub of this.subscriptions.values()) {\n if (!matchesFilter(sub.filter, event)) {\n continue;\n }\n try {\n sub.callback(event);\n } catch (error) {\n // Never crash the write path.\n console.error(\n \"[wolbarg] subscribe callback error:\",\n error instanceof Error ? error.message : error,\n );\n }\n }\n });\n }\n\n /**\n * Register a filtered callback for in-process memory change events.\n *\n * @param filter - Organization / agent / event-type filter.\n * @param callback - Invoked synchronously on each matching emit.\n * @returns Unsubscribe function.\n */\n subscribe(\n filter: SubscribeFilter,\n callback: MemoryChangeCallback,\n ): Unsubscribe {\n if (this.closed) {\n throw new Error(\"Subscribe backend is closed\");\n }\n const id = this.nextId++;\n this.subscriptions.set(id, { filter, callback });\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /** Emit a memory change event to registered subscribers. */\n emit(event: MemoryChangeEvent): void {\n if (this.closed) {\n return;\n }\n this.emitter.emit(\"change\", event);\n }\n\n /** Remove all listeners and mark the emitter closed. */\n async close(): Promise<void> {\n this.closed = true;\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n}\n","/**\n * Wolbarg — modular semantic memory SDK for AI agents (v0.5.5).\n *\n * Construct with {@link wolbarg} or `new Wolbarg(options)`. Pass provider\n * **instances** (custom implementations) or **configs / factory helpers**\n * for embedding, LLM, storage, graph, and optional plugins.\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 * // Optional — required for compress() and rememberFromMessages({ mode: \"extract\" })\n * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\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 fs from \"node:fs\";\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 {\n resolveEmbeddingCacheConfig,\n withEmbeddingCache,\n type ResolvedEmbeddingCacheConfig,\n} from \"../embedding/cache.js\";\nimport {\n MemoryEmbeddingCacheStore,\n PostgresEmbeddingCacheStore,\n SqliteEmbeddingCacheStore,\n} from \"../embedding/cache-store.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 hashMemoryContent,\n mergeMemoryMetadata,\n resolveMemoryDedupeConfig,\n type ResolvedMemoryDedupeConfig,\n} from \"../memory/dedupe.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 GraphCheckpointNotSupportedError,\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 MemoryMetadata,\n MemoryRecord,\n RecallExplainResponse,\n RecallExplanationHit,\n RecallOptions,\n RecallResult,\n RememberOptions,\n RememberResult,\n ConversationMessage,\n RememberFromMessagesOptions,\n RetrievalConfig,\n StatsResult,\n} from \"../types/index.js\";\nimport {\n normalizeConversationMessages,\n resolveRememberFromMessagesOptions,\n selectRawUserTexts,\n buildExtractMessages,\n parseExtractedFacts,\n} from \"../memory/from-messages.js\";\nimport type { GraphProvider, GetRelatedOptions } from \"../graph/types.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 WolbargLogger,\n} from \"../telemetry/index.js\";\nimport type { PersistedRecallExplainPayload } from \"../telemetry/index.js\";\nimport type { OperationTraceHandle } from \"../telemetry/emitter.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\";\nimport { PostgresStorageProvider } from \"../storage/providers/postgres.js\";\nimport {\n SqliteSubscribeEmitter,\n createPostgresListenerFromPool,\n type MemoryChangeEvent,\n type SubscribeBackend,\n type SubscribeFilter,\n type Unsubscribe,\n} from \"../subscribe/index.js\";\n\ntype ReadyState = {\n storage: StorageProvider;\n embedding: EmbeddingProvider;\n organization: string;\n};\n\nconst warnLogger = new WolbargLogger(\"warn\");\nlet warnedHybridNoKeyword = false;\nlet warnedRerankNoProvider = false;\n\n/**\n * Main Wolbarg facade: remember / recall / ingest / graph / checkpoints.\n *\n * @typeParam HasLlm - `true` when constructed with an `llm` (enables\n * {@link Wolbarg.compress} at the type level).\n */\nexport class Wolbarg<HasLlm extends boolean = false> {\n /** Compile-time marker: `true` when an LLM was configured at construction. */\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 graph: GraphProvider | 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 private subscribeBackend: SubscribeBackend | null = null;\n private pgListenBackend: SubscribeBackend | null = null;\n private memoryDedupe: ResolvedMemoryDedupeConfig = resolveMemoryDedupeConfig();\n private embeddingCacheConfig: ResolvedEmbeddingCacheConfig =\n resolveEmbeddingCacheConfig();\n private rawEmbedding: EmbeddingProvider | null = null;\n\n /**\n * Create a Wolbarg instance with an LLM (enables {@link Wolbarg.compress}).\n *\n * @param options - See {@link WolbargOptionsWithLlm}. `llm` may be a custom\n * {@link LlmProvider} (`{ model, complete, validate }`) or a config /\n * factory result such as {@link openaiLlm}.\n */\n constructor(options: WolbargOptionsWithLlm);\n /**\n * Create a Wolbarg instance without an LLM (compress / extract mode unavailable).\n *\n * @param options - See {@link WolbargOptionsWithoutLlm}.\n */\n constructor(options: WolbargOptionsWithoutLlm);\n /**\n * Empty constructor for the legacy {@link Wolbarg.init} flow.\n * Prefer passing options to the constructor or {@link wolbarg}.\n */\n constructor();\n /**\n * @param options - Full {@link WolbargOptions}. Key fields:\n * - `organization` — namespace isolating memories in a shared DB\n * - `database` / `storage` — SQLite/Postgres config **or** a custom\n * {@link StorageProvider} instance\n * - `embedding` — {@link EmbeddingProvider} instance **or**\n * {@link EmbeddingConfig} / {@link openaiEmbedding} (etc.)\n * - `llm` — optional {@link LlmProvider} or {@link LlmConfig} / {@link openaiLlm};\n * required for {@link Wolbarg.compress} and extract-mode\n * {@link Wolbarg.rememberFromMessages}\n * - `graph`, `telemetry`, `reranker`, `keywordSearch`, `ocr`, `vision`,\n * `compression`, `chunking`, `retrieval`, `concurrency`, `embeddingCache`,\n * `memory.dedupe` — optional plugins / tuning\n */\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 this.memoryDedupe = resolveMemoryDedupeConfig(validated.memory?.dedupe);\n this.embeddingCacheConfig = resolveEmbeddingCacheConfig(\n validated.embeddingCache,\n );\n\n const storageInput = validated.storage!;\n this.storage = isStorageProvider(storageInput)\n ? storageInput\n : createStorageProvider(storageInput, {\n concurrency: validated.concurrency,\n });\n\n if (!isStorageProvider(storageInput)) {\n this.memoryDbPath = resolveDatabaseUrl(storageInput);\n } else if (storageInput instanceof SqliteStorageProvider) {\n this.memoryDbPath = storageInput.path;\n }\n\n const embedding = isEmbeddingProvider(validated.embedding)\n ? validated.embedding\n : createEmbeddingProvider(validated.embedding);\n this.rawEmbedding = embedding;\n this.embedding = 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 if (validated.graph) {\n this.graph = validated.graph as GraphProvider;\n }\n this.chunking = validated.chunking ?? null;\n this.retrievalConfig = validated.retrieval ?? {};\n\n // In-process subscribe backend (SQLite limitation: same process only).\n this.subscribeBackend = new SqliteSubscribeEmitter();\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 * Prefer constructing with options + {@link Wolbarg.ready} instead.\n *\n * @param options - Organization, database, embedding, and optional LLM config.\n * @returns Resolves when storage is open and the vector schema is ready.\n * @throws {InitializationError} If already initialized.\n * @throws {ConfigurationError} | {ValidationError} On invalid options.\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 // v0.1 init() path: default-on embedding cache wrapper expects\n // `rawEmbedding` to be set (constructor sets it already).\n this.rawEmbedding = this.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 /**\n * Open storage, optional telemetry / checkpoint / graph providers, wrap the\n * embedding cache, and probe embedding dimensions. Safe to call multiple times;\n * concurrent callers share one boot promise.\n *\n * @returns Resolves when the instance is ready for remember/recall.\n * @throws {InitializationError} If neither constructor options nor {@link init} were used.\n */\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 /** Internal boot sequence invoked by {@link Wolbarg.ready}. */\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 await this.graph?.open();\n\n // Wrap embedding with transparent cache after storage is open.\n if (this.rawEmbedding && this.embeddingCacheConfig.enabled) {\n if (this.storage instanceof SqliteStorageProvider) {\n const sqlite = this.storage;\n const store = new SqliteEmbeddingCacheStore(() => sqlite.getDatabase(), {\n ttlMs: this.embeddingCacheConfig.ttlMs,\n });\n this.embedding = withEmbeddingCache(\n this.rawEmbedding,\n store,\n this.embeddingCacheConfig,\n );\n } else if (this.storage instanceof PostgresStorageProvider) {\n // L1-only by default — durable cache must not share the insert pool\n // (that caused cache speedup <1x under concurrent unique writes).\n this.embedding = withEmbeddingCache(\n this.rawEmbedding,\n new PostgresEmbeddingCacheStore(() => null, {\n ttlMs: this.embeddingCacheConfig.ttlMs,\n durable: false,\n }),\n this.embeddingCacheConfig,\n );\n } else {\n this.embedding = withEmbeddingCache(\n this.rawEmbedding,\n new MemoryEmbeddingCacheStore({\n ttlMs: this.embeddingCacheConfig.ttlMs,\n }),\n this.embeddingCacheConfig,\n );\n }\n }\n\n // Postgres LISTEN is deferred until the first subscribe() — opening a\n // dedicated connection on every ready() dominated cold start (~50-100ms).\n if (this.storage instanceof PostgresStorageProvider) {\n // Listener is created lazily in subscribe().\n }\n\n if (this.storage instanceof SqliteStorageProvider) {\n this.storage.setRetryLogger((msg) => {\n // debug-level retry visibility\n if (typeof console !== \"undefined\" && console.debug) {\n console.debug(`[wolbarg] ${msg}`);\n }\n });\n }\n\n // Prefer stored dimensions — skip embedding round-trip on warm reopen.\n const storedDims = await this.storage.getEmbeddingDimensions();\n if (storedDims !== null && storedDims > 0) {\n await this.storage.ensureVectorSchema(storedDims);\n this.embeddingDimensions = storedDims;\n } else {\n const probe = await this.embedding.validate();\n await this.storage.ensureVectorSchema(probe.dimensions);\n this.embeddingDimensions = probe.dimensions;\n }\n this.initialized = true;\n this.telemetry.emitStartup(this.storage.name);\n } catch (error) {\n await this.graph?.close().catch(() => undefined);\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 /**\n * Store a semantic memory for an agent. Embeds `content.text`, writes the row,\n * and may **upsert** an existing active memory when dedupe is enabled\n * (constructor `memory.dedupe` or per-call `options.dedupe`).\n *\n * @param options - Agent id, text content, optional metadata / dedupe overrides.\n * See {@link RememberOptions}.\n * @returns The stored record plus `action` (`\"created\"` | `\"updated\"`).\n * @throws {ValidationError} On empty agent/content.\n * @throws {InitializationError} If not configured / ready.\n */\n async remember(options: RememberOptions): Promise<RememberResult> {\n const trace = this.telemetry.start(\"remember\");\n try {\n const result = await this.rememberOne(options, trace);\n trace.success({\n provider: this.storage?.name,\n memoryIds: [result.id],\n returnedCount: 1,\n embeddingProvider: this.embedding?.model,\n model: this.embedding?.model,\n metadata: result.metadata,\n agentId: result.agent,\n tags: telemetryTags(result.metadata),\n extra: { upsertAction: result.action, action: result.action },\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"remember\", error);\n }\n }\n\n /**\n * Remember many memories in one call. Runs sequentially when any item (or the\n * global config) enables dedupe; otherwise embeds in batch and inserts in one\n * transaction for throughput.\n *\n * @param items - Non-empty list of {@link RememberOptions}.\n * @returns One {@link RememberResult} per input, same order.\n * @throws {ValidationError} If `items` is empty or an entry is invalid.\n */\n async rememberBatch(items: RememberOptions[]): Promise<RememberResult[]> {\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\n const anyDedupe = items.some((item) => {\n const cfg = resolveMemoryDedupeConfig(\n item.dedupe ?? this.memoryDedupe,\n );\n return cfg.enabled;\n }) || this.memoryDedupe.enabled;\n\n if (anyDedupe) {\n const out: RememberResult[] = [];\n for (const item of items) {\n const child = parent.child(\"remember\");\n const result = await this.rememberOne(item, child);\n child.success({\n provider: this.storage?.name,\n memoryIds: [result.id],\n returnedCount: 1,\n metadata: result.metadata,\n agentId: result.agent,\n tags: telemetryTags(result.metadata),\n extra: { upsertAction: result.action },\n });\n out.push(result);\n }\n parent.success({\n provider: this.storage?.name,\n memoryIds: out.map((r) => r.id),\n returnedCount: out.length,\n embeddingProvider: this.embedding?.model,\n model: this.embedding?.model,\n agentId: commonAgent(items.map((item) => item.agent.trim())),\n });\n this.emitChange({\n event: \"remember\",\n organization: this.organization!,\n agent: commonAgent(items.map((i) => i.agent.trim())) ?? items[0]!.agent,\n memoryId: out.map((r) => r.id),\n timestamp: nowIso(),\n traceId: parent.context.traceId,\n sessionId: this.telemetry.sessionId,\n });\n return out;\n }\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 contentHash: null, // batch path is append-only; dedupe uses sequential rememberOne\n }));\n\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: RememberResult[] = rows.map((row) => ({\n ...toMemoryRecord(row),\n action: \"created\" as const,\n }));\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 this.emitChange({\n event: \"remember\",\n organization,\n agent: commonAgent(items.map((i) => i.agent.trim())) ?? items[0]!.agent,\n memoryId: records.map((r) => r.id),\n timestamp,\n traceId: parent.context.traceId,\n sessionId: this.telemetry.sessionId,\n });\n return records;\n } catch (error) {\n parent.failure(error);\n throw wrapOperationError(\"rememberBatch\", error);\n }\n }\n\n /**\n * Store memories from a chat transcript.\n *\n * **Experimental** until 1.0 — API shape may change.\n *\n * - `mode: \"raw\"` (default) — remember user message text (no LLM).\n * - `mode: \"extract\"` — requires configured `llm`; extracts atomic facts then\n * remembers each. Pass a custom {@link LlmProvider} or {@link openaiLlm}\n * in the constructor.\n *\n * @param messages - Conversation turns (`role` + `content`).\n * @param options - Agent, mode, optional metadata/dedupe. See\n * {@link RememberFromMessagesOptions}.\n * @returns One {@link RememberResult} per remembered fact/message.\n * @throws {ProviderNotConfiguredError} When `mode: \"extract\"` but no `llm` was configured.\n */\n async rememberFromMessages(\n messages: ConversationMessage[],\n options: RememberFromMessagesOptions,\n ): Promise<RememberResult[]> {\n const parent = this.telemetry.start(\"rememberFromMessages\");\n try {\n const normalized = normalizeConversationMessages(messages);\n const resolved = resolveRememberFromMessagesOptions(options);\n\n let texts: string[];\n if (resolved.mode === \"extract\") {\n if (!this.llm) {\n throw new ProviderNotConfiguredError(\n \"llm\",\n \"rememberFromMessages\",\n 'pass llm: openaiLlm(...) in the constructor when mode is \"extract\"',\n );\n }\n const llmOutput = await this.llm.complete(\n buildExtractMessages(normalized),\n );\n texts = parseExtractedFacts(llmOutput);\n if (texts.length === 0) {\n parent.success({\n returnedCount: 0,\n agentId: resolved.agent,\n extra: { mode: \"extract\", factCount: 0 },\n });\n return [];\n }\n } else {\n texts = selectRawUserTexts(normalized, resolved.rawStrategy);\n }\n\n const out: RememberResult[] = [];\n for (const text of texts) {\n const child = parent.child(\"remember\");\n const result = await this.rememberOne(\n {\n agent: resolved.agent,\n content: { text },\n ...(resolved.metadata !== undefined\n ? { metadata: resolved.metadata }\n : {}),\n ...(resolved.dedupe !== undefined ? { dedupe: resolved.dedupe } : {}),\n },\n child,\n );\n child.success({\n provider: this.storage?.name,\n memoryIds: [result.id],\n returnedCount: 1,\n metadata: result.metadata,\n agentId: result.agent,\n tags: telemetryTags(result.metadata),\n extra: { upsertAction: result.action, mode: resolved.mode },\n });\n out.push(result);\n }\n\n parent.success({\n provider: this.storage?.name,\n memoryIds: out.map((r) => r.id),\n returnedCount: out.length,\n embeddingProvider: this.embedding?.model,\n model: this.embedding?.model,\n agentId: resolved.agent,\n extra: { mode: resolved.mode },\n });\n return out;\n } catch (error) {\n parent.failure(error, { agentId: options?.agent });\n throw wrapOperationError(\"rememberFromMessages\", error);\n }\n }\n\n /**\n * Update an existing memory by id. Re-embeds when `content` changes; merges\n * metadata when provided.\n *\n * @param options.id - Memory id to update.\n * @param options.content - Optional new `{ text }` (triggers re-embed + content hash).\n * @param options.metadata - Optional metadata merged onto the existing record.\n * @returns Updated record with `action: \"updated\"`.\n * @throws {MemoryNotFoundError} If the id is unknown in this organization.\n */\n async update(options: {\n id: string;\n content?: { text: string };\n metadata?: MemoryMetadata;\n }): Promise<RememberResult> {\n const trace = this.telemetry.start(\"update\");\n try {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.id, \"id\");\n const existing = await storage.getMemoryById(options.id.trim(), organization);\n if (!existing) {\n throw new MemoryNotFoundError(`Memory not found: ${options.id}`);\n }\n\n const contentText = options.content?.text ?? existing.content_text;\n if (options.content) {\n assertNonEmptyString(options.content.text, \"content.text\");\n }\n const existingMeta = deserializeMetadata(existing.metadata_json);\n const metadata =\n options.metadata !== undefined\n ? mergeMemoryMetadata(existingMeta, options.metadata)\n : existingMeta;\n\n let vector: Float32Array | undefined;\n if (options.content !== undefined) {\n const tEmbed = performance.now();\n vector = await embedding.embed(contentText);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n }\n\n const timestamp = nowIso();\n const row = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const updated = await storage.updateMemory({\n id: existing.id,\n organization,\n contentText: options.content !== undefined ? contentText : undefined,\n metadata,\n embedding: vector,\n updatedAt: timestamp,\n contentHash:\n options.content !== undefined\n ? hashMemoryContent(contentText)\n : undefined,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return updated;\n });\n if (!row) {\n throw new MemoryNotFoundError(`Memory not found: ${options.id}`);\n }\n const result: RememberResult = {\n ...toMemoryRecord(row),\n action: \"updated\",\n };\n this.emitChange({\n event: \"update\",\n organization,\n agent: result.agent,\n memoryId: result.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"updated\",\n });\n trace.success({\n provider: storage.name,\n memoryIds: [result.id],\n returnedCount: 1,\n agentId: result.agent,\n extra: { upsertAction: \"updated\" },\n });\n return result;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"update\", error);\n }\n }\n\n /**\n * Subscribe to memory change events (remember / update / forget / compress / clear).\n *\n * **SQLite:** delivers events only within this Node.js process.\n * A second process writing the same `memory.db` will not notify subscribers here.\n *\n * **Postgres:** uses LISTEN/NOTIFY across processes (lazy connection on first subscribe).\n *\n * @param filter - Scope by `organization` (defaults to this instance’s org),\n * optional `agent`, and optional `events` allow-list. See {@link SubscribeFilter}.\n * @param callback - Invoked with each {@link MemoryChangeEvent}.\n * @returns {@link Unsubscribe} function — call to stop receiving events.\n * @throws {ValidationError} If organization cannot be resolved.\n */\n subscribe(\n filter: SubscribeFilter,\n callback: (event: MemoryChangeEvent) => void,\n ): Unsubscribe {\n const org = filter.organization || this.organization;\n if (!org) {\n throw new ValidationError(\n \"subscribe requires organization (set on Wolbarg or in filter)\",\n );\n }\n const normalized: SubscribeFilter = {\n ...filter,\n organization: org,\n };\n\n // Postgres: lazy LISTEN — only open the dedicated connection on first subscribe.\n if (this.storage instanceof PostgresStorageProvider) {\n if (!this.pgListenBackend) {\n const pool = this.storage.getPool?.();\n if (pool) {\n this.pgListenBackend = createPostgresListenerFromPool(pool as never);\n }\n }\n if (this.pgListenBackend) {\n // subscribe() itself kicks ensureListening — do not also void start()\n // (that raced and leaked a second LISTEN client → duplicate events).\n return this.pgListenBackend.subscribe(normalized, callback);\n }\n }\n\n if (!this.subscribeBackend) {\n this.subscribeBackend = new SqliteSubscribeEmitter();\n }\n return this.subscribeBackend.subscribe(normalized, callback);\n }\n\n /** Broadcast a memory change event to in-process or Postgres NOTIFY subscribers. */\n private emitChange(event: MemoryChangeEvent): void {\n try {\n if (this.storage instanceof PostgresStorageProvider) {\n // Avoid an extra pool round-trip when nobody is listening.\n const listener = this.pgListenBackend as\n | { hasSubscribers?: () => boolean }\n | null;\n if (listener?.hasSubscribers?.()) {\n void this.storage.notifyChange(event).catch((error) => {\n console.error(\n \"[wolbarg] NOTIFY failed:\",\n error instanceof Error ? error.message : error,\n );\n });\n }\n return;\n }\n this.subscribeBackend?.emit(event);\n } catch (error) {\n console.error(\n \"[wolbarg] emitChange error:\",\n error instanceof Error ? error.message : error,\n );\n }\n }\n\n /** Internal remember with optional upsert/dedupe. */\n private async rememberOne(\n options: RememberOptions,\n trace: OperationTraceHandle,\n ): Promise<RememberResult> {\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 agent = options.agent.trim();\n const text = options.content.text;\n const dedupe = resolveMemoryDedupeConfig(\n options.dedupe !== undefined ? options.dedupe : this.memoryDedupe,\n );\n\n const tEmbed = performance.now();\n const vector = await embedding.embed(text);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n\n const timestamp = nowIso();\n const contentHash = hashMemoryContent(text);\n\n if (!dedupe.enabled) {\n const id = createId();\n const record = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const row = await storage.insertMemory({\n id,\n organization,\n agent,\n contentText: text,\n metadata,\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n // Null hash when dedupe is off — unique index allows duplicate text.\n contentHash: null,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return toMemoryRecord(row);\n });\n this.emitChange({\n event: \"remember\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"created\",\n });\n return { ...record, action: \"created\" };\n }\n\n // Exact match\n let existing: MemoryRow | null = null;\n if (\n dedupe.strategy === \"exact\" ||\n dedupe.strategy === \"exact-or-near\"\n ) {\n if (typeof storage.findActiveByContentHash === \"function\") {\n existing = await storage.findActiveByContentHash(\n organization,\n agent,\n contentHash,\n );\n }\n }\n\n if (existing) {\n const merged = mergeMemoryMetadata(\n deserializeMetadata(existing.metadata_json),\n metadata,\n );\n const row = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const updated = await storage.updateMemory({\n id: existing!.id,\n organization,\n metadata: merged,\n updatedAt: timestamp,\n contentHash,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return updated;\n }, { exclusive: true });\n const record = toMemoryRecord(row!);\n this.emitChange({\n event: \"update\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"updated\",\n });\n return { ...record, action: \"updated\" };\n }\n\n // Near-dup\n if (\n dedupe.strategy === \"near\" ||\n dedupe.strategy === \"exact-or-near\"\n ) {\n const near = await this.findNearDuplicate(\n storage,\n organization,\n agent,\n vector,\n dedupe.nearThreshold,\n dedupe.nearCandidateLimit,\n );\n if (near) {\n const merged = mergeMemoryMetadata(\n deserializeMetadata(near.metadata_json),\n metadata,\n );\n const row = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const updated = await storage.updateMemory({\n id: near.id,\n organization,\n contentText: text,\n metadata: merged,\n embedding: vector,\n updatedAt: timestamp,\n contentHash,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return updated;\n }, { exclusive: true });\n const record = toMemoryRecord(row!);\n this.emitChange({\n event: \"update\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"updated\",\n });\n return { ...record, action: \"updated\" };\n }\n }\n\n // Insert new\n const id = createId();\n try {\n const record = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const row = await storage.insertMemory({\n id,\n organization,\n agent,\n contentText: text,\n metadata,\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n contentHash,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return toMemoryRecord(row);\n }, { exclusive: true });\n this.emitChange({\n event: \"remember\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"created\",\n });\n return { ...record, action: \"created\" };\n } catch (error) {\n // Unique hash race: retry as update\n const msg = error instanceof Error ? error.message : String(error);\n if (\n msg.toLowerCase().includes(\"unique\") &&\n typeof storage.findActiveByContentHash === \"function\"\n ) {\n const raced = await storage.findActiveByContentHash(\n organization,\n agent,\n contentHash,\n );\n if (raced) {\n const merged = mergeMemoryMetadata(\n deserializeMetadata(raced.metadata_json),\n metadata,\n );\n const row = await this.withWriteLock(\n async () =>\n storage.updateMemory({\n id: raced.id,\n organization,\n metadata: merged,\n updatedAt: nowIso(),\n contentHash,\n }),\n { exclusive: true },\n );\n const record = toMemoryRecord(row!);\n this.emitChange({\n event: \"update\",\n organization,\n agent,\n memoryId: record.id,\n timestamp: nowIso(),\n upsertAction: \"updated\",\n });\n return { ...record, action: \"updated\" };\n }\n }\n throw error;\n }\n }\n\n /**\n * Find the best active near-duplicate memory for upsert (cosine similarity ≥ threshold).\n *\n * @param storage - Open storage provider.\n * @param organization - Org namespace.\n * @param agent - Agent scope for the search.\n * @param vector - Embedding of the candidate text.\n * @param threshold - Minimum similarity (0–1) to treat as a duplicate.\n * @param limit - Max vector candidates to inspect.\n * @returns Matching memory row, or `null` if none qualify.\n */\n private async findNearDuplicate(\n storage: StorageProvider,\n organization: string,\n agent: string,\n vector: Float32Array,\n threshold: number,\n limit: number,\n ): Promise<MemoryRow | null> {\n if (typeof storage.searchVectorsWithMemories === \"function\") {\n const hits = await storage.searchVectorsWithMemories(\n vector,\n limit,\n organization,\n { agent, includeArchived: false },\n );\n let best: { row: MemoryRow; sim: number } | null = null;\n for (const { row, distance } of hits) {\n if (row.archived === 1) continue;\n const sim = distanceToSimilarity(distance);\n if (sim >= threshold && (!best || sim > best.sim)) {\n best = { row, sim };\n }\n }\n return best?.row ?? null;\n }\n\n const hits = await storage.searchVectors(vector, limit);\n let best: { row: MemoryRow; sim: number } | null = null;\n for (const hit of hits) {\n const row = await storage.getMemoryByRowid(hit.memoryRowid, organization);\n if (!row || row.archived === 1 || row.agent !== agent) continue;\n const sim = distanceToSimilarity(hit.distance);\n if (sim >= threshold && (!best || sim > best.sim)) {\n best = { row, sim };\n }\n }\n return best?.row ?? null;\n }\n\n /**\n * Semantic (and optional hybrid / MMR / rerank / graph) search over stored memories.\n * Pass `{ explain: true }` for enriched ranking diagnostics.\n *\n * @param options - Query text plus optional `topK` (default 5), `threshold`,\n * `filter`, `hybrid`, `mmr`, `rerank`, `includeGraph`, `explain`.\n * See {@link RecallOptions}.\n * @returns Ranked {@link RecallResult}[] normally, or {@link RecallExplainResponse}\n * when `explain: true`.\n */\n async recall(options: RecallOptions & { explain: true }): Promise<RecallExplainResponse>;\n /**\n * @param options - Recall options with `explain` omitted or `false`.\n * @returns Ranked memory hits.\n */\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 if (\n hybridWeights &&\n keywordSignal === \"disabled\" &&\n !warnedHybridNoKeyword\n ) {\n warnedHybridNoKeyword = true;\n warnLogger.warn(\n \"hybrid search requested but no keyword channel is available; using semantic-only results.\",\n );\n }\n\n const tRank = performance.now();\n let results = [...byId.values()].sort((a, b) => {\n const diff = b.similarity - a.similarity;\n if (diff !== 0) return diff;\n // Deterministic tie-breaker for equal similarity scores.\n return a.id.localeCompare(b.id);\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 let mmrApplied = false;\n if (mmrLambda !== null) {\n // Select exactly `topK` diversified results from the over-fetched\n // candidate pool. (Previously we selected `topK * 2`, which could\n // no-op diversification when candidates were <= topK*2.)\n mmrApplied = results.length > topK;\n if (mmrApplied) {\n results = applyMmr(results, topK, mmrLambda);\n rankingReason = `MMR(lambda=${mmrLambda})`;\n } else {\n rankingReason = `MMR(lambda=${mmrLambda})(skipped:insufficient_candidates)`;\n }\n }\n\n if (options.rerank === true && !this.reranker && !warnedRerankNoProvider) {\n warnedRerankNoProvider = true;\n warnLogger.warn(\n \"rerank is enabled but no reranker provider is configured; using identity order.\",\n );\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 (options.includeGraph === true && this.graph) {\n const tGraph = performance.now();\n // Batch hydration for lower end-to-end latency.\n await Promise.all(\n serialized.map(async (hit) => {\n hit.related = await this.hydrateRelated(hit.id);\n }),\n );\n trace.mark(\"databaseReadMs\", performance.now() - tGraph);\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\" : mmrApplied ? \"enabled\" : \"disabled\",\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 /**\n * Run multiple recalls sequentially under one parent telemetry span.\n *\n * @param queries - Non-empty list of recall options (`explain` is forced off).\n * @returns One hit array per query, same order.\n * @throws {ValidationError} If `queries` is empty.\n */\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 /**\n * Compress the newest active memories for an agent into one summary memory\n * and archive the sources. Requires an `llm` (or custom `compression`) at\n * construction — typed only on `Wolbarg<true>`.\n *\n * @param options - `agent` required; optional `limit` (default 50, min 2).\n * See {@link CompressOptions}.\n * @returns Summary record plus archived source ids. See {@link CompressResult}.\n * @throws {ProviderNotConfiguredError} If no LLM/compression provider is set.\n * @throws {ValidationError} If fewer than 2 active memories exist for the agent.\n */\n async compress(\n this: Wolbarg<true>,\n options: CompressOptions,\n ): Promise<CompressResult> {\n return this.runCompress(options);\n }\n\n /** @internal Runs compress for both typed and untyped call sites. */\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 txResult = await storage.withTransaction(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 trace.mark(\"databaseWriteMs\", performance.now() - tWrite);\n return txResult;\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 this.emitChange({\n event: \"compress\",\n organization,\n agent: options.agent.trim(),\n memoryId: [result.summary.id, ...result.archivedIds],\n timestamp,\n sessionId: this.telemetry.sessionId,\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"compress\", error);\n }\n }\n\n /**\n * Ingest a document (path, URL, Buffer, or text), chunk it, embed chunks, and\n * store each as a memory. Images use optional `ocr` / `vision` providers from\n * the constructor.\n *\n * @param options - `agent`, `source`, optional chunking overrides / metadata.\n * See {@link IngestOptions}.\n * @returns Counts and created memory ids. See {@link IngestResult}.\n * @throws {ValidationError} If no text can be extracted or chunking yields zero chunks.\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 contentHash: this.memoryDedupe.enabled\n ? hashMemoryContent(chunk.text)\n : null,\n }));\n\n let rows;\n if (this.memoryDedupe.enabled) {\n const memories: RememberResult[] = [];\n for (let i = 0; i < chunks.length; i += 1) {\n const result = await this.rememberOne(\n {\n agent: options.agent.trim(),\n content: { text: chunks[i]!.text },\n metadata: {\n ...baseMeta,\n ingest: true,\n chunkIndex: chunks[i]!.index,\n chunkCount: chunks.length,\n sourceFilename: loaded.filename ?? null,\n },\n },\n trace,\n );\n memories.push(result);\n }\n const result = {\n memories,\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 this.emitChange({\n event: \"ingest\",\n organization,\n agent: options.agent.trim(),\n memoryId: result.memories.map((m) => m.id),\n timestamp,\n sessionId: this.telemetry.sessionId,\n });\n return result;\n }\n\n 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 this.emitChange({\n event: \"ingest\",\n organization,\n agent: options.agent.trim(),\n memoryId: result.memories.map((m) => m.id),\n timestamp,\n sessionId: this.telemetry.sessionId,\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"ingest\", error);\n }\n }\n\n /**\n * Link two memories in the optional graph layer with a typed relation edge.\n *\n * @param fromId - Source memory id.\n * @param toId - Target memory id.\n * @param relation - Edge label (e.g. `\"supports\"`, `\"caused_by\"`).\n * @param metadata - Optional edge properties stored on the graph provider.\n * @throws {ProviderNotConfiguredError} When no `graph` was configured.\n * @throws {ValidationError} On empty ids/relation.\n */\n async linkMemories(\n fromId: string,\n toId: string,\n relation: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n const trace = this.telemetry.start(\"linkMemories\");\n try {\n await this.requireReady();\n const graph = this.requireGraph(\"linkMemories\");\n assertNonEmptyString(fromId, \"fromId\");\n assertNonEmptyString(toId, \"toId\");\n assertNonEmptyString(relation, \"relation\");\n const tGraph = performance.now();\n await graph.linkMemories(\n fromId.trim(),\n toId.trim(),\n relation.trim(),\n metadata,\n );\n trace.mark(\"databaseWriteMs\", performance.now() - tGraph);\n trace.success({\n provider: graph.name,\n memoryIds: [fromId.trim(), toId.trim()],\n extra: { relation: relation.trim() },\n });\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"linkMemories\", error);\n }\n }\n\n /**\n * Traverse related memories via the optional graph layer.\n * Neighbor stubs from the graph are re-hydrated from SQL storage when available.\n *\n * @param memoryId - Seed memory id.\n * @param options - Optional `relation`, `direction`, `depth`, `limit`.\n * See {@link GetRelatedOptions}.\n * @returns Related {@link MemoryRecord} list (may be empty).\n * @throws {ProviderNotConfiguredError} When no `graph` was configured.\n */\n async getRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const trace = this.telemetry.start(\"getRelated\");\n try {\n await this.requireReady();\n const graph = this.requireGraph(\"getRelated\");\n assertNonEmptyString(memoryId, \"memoryId\");\n\n let validatedOptions = options;\n if (options?.depth !== undefined) {\n if (!Number.isFinite(options.depth)) {\n throw new ConfigurationError(\"graph.depth must be a finite number\");\n }\n if (options.depth < 1) {\n throw new ConfigurationError(\"graph.depth must be >= 1\");\n }\n if (options.depth > 16) {\n validatedOptions = { ...options, depth: 16 };\n }\n }\n const tGraph = performance.now();\n const related = await this.hydrateRelated(\n memoryId.trim(),\n validatedOptions,\n );\n trace.mark(\"databaseReadMs\", performance.now() - tGraph);\n trace.success({\n provider: graph.name,\n memoryIds: [memoryId.trim(), ...related.map((r) => r.id)],\n returnedCount: related.length,\n });\n return related;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"getRelated\", error);\n }\n }\n\n /**\n * Delete memories by id or by agent filter. Cascades graph nodes/edges when\n * a graph provider is configured.\n *\n * @param options - Either `{ id }` or `{ filter: { agent } }`. See {@link ForgetOptions}.\n * @returns Number of memories deleted.\n * @throws {ValidationError} If neither `id` nor `filter.agent` is provided.\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 deletedIds: string[] = [];\n const deleted = await this.withWriteLock(async () => {\n if (\"id\" in options && options.id !== undefined) {\n assertNonEmptyString(options.id, \"id\");\n const id = options.id.trim();\n const ok = await storage.deleteMemoryById(id, organization);\n if (ok) deletedIds.push(id);\n return ok ? 1 : 0;\n }\n\n if (\"filter\" in options && options.filter?.agent) {\n assertNonEmptyString(options.filter.agent, \"filter.agent\");\n const rows = await storage.listMemories({\n organization,\n agent: options.filter.agent.trim(),\n includeArchived: true,\n });\n for (const row of rows) deletedIds.push(row.id);\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 if (deleted > 0 && this.graph && deletedIds.length > 0) {\n const tGraph = performance.now();\n for (const id of deletedIds) {\n await this.graph.deleteMemory(id);\n }\n trace.mark(\"databaseWriteMs\", performance.now() - tGraph);\n }\n\n trace.success({\n provider: storage.name,\n returnedCount: deleted,\n memoryIds: deletedIds.length > 0 ? deletedIds : null,\n filters: \"filter\" in options ? options.filter : null,\n agentId:\n \"filter\" in options ? options.filter?.agent?.trim() ?? null : null,\n extra: this.graph\n ? { graphCascade: deletedIds.length }\n : undefined,\n });\n if (deleted > 0) {\n this.emitChange({\n event: \"forget\",\n organization,\n agent:\n (\"filter\" in options && options.filter?.agent?.trim()) ||\n (\"id\" in options ? \"*\" : \"*\"),\n memoryId:\n \"id\" in options && options.id ? options.id.trim() : [],\n timestamp: nowIso(),\n sessionId: this.telemetry.sessionId,\n });\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 /**\n * Return the audit/history timeline for a single memory.\n *\n * @param options - `{ id }` of the memory. See {@link HistoryOptions}.\n * @returns Memory record plus ordered {@link HistoryEvent} list.\n * @throws {MemoryNotFoundError} If the id is unknown.\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 /**\n * Aggregate counts for this organization (active / archived / agents / etc.).\n *\n * @returns {@link StatsResult} snapshot.\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 /**\n * Delete all memories for this organization (optionally scoped by agent).\n * Cascades graph cleanup when a graph provider is configured.\n *\n * @param options - Optional `{ agent }` scope. See {@link ClearOptions}.\n * @returns Number of memories deleted.\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 if (this.graph) {\n const rows = await storage.listMemories({\n organization,\n includeArchived: true,\n });\n for (const row of rows) {\n await this.graph.deleteMemory(row.id);\n }\n }\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 /**\n * Create an immutable named checkpoint of the file-backed SQLite memory DB\n * (and SQLite graph snapshot when applicable).\n *\n * @param name - Checkpoint name (unique).\n * @param options - Optional metadata. See {@link CheckpointOptions}.\n * @returns {@link CheckpointInfo} for the new checkpoint.\n * @throws {ProviderNotConfiguredError} Without a checkpoint provider / file DB.\n * @throws {GraphCheckpointNotSupportedError} For Neo4j graph backends.\n */\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 this.assertGraphCheckpointSupported(\"checkpoint\");\n const tCheckpoint = performance.now();\n const meta = await provider.checkpoint(name, source, options);\n try {\n await this.snapshotGraphAlongside(meta.snapshotPath, \"checkpoint\");\n } catch (error) {\n // Avoid leaving a partially-written graph sidecar directory behind.\n const sidecar = this.graphSnapshotDir(meta.snapshotPath);\n if (fs.existsSync(sidecar)) {\n fs.rmSync(sidecar, { recursive: true, force: true });\n }\n throw error;\n }\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 /**\n * Restore the memory database from a named checkpoint (replaces the live DB file).\n *\n * @param name - Checkpoint name previously created with {@link Wolbarg.checkpoint}.\n * @returns {@link CheckpointInfo} of the restored checkpoint.\n */\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 graphClosed = await this.closeGraphForSnapshot();\n const tRollback = performance.now();\n const meta = await provider.rollback(name, target);\n await this.restoreGraphAlongside(meta.snapshotPath, \"rollback\");\n if (graphClosed) {\n await this.graph?.open();\n }\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 /**\n * Delete a named checkpoint from disk / the checkpoint store.\n *\n * @param name - Checkpoint name.\n * @returns `true` if a checkpoint was removed.\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 existing = await provider.getCheckpoint(name);\n const tDelete = performance.now();\n const removed = await provider.deleteCheckpoint(name);\n if (removed && existing) {\n const sidecar = this.graphSnapshotDir(existing.snapshotPath);\n if (fs.existsSync(sidecar)) {\n fs.rmSync(sidecar, { recursive: true, force: true });\n }\n }\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 /**\n * List all known checkpoints for this instance.\n *\n * @returns Array of {@link CheckpointInfo} (may be empty).\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 /**\n * Look up a single checkpoint by name.\n *\n * @param name - Checkpoint name.\n * @returns {@link CheckpointInfo} or `null` if missing.\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 /**\n * Export the memory database to a portable SQLite + manifest bundle\n * (includes SQLite graph sidecar when applicable).\n *\n * @param exportPath - Destination file path for the export bundle.\n * @returns {@link ExportResult} with path, size, and timestamp.\n */\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 this.assertGraphCheckpointSupported(\"export\");\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 this.embedding?.model,\n this.embeddingDimensions ?? undefined,\n );\n await this.snapshotGraphAlongside(result.path, \"export\");\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 /**\n * Import a previously exported memory database, replacing the current file.\n * Closes and reopens storage around the swap.\n *\n * @param exportPath - Path to a bundle produced by {@link Wolbarg.export}.\n * @returns {@link ImportResult} with restored path and timestamp.\n */\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 // Fail fast before closing storage/graph for snapshots.\n this.assertGraphCheckpointSupported(\"import\");\n const target = this.requireMemoryDbPath();\n if (this.storage) {\n await this.storage.close();\n storageClosed = true;\n }\n const graphClosed = await this.closeGraphForSnapshot();\n const result: MemoryImportResult = await this.transfer.importFrom(\n exportPath,\n target,\n {\n organization: this.organization ?? undefined,\n embeddingModel: this.embedding?.model,\n embeddingDimensions: this.embeddingDimensions ?? undefined,\n },\n );\n await this.restoreGraphAlongside(result.path, \"import\");\n if (graphClosed) {\n await this.graph?.open();\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 /**\n * Flush pending telemetry writes (useful in tests / before process exit).\n *\n * @returns Resolves when the telemetry provider has flushed.\n */\n async flushTelemetry(): Promise<void> {\n await this.telemetry.flush();\n }\n\n /**\n * Session id for this SDK instance (attached to telemetry traces and change events).\n */\n get sessionId(): string {\n return this.telemetry.sessionId;\n }\n\n /**\n * Optional process-wide lock for SQLite read-modify-write (dedupe upsert).\n * Plain inserts must NOT take this lock — the provider coalesces concurrent\n * insertMemory calls under a single BEGIN IMMEDIATE for multi-writer throughput.\n */\n private withWriteLock<T>(\n fn: () => Promise<T>,\n options?: { exclusive?: boolean },\n ): Promise<T> {\n if (\n options?.exclusive &&\n this.storage?.name === \"sqlite\"\n ) {\n return this.writeMutex.runExclusive(fn);\n }\n return fn();\n }\n\n /**\n * Close storage, graph, telemetry, checkpoints, and subscribe backends.\n * The instance can be discarded afterward; construct a new one to reopen.\n *\n * @returns Resolves when all providers have closed (errors are swallowed per-provider).\n */\n async close(): Promise<void> {\n if (this.storage) {\n this.telemetry.emitShutdown(this.storage.name);\n }\n await this.subscribeBackend?.close().catch(() => undefined);\n await this.pgListenBackend?.close().catch(() => undefined);\n this.subscribeBackend = null;\n this.pgListenBackend = null;\n await this.telemetry.close().catch(() => undefined);\n await this.checkpointProvider?.close().catch(() => undefined);\n await this.graph?.close().catch(() => undefined);\n this.graph = null;\n if (this.storage) {\n await this.storage.close();\n }\n this.storage = null;\n this.embedding = null;\n this.rawEmbedding = 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 {@link Wolbarg.ready} / {@link Wolbarg.init} has completed successfully. */\n get isInitialized(): boolean {\n return this.initialized;\n }\n\n /** Ensure {@link Wolbarg.ready} completed and core providers are available. */\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 /** Reject embeddings whose dimensionality differs from the initialized model. */\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 /** Return the configured checkpoint provider or throw {@link ProviderNotConfiguredError}. */\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 /** Return the configured graph provider or throw with a setup hint for `method`. */\n private requireGraph(method: string): GraphProvider {\n if (!this.graph) {\n throw new ProviderNotConfiguredError(\n \"graph\",\n method,\n \"pass graph: sqliteGraph({ path }) or graph: neo4jGraph({ url, username, password })\",\n );\n }\n return this.graph;\n }\n\n /** Throw when graph checkpoint pairing is requested on a non-file-backed graph backend. */\n private assertGraphCheckpointSupported(operation: string): void {\n if (!this.graph) return;\n if (!this.graph.supportsFileSnapshot()) {\n throw new GraphCheckpointNotSupportedError(this.graph.name, operation);\n }\n }\n\n /** Directory path where a graph file snapshot is stored alongside a memory checkpoint. */\n private graphSnapshotDir(alongsidePath: string): string {\n return `${alongsidePath}.graph`;\n }\n\n /** Close the graph provider before copying files; returns whether a close occurred. */\n private async closeGraphForSnapshot(): Promise<boolean> {\n if (!this.graph || !this.graph.supportsFileSnapshot()) return false;\n await this.graph.close();\n return true;\n }\n\n /** Copy the SQLite graph database next to a memory checkpoint directory. */\n private async snapshotGraphAlongside(\n alongsidePath: string,\n operation: string,\n ): Promise<void> {\n if (!this.graph) return;\n if (!this.graph.supportsFileSnapshot()) {\n throw new GraphCheckpointNotSupportedError(this.graph.name, operation);\n }\n const dataPath = this.graph.getDataPath();\n if (!dataPath) return;\n const dest = this.graphSnapshotDir(alongsidePath);\n // Close briefly so files are consistent on Windows.\n await this.graph.close();\n try {\n if (fs.existsSync(dest)) {\n fs.rmSync(dest, { recursive: true, force: true });\n }\n if (fs.existsSync(dataPath)) {\n const stat = fs.statSync(dataPath);\n if (stat.isDirectory()) {\n fs.cpSync(dataPath, dest, { recursive: true });\n } else {\n fs.mkdirSync(dest, { recursive: true });\n fs.cpSync(dataPath, path.join(dest, path.basename(dataPath)));\n // Copy sibling WAL/SHM files if present (SQLite graph file).\n const parent = path.dirname(dataPath);\n const base = path.basename(dataPath);\n for (const entry of fs.readdirSync(parent)) {\n if (entry === base) continue;\n if (entry.startsWith(base)) {\n fs.cpSync(\n path.join(parent, entry),\n path.join(dest, entry),\n { recursive: true },\n );\n }\n }\n }\n }\n } finally {\n await this.graph.open();\n }\n }\n\n /** Restore a graph file snapshot written by {@link snapshotGraphAlongside}. */\n private async restoreGraphAlongside(\n alongsidePath: string,\n operation: string,\n ): Promise<void> {\n if (!this.graph) return;\n if (!this.graph.supportsFileSnapshot()) {\n throw new GraphCheckpointNotSupportedError(this.graph.name, operation);\n }\n const dataPath = this.graph.getDataPath();\n if (!dataPath) return;\n const src = this.graphSnapshotDir(alongsidePath);\n if (!fs.existsSync(src)) {\n // Older checkpoints without graph snapshot — leave graph empty/as-is.\n return;\n }\n if (fs.existsSync(dataPath)) {\n fs.rmSync(dataPath, { recursive: true, force: true });\n }\n const entries = fs.readdirSync(src);\n if (entries.length === 1 && entries[0] === path.basename(dataPath)) {\n fs.mkdirSync(path.dirname(dataPath), { recursive: true });\n fs.cpSync(path.join(src, entries[0]!), dataPath, { recursive: true });\n } else {\n fs.mkdirSync(path.dirname(dataPath), { recursive: true });\n fs.cpSync(src, dataPath, { recursive: true });\n }\n }\n\n /** Run graph traversal then re-hydrate stub records from storage when rows exist. */\n private async hydrateRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const graph = this.requireGraph(\"getRelated\");\n const related = await graph.getRelated(memoryId, options);\n const { storage, organization } = await this.requireReady();\n const rows = await Promise.all(\n related.map((stub) => storage.getMemoryById(stub.id, organization)),\n );\n const out: MemoryRecord[] = [];\n for (let i = 0; i < related.length; i += 1) {\n const stub = related[i]!;\n const row = rows[i]!;\n out.push(row ? toMemoryRecord(row) : stub);\n }\n return out;\n }\n\n /** Resolve the on-disk SQLite memory database path (throws for Postgres / `:memory:`). */\n private requireMemoryDbPath(): string {\n if (this.storage && !(this.storage instanceof SqliteStorageProvider)) {\n throw new ConfigurationError(\n \"This operation requires a file-backed SQLite database (checkpoints / export-import are not supported for PostgreSQL).\",\n {\n suggestion:\n 'Use database: { provider: \"sqlite\", url: \"./memory.db\" }',\n },\n );\n }\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/**\n * Preferred factory — equivalent to `new Wolbarg(options)`.\n *\n * @param options - Full {@link WolbargOptions}. Pass custom provider instances\n * (`embedding`, `llm`, `storage`, `graph`, …) or factory helpers\n * (`openaiEmbedding`, `openaiLlm`, `sqliteGraph`, …). See constructor docs\n * on {@link Wolbarg} for every option field.\n * @returns A configured {@link Wolbarg} instance (call {@link Wolbarg.ready} before use).\n *\n * @example\n * ```ts\n * const memory = wolbarg({\n * organization: \"acme\",\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 * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\n * }),\n * });\n * await memory.ready();\n * ```\n */\nexport function wolbarg(options: WolbargOptions): Wolbarg {\n return new Wolbarg(options as never);\n}\n\n/**\n * Extract string tags from memory metadata for telemetry (`tags` string or string[]).\n * @param metadata - Arbitrary metadata object.\n * @returns Normalized tag list or `null`.\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\n/**\n * @param agents - Agent ids from a result set.\n * @returns The shared agent id if every entry matches, otherwise `null`.\n */\nfunction commonAgent(agents: string[]): string | null {\n const first = agents[0];\n return first && agents.every((agent) => agent === first) ? first : null;\n}\n\n/**\n * @param metadata - Metadata objects from recalled memories.\n * @returns Union of all tags, or `null` if none.\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 * Build filters with the {@link meta} helper or compose `{ field, op }` nodes directly.\n * Filters compile to SQL JSON predicates when possible ({@link compileMetadataFilterToSql}).\n *\n * @example\n * ```ts\n * import { meta } from \"wolbarg/filters\";\n *\n * const filter = meta.and(\n * meta.eq(\"category\", \"billing\"),\n * meta.gte(\"priority\", 2),\n * );\n * ```\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/** Fluent builders for {@link MetadataFilter} AST nodes. */\nexport const meta = {\n /** Field equals value (strict equality). */\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, telemetry, checkpoints, and graph providers (v0.5.5).\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 { SqliteGraphProvider } from \"../graph/providers/sqlite-graph.js\";\nimport { Neo4jGraphProvider } from \"../graph/providers/neo4j.js\";\nimport type { GraphProvider } from \"../graph/types.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport type { WolbargOptions } from \"../core/options.js\";\nimport { Wolbarg } from \"../core/wolbarg.js\";\n\n/**\n * Create a SQLite {@link StorageProvider} from a filesystem path or `:memory:`.\n *\n * @param connectionString - Absolute/relative `.db` path, or `\":memory:\"` for ephemeral.\n * @returns Ready-to-pass storage provider (Wolbarg still calls `open()` via `ready()`).\n *\n * @example\n * ```ts\n * wolbarg({ organization: \"acme\", storage: sqlite(\"./memory.db\"), embedding: ... })\n * ```\n */\nexport function sqlite(connectionString: string): StorageProvider {\n return new SqliteStorageProvider({ connectionString });\n}\n\n/**\n * Create a SQLite storage **config object** (for `database` / `init` options).\n *\n * @param connectionString - Path or `:memory:`.\n * @returns `{ provider: \"sqlite\", connectionString, url }`.\n */\nexport function sqliteConfig(\n connectionString: string,\n): SqliteDatabaseConfig {\n return {\n provider: \"sqlite\",\n connectionString,\n url: connectionString,\n };\n}\n\n/**\n * Create a PostgreSQL {@link StorageProvider}. Requires optional peer `pg`.\n *\n * @param options - Connection string, or an object with:\n * - `connectionString` — Postgres URL\n * - `maxPoolSize` — optional pool size\n * - `durableWrites` — default `true`; set `false` for higher write throughput (async commit)\n * @returns Postgres storage provider instance.\n *\n * @example\n * ```ts\n * postgres(process.env.DATABASE_URL!)\n * postgres({ connectionString: process.env.DATABASE_URL!, maxPoolSize: 10 })\n * ```\n */\nexport function postgres(\n options:\n | string\n | {\n connectionString: string;\n maxPoolSize?: number;\n /** Default true. Set false for higher write throughput (async commit). */\n durableWrites?: boolean;\n },\n): StorageProvider {\n const opts =\n typeof options === \"string\"\n ? { connectionString: options }\n : options;\n return new PostgresStorageProvider(opts);\n}\n\n/**\n * Create a PostgreSQL storage **config object**.\n *\n * @param connectionString - Postgres connection URL.\n * @param options.maxPoolSize - Optional pool size.\n * @param options.durableWrites - Optional durability flag (default true).\n * @returns `{ provider: \"postgres\", connectionString, url, ... }`.\n */\nexport function postgresConfig(\n connectionString: string,\n options?: { maxPoolSize?: number; durableWrites?: boolean },\n): PostgresDatabaseConfig {\n return {\n provider: \"postgres\",\n connectionString,\n url: connectionString,\n ...options,\n };\n}\n\n/**\n * Create a SQLite {@link TelemetryProvider} for an independent event database.\n *\n * @param url - Path to the telemetry SQLite file (separate from memory DB).\n * @returns Telemetry provider for `telemetry:` constructor option.\n */\nexport function sqliteTelemetry(url: string): TelemetryProvider {\n return new SqliteTelemetryProvider({ url });\n}\n\n/**\n * Create a SQLite {@link CheckpointProvider}.\n *\n * @param directory - Optional directory for checkpoint files (default under cwd).\n * @returns Checkpoint provider for `checkpoint:` constructor option.\n */\nexport function sqliteCheckpoint(directory?: string): CheckpointProvider {\n return new SqliteCheckpointProvider({ directory });\n}\n\n/**\n * Create an embedded SQLite {@link GraphProvider} (file-backed, local/dev).\n *\n * @param options.path - Filesystem path for the graph SQLite database\n * (separate from the memory DB).\n * @returns Graph provider for `graph:` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * graph: sqliteGraph({ path: \"./graph.db\" })\n * ```\n */\nexport function sqliteGraph(options: { path: string }): GraphProvider {\n return new SqliteGraphProvider(options);\n}\n\n/**\n * Create a Neo4j {@link GraphProvider} (networked). Requires optional peer `neo4j-driver`.\n *\n * @param options.url - Bolt URL, e.g. `neo4j://localhost:7687` or `bolt://…`.\n * @param options.username - Neo4j username.\n * @param options.password - Neo4j password.\n * @param options.database - Optional database name (Neo4j 4+ multi-DB).\n * @returns Graph provider for `graph:` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * graph: neo4jGraph({\n * url: \"neo4j://localhost:7687\",\n * username: \"neo4j\",\n * password: process.env.NEO4J_PASSWORD!,\n * })\n * ```\n */\nexport function neo4jGraph(options: {\n url: string;\n username: string;\n password: string;\n database?: string;\n}): GraphProvider {\n return new Neo4jGraphProvider(options);\n}\n\n/**\n * Create a {@link TelemetryProvider} from {@link TelemetryConfig}.\n * Currently only SQLite telemetry databases are implemented.\n *\n * @param config - Telemetry config with `database.provider` and `database.url`.\n * @returns SQLite telemetry provider instance.\n * @throws {ConfigurationError} If provider is not `\"sqlite\"` or url is missing.\n */\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. Telemetry supports sqlite or postgres only — not kuzu/neo4j.`,\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 factory. Equivalent to `new Wolbarg(options)`.\n *\n * @param options - Full {@link WolbargOptions} (providers, database, embedding, optional llm).\n * @returns Configured {@link Wolbarg} instance — call `ready()` before use.\n *\n * @example\n * ```ts\n * const ctx = wolbarg({\n * organization: \"acme\",\n * database: sqliteConfig(\"./memory.db\"),\n * embedding: openaiEmbedding({ apiKey: \"...\", model: \"text-embedding-3-small\" }),\n * });\n * await ctx.ready();\n * ```\n */\nexport function wolbarg(options: WolbargOptions): Wolbarg {\n return new Wolbarg(options as never);\n}\n\n/** @deprecated Alias of {@link wolbarg}. */\nexport const createWolbarg = wolbarg;\n","/**\n * Keyword / BM25 search providers for hybrid recall.\n *\n * Use these when you want lexical (BM25) scoring alongside semantic vector search.\n * Pass a {@link KeywordSearchProvider} to Wolbarg retrieval config, or rely on\n * native FTS when the storage backend supports it.\n *\n * @example\n * ```ts\n * import { bm25 } from \"wolbarg/keyword\";\n *\n * const keyword = bm25({ k1: 1.2, b: 0.75 });\n * const hits = await keyword.search(\"billing issue\", documents, 10);\n * ```\n */\n\n/** A single keyword search hit with memory id and BM25 score. */\nexport interface KeywordSearchHit {\n /** Memory UUID that matched the query. */\n memoryId: string;\n /** BM25 relevance score (higher is better). */\n score: number;\n}\n\n/** Document passed to keyword search — typically memory id + text body. */\nexport interface KeywordDocument {\n /** Memory UUID. */\n id: string;\n /** Searchable text content. */\n text: string;\n}\n\n/**\n * Contract for keyword / lexical search backends.\n *\n * Implement this interface to plug in a custom BM25, Elasticsearch, or FTS adapter.\n * Wolbarg calls {@link KeywordSearchProvider.search} during hybrid recall when no\n * native storage keyword index is available.\n *\n * @example Custom provider\n * ```ts\n * const myKeyword: KeywordSearchProvider = {\n * name: \"my-fts\",\n * async search(query, documents, topK) {\n * // score documents and return topK hits\n * return [{ memoryId: documents[0]!.id, score: 1.0 }];\n * },\n * };\n * ```\n */\nexport interface KeywordSearchProvider {\n /** Provider identifier (e.g. `\"bm25\"`, `\"fts5\"`). */\n readonly name: string;\n /**\n * Rank documents by lexical relevance to `query`.\n * @param query - User search string.\n * @param documents - Candidate memories to score.\n * @param topK - Maximum hits to return.\n * @returns Hits sorted by score descending.\n */\n search(\n query: string,\n documents: KeywordDocument[],\n topK: number,\n ): Promise<KeywordSearchHit[]>;\n}\n\n/**\n * In-memory Okapi BM25 keyword search.\n *\n * Suitable for small corpora or when storage has no native FTS. Tunable via\n * {@link https://en.wikipedia.org/wiki/Okapi_BM25 | BM25} parameters `k1` and `b`.\n */\nexport class Bm25KeywordSearchProvider implements KeywordSearchProvider {\n readonly name = \"bm25\";\n private readonly k1: number;\n private readonly b: number;\n\n /**\n * @param options - BM25 tuning parameters.\n * @param options.k1 - Term frequency saturation (default `1.2`).\n * @param options.b - Length normalization (default `0.75`).\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 /** @inheritdoc */\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\n/** Tokenize text for BM25 (Unicode letters/numbers, min length 2). */\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/**\n * Factory for the default in-memory BM25 keyword provider.\n *\n * @param options - Optional BM25 tuning (`k1`, `b`).\n * @returns A {@link KeywordSearchProvider} ready for hybrid recall.\n *\n * @example\n * ```ts\n * const keyword = bm25();\n * ```\n */\nexport function bm25(options?: { k1?: number; b?: number }): KeywordSearchProvider {\n return new Bm25KeywordSearchProvider(options);\n}\n","/**\n * Reranker provider abstractions for second-stage recall ranking.\n *\n * Rerankers reorder vector/keyword candidates using cross-encoders or LLM scoring.\n * Pass a {@link RerankerProvider} to Wolbarg retrieval config or call factories\n * directly in custom pipelines.\n *\n * @example\n * ```ts\n * import { cohereReranker } from \"wolbarg/rerank\";\n *\n * const reranker = cohereReranker({ apiKey: process.env.COHERE_API_KEY! });\n * const hits = await reranker.rerank(query, documents, 5);\n * ```\n */\n\n/** Document passed to a reranker — memory id + searchable text. */\nexport interface RerankDocument {\n /** Memory UUID. */\n id: string;\n /** Text body used for relevance scoring. */\n text: string;\n}\n\n/** A reranked hit with relevance score. */\nexport interface RerankHit {\n /** Memory UUID. */\n id: string;\n /** Relevance score (higher is better; provider-specific scale). */\n score: number;\n}\n\n/**\n * Contract for cross-encoder and API rerankers.\n *\n * Implement this interface to plug in Cohere, Jina, local cross-encoders, or\n * custom scoring. On failure, built-in HTTP adapters fall back to identity order\n * so recall never returns zero hits.\n *\n * @example Custom provider\n * ```ts\n * const myReranker: RerankerProvider = {\n * name: \"local-ce\",\n * async rerank(query, documents, topK) {\n * return documents.slice(0, topK).map((d, i) => ({ id: d.id, score: 1 - i * 0.1 }));\n * },\n * };\n * ```\n */\nexport interface RerankerProvider {\n /** Provider identifier (e.g. `\"cohere\"`, `\"openai\"`). */\n readonly name: string;\n /**\n * Reorder documents by query relevance.\n * @param query - User search string.\n * @param documents - Candidate memories to rerank.\n * @param topK - Maximum hits to return.\n * @returns Hits sorted by score descending.\n */\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 const hits = parsed.slice(0, topK);\n // Some providers return 200 with an unexpected shape; in that case\n // `parseResults` can legitimately return `[]`. Fallback to identity\n // order so recall never collapses to zero hits.\n if (hits.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 hits;\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 * Generic cross-encoder reranker for OpenAI-compatible `/rerank` endpoints.\n *\n * Falls back to identity order when the HTTP call fails or returns an unexpected shape.\n *\n * @param options - Remote endpoint configuration.\n * @param options.baseUrl - API base URL (appends `/rerank`).\n * @param options.apiKey - Bearer token for authorization.\n * @param options.model - Optional model name sent in the request body.\n * @param options.timeoutMs - Request timeout (default `30000`).\n */\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\n/**\n * Jina AI reranker (`jina-reranker-v2-base-multilingual` by default).\n *\n * @param options.apiKey - Jina API key.\n * @param options.model - Model id override.\n * @param options.timeoutMs - Request timeout (default `30000`).\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\n/**\n * Cohere Rerank v3.5 API adapter.\n *\n * @param options.apiKey - Cohere API key.\n * @param options.model - Model id (default `\"rerank-v3.5\"`).\n * @param options.timeoutMs - Request timeout (default `30000`).\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/**\n * BGE-style remote reranker for self-hosted endpoints with Jina/Cohere response shape.\n *\n * @param options.apiKey - Bearer token for the remote service.\n * @param options.baseUrl - Service base URL (appends `/rerank`).\n * @param options.model - Optional model name.\n * @param options.timeoutMs - Request timeout (default `30000`).\n */\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 dedicated rerank API key required).\n *\n * Scores query–document relevance via JSON-mode chat completions and reorders hits.\n * Falls back to identity order on parse or network errors.\n *\n * @param options.apiKey - OpenAI API key.\n * @param options.model - Chat model (default `\"gpt-4.1-mini\"`).\n * @param options.baseUrl - API base (default `\"https://api.openai.com/v1\"`).\n * @param options.timeoutMs - Request timeout (default `60000`).\n *\n * @example\n * ```ts\n * const reranker = openaiReranker({ apiKey: process.env.OPENAI_API_KEY! });\n * ```\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 providers — extract text from images during ingest.\n *\n * OCR is used when ingesting image files without accompanying text. Install the\n * optional peer `tesseract.js` before calling {@link tesseract}.\n *\n * @example\n * ```ts\n * import { tesseract } from \"wolbarg/ocr\";\n *\n * const ocr = tesseract();\n * const { text } = await ocr.recognize(imageBuffer, \"image/png\");\n * ```\n */\n\nimport { ConfigurationError } from \"../errors/index.js\";\n\n/** Result of optical character recognition on an image. */\nexport interface OcrResult {\n /** Extracted plain text (may be empty if OCR finds nothing). */\n text: string;\n}\n\n/**\n * Contract for OCR backends.\n *\n * Implement this interface to plug in Google Vision, Azure OCR, or another engine.\n * Wolbarg calls {@link OCRProvider.recognize} during ingest when a document parser\n * marks the source as an image.\n *\n * @example Custom provider\n * ```ts\n * const myOcr: OCRProvider = {\n * name: \"cloud-ocr\",\n * async recognize(image, mimeType) {\n * const text = await callMyApi(image, mimeType);\n * return { text };\n * },\n * };\n * ```\n */\nexport interface OCRProvider {\n /** Provider identifier (e.g. `\"tesseract\"`, `\"cloud-ocr\"`). */\n readonly name: string;\n /**\n * Extract text from a raster image buffer.\n * @param image - Raw image bytes.\n * @param mimeType - Optional MIME hint (e.g. `\"image/png\"`).\n * @returns Recognized text.\n */\n recognize(image: Buffer, mimeType?: string): Promise<OcrResult>;\n}\n\n/**\n * Tesseract.js OCR adapter.\n *\n * Requires the optional peer package `tesseract.js`. Throws\n * {@link ConfigurationError} with install instructions when the peer is missing.\n *\n * @returns An {@link OCRProvider} using English (`\"eng\"`) by default.\n *\n * @example\n * ```ts\n * // npm install tesseract.js\n * const ocr = tesseract();\n * const result = await ocr.recognize(buffer);\n * ```\n */\nexport function tesseract(): OCRProvider {\n return {\n name: \"tesseract\",\n async recognize(image: Buffer): Promise<OcrResult> {\n let mod: unknown;\n try {\n mod = await import(\"tesseract.js\" as string);\n } catch (error) {\n throw new ConfigurationError(\n 'OCR provider \"tesseract\" requires the optional peer package \"tesseract.js\". Install it with: npm install tesseract.js',\n {\n cause: error instanceof Error ? error : undefined,\n suggestion: 'npm install tesseract.js',\n operation: \"recognize\",\n },\n );\n }\n\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\n if (!createWorker) {\n throw new ConfigurationError(\n 'OCR provider \"tesseract\" could not find tesseract.js.createWorker. Ensure your tesseract.js version is compatible.',\n );\n }\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 },\n };\n}\n","/**\n * Optional vision providers — captions, descriptions, and entities from images.\n *\n * Vision analysis enriches image ingest when OCR alone is insufficient. Both\n * {@link openaiVision} and {@link geminiVision} use OpenAI-compatible chat\n * endpoints with multimodal messages.\n *\n * @example\n * ```ts\n * import { openaiVision } from \"wolbarg/vision\";\n *\n * const vision = openaiVision({ apiKey: process.env.OPENAI_API_KEY! });\n * const result = await vision.analyze(imageBuffer, \"image/jpeg\");\n * console.log(result.caption, result.entities);\n * ```\n */\n\n/** Structured output from a vision analysis call. */\nexport interface VisionResult {\n /** Short one-line caption. */\n caption: string;\n /** Longer natural-language description. */\n description: string;\n /** Named entities or objects detected in the image. */\n entities: string[];\n}\n\n/**\n * Contract for vision / multimodal analysis backends.\n *\n * Implement this interface to plug in Claude, local VLMs, or custom APIs.\n * Wolbarg merges vision output into ingest metadata when processing images.\n *\n * @example Custom provider\n * ```ts\n * const myVision: VisionProvider = {\n * name: \"my-vlm\",\n * async analyze(image, mimeType) {\n * return { caption: \"...\", description: \"...\", entities: [\"cat\"] };\n * },\n * };\n * ```\n */\nexport interface VisionProvider {\n /** Provider identifier (e.g. `\"openai-vision\"`, `\"gemini\"`). */\n readonly name: string;\n /**\n * Analyze an image and return structured caption data.\n * @param image - Raw image bytes.\n * @param mimeType - MIME type for the data URL (default `\"image/png\"`).\n */\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\n/** Internal OpenAI-compatible multimodal chat vision adapter. */\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\n/** Parse JSON (or plain text fallback) from model output into {@link VisionResult}. */\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\n/**\n * Google Gemini vision via the OpenAI-compatible Generative Language API.\n *\n * @param options - API credentials and model selection.\n * @param options.apiKey - Gemini API key.\n * @param options.model - Model id (default `\"gemini-2.0-flash\"`).\n * @param options.baseUrl - Override API base (default Google OpenAI-compat endpoint).\n * @param options.timeoutMs - Request timeout in milliseconds (default `60000`).\n * @returns A {@link VisionProvider} instance.\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\n/**\n * OpenAI vision via `/chat/completions` with image_url content parts.\n *\n * @param options - API credentials and model selection.\n * @param options.apiKey - OpenAI API key.\n * @param options.model - Vision-capable model (default `\"gpt-4o-mini\"`).\n * @param options.baseUrl - Override API base (default `\"https://api.openai.com/v1\"`).\n * @param options.timeoutMs - Request timeout in milliseconds (default `60000`).\n * @returns A {@link VisionProvider} instance.\n *\n * @example\n * ```ts\n * const vision = openaiVision({ apiKey: process.env.OPENAI_API_KEY! });\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 and Studio performance tooling.\n *\n * @internal Exported for harness scripts — not part of the stable public API surface.\n */\n\n/** Single timed iteration result. */\nexport interface BenchmarkSample {\n /** Benchmark scenario name. */\n name: string;\n /** Wall-clock duration in milliseconds. */\n durationMs: number;\n /** Whether the iteration completed without throwing. */\n ok: boolean;\n /** Error message when `ok` is false. */\n error?: string;\n}\n\n/** Aggregated benchmark report with percentile summary. */\nexport interface BenchmarkReport {\n /** ISO-8601 start timestamp. */\n startedAt: string;\n /** ISO-8601 end timestamp. */\n finishedAt: string;\n /** Raw per-iteration samples. */\n samples: BenchmarkSample[];\n /** Rollup statistics across successful iterations. */\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\n/**\n * Run a benchmark function for a fixed number of iterations.\n *\n * @param name - Scenario label attached to each sample.\n * @param iterations - Number of times to invoke `fn`.\n * @param fn - Async or sync work to measure.\n * @returns One {@link BenchmarkSample} per iteration (failures captured, not thrown).\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\n/**\n * Summarize benchmark samples into a report with avg / p50 / p95 / p99 latencies.\n *\n * @param samples - Output from {@link runBenchmark}.\n * @param startedAt - ISO start time for the run.\n * @param finishedAt - ISO end time for the run.\n * @returns {@link BenchmarkReport} suitable for JSON export.\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\n/** Compute percentile from a pre-sorted duration array. */\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"]}
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/embedding/cache.ts","../src/utils/vector.ts","../src/embedding/cache-store.ts","../src/llm/index.ts","../src/ingest/index.ts","../src/core/options.ts","../src/filters/match.ts","../src/filters/sql-compile.ts","../src/telemetry/logger.ts","../src/schema/index.ts","../src/sql/index.ts","../src/utils/vector-index.ts","../src/storage/sqlite/concurrency-config.ts","../src/storage/sqlite/transaction.ts","../src/memory/dedupe.ts","../src/storage/providers/sqlite.ts","../src/filters/sql-compile-postgres.ts","../src/subscribe/postgres-listener.ts","../src/storage/providers/postgres.ts","../src/storage/index.ts","../src/version.ts","../src/memory/transfer.ts","../src/memory/from-messages.ts","../src/memory/index.ts","../src/retrieval/index.ts","../src/graph/memory-node.ts","../src/graph/sync/cascade.ts","../src/graph/providers/sqlite-graph.ts","../src/graph/providers/neo4j.ts","../src/core/validate.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/subscribe/sqlite-emitter.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","../src/config/providers.ts","../src/config/project-config.ts","../src/config/create-from-config.ts"],"names":["meta","resolve","path","createHash","fs","clauses","FIELD_RE","compileComparison","warnLogger","warnedFtsKeywordSearch","AsyncLocalStorage","out","offset","params","idx","sql","result","vec","tsvProbe","DatabaseSync","serializeMetadata","deserializeMetadata","nowIso","assertFiniteNumber","describe","matchesFilter","sqlite","id","hits","best","wolbarg","existsSync","readFileSync","isAbsolute"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Operation-scoped errors with stable `code`, human `reason`, and actionable `suggestion`.\n *\n * All Wolbarg errors extend {@link WolbargError} so callers can use `instanceof`\n * checks and read structured fields in IDE hover docs.\n */\n\n/**\n * Base class for all Wolbarg SDK errors.\n *\n * @property code - Stable machine-readable error code (e.g. `\"VALIDATION_ERROR\"`).\n * @property reason - Short explanation of why the operation failed.\n * @property suggestion - Actionable fix hint for developers.\n * @property operation - Facade method name when applicable (e.g. `\"recall\"`).\n */\nexport class WolbargError extends Error {\n readonly code: string;\n readonly reason?: string;\n readonly suggestion?: string;\n readonly operation?: string;\n\n /**\n * @param message - Human-readable error message.\n * @param code - Stable error code string.\n * @param options - Optional cause, reason, suggestion, and operation name.\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 or `open()` fails. */\nexport class InitializationError extends WolbargError {\n /**\n * @param message - Description of the initialization failure.\n * @param options - Optional cause and structured hints.\n */\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/**\n * Thrown when configuration values are missing, invalid, or incompatible.\n * Also used for missing optional peer packages (PDF, OCR, Neo4j, etc.).\n */\nexport class ConfigurationError extends WolbargError {\n /**\n * @param message - Description of the misconfiguration.\n * @param options - Optional cause, reason, suggestion, and operation name.\n */\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 before reaching storage. */\nexport class ValidationError extends WolbargError {\n /**\n * @param message - Which argument failed and why.\n * @param options - Optional cause and structured hints.\n */\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 low-level database read/write fails. */\nexport class DatabaseError extends WolbargError {\n /**\n * @param message - Operation-scoped failure message.\n * @param options - Optional underlying `cause` and hints.\n */\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/**\n * Thrown when SQLite write-lock retries are exhausted.\n * Stable code: `WOLBARG_STORAGE_LOCKED`.\n */\nexport class StorageLockedError extends WolbargError {\n /**\n * @param message - Lock contention description.\n * @param options - Typically includes suggestion to tune concurrency or use Postgres.\n */\n constructor(\n message: string,\n options?: ErrorOptions & {\n reason?: string;\n suggestion?: string;\n operation?: string;\n },\n ) {\n super(message, \"WOLBARG_STORAGE_LOCKED\", options);\n this.name = \"StorageLockedError\";\n }\n}\n\n/** Thrown when an embedding API request fails or returns invalid vectors. */\nexport class EmbeddingError extends WolbargError {\n /**\n * @param message - Embedding failure description.\n * @param options - Optional HTTP cause and provider hints.\n */\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 LLM-based memory compression (summarization) fails. */\nexport class CompressionError extends WolbargError {\n /**\n * @param message - Compression failure description.\n * @param options - Optional LLM cause chain.\n */\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 id does not exist or is archived. */\nexport class MemoryNotFoundError extends WolbargError {\n /**\n * @param message - Which memory was not found.\n * @param options - Optional operation context.\n */\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 * (reranker, OCR, graph, LLM for extract mode, etc.).\n */\nexport class ProviderNotConfiguredError extends ConfigurationError {\n readonly provider: string;\n\n /**\n * @param provider - Provider name (e.g. `\"reranker\"`, `\"graph\"`).\n * @param method - Facade method that requires the provider.\n * @param hint - Install or config instruction shown to the developer.\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/**\n * Thrown when graph checkpoint / rollback / export / import is requested for a\n * network-backed graph provider (e.g. Neo4j). File-backed SQLite graph supports\n * snapshots; Neo4j does not in v1 — we refuse rather than silently skip.\n */\nexport class GraphCheckpointNotSupportedError extends WolbargError {\n /**\n * @param backend - Graph backend name (e.g. `\"neo4j\"`).\n * @param operation - Requested operation (e.g. `\"checkpoint\"`).\n */\n constructor(backend: string, operation: string) {\n super(\n `graph checkpoint not supported for network-backed graph providers (${backend})`,\n \"GRAPH_CHECKPOINT_NOT_SUPPORTED\",\n {\n operation,\n reason: `${backend} is networked / not file-backed`,\n suggestion:\n \"Use sqliteGraph({ path }) for local snapshots, or checkpoint memory storage only without a network graph provider.\",\n },\n );\n this.name = \"GraphCheckpointNotSupportedError\";\n }\n}\n\n/**\n * Map low-level SQLite / driver errors into actionable {@link WolbargError} subclasses.\n *\n * Preserves existing {@link WolbargError} instances unchanged. Recognizes lock\n * contention, missing files, and read-only database errors.\n *\n * @param operation - Facade method name for the error message (e.g. `\"remember\"`).\n * @param error - Raw thrown value from the driver.\n * @returns A typed {@link WolbargError} subclass with `reason` and `suggestion`.\n */\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 StorageLockedError(formatOperationMessage(operation, raw), {\n cause: error instanceof Error ? error : undefined,\n operation,\n reason: \"SQLite database locked\",\n suggestion:\n \"Increase concurrency.maxRetries or concurrency.lockTimeoutMs, or consider the Postgres backend for high-concurrency multi-agent workloads.\",\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 of related memories.\n *\n * Compression collapses multiple memories into one summary via an LLM, archiving\n * the originals with lineage. Use {@link createCompressionProvider} or call\n * {@link compressMemories} directly when building custom pipelines.\n *\n * @example\n * ```ts\n * import { createCompressionProvider } from \"wolbarg/compression\";\n * import { openaiLlm } from \"wolbarg/llm\";\n *\n * const compression = createCompressionProvider(openaiLlm({ apiKey, model: \"gpt-4o-mini\" }));\n * const summary = await compression.compress(memories);\n * ```\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/**\n * Contract for memory compression backends.\n *\n * Implement this interface to swap LLM vendors or use rule-based summarizers.\n * Wolbarg's `compress()` facade delegates to the configured provider.\n *\n * @example Custom provider\n * ```ts\n * const rules: CompressionProvider = {\n * name: \"truncate\",\n * async compress(memories) {\n * return memories.map((m) => m.content.text).join(\" | \").slice(0, 500);\n * },\n * };\n * ```\n */\nexport interface CompressionProvider {\n /** Provider identifier (e.g. `\"llm\"`, `\"truncate\"`). */\n readonly name: string;\n /**\n * Produce a single summary string from related memories.\n * @param memories - Non-empty list of memories to collapse.\n * @returns Plain-text summary.\n * @throws {@link CompressionError} when compression fails or input is empty.\n */\n compress(memories: MemoryRecord[]): Promise<string>;\n}\n\n/**\n * Default compression provider wrapping an {@link LlmProvider}.\n *\n * Delegates to {@link compressMemories} with the standard system prompt.\n */\nexport class LlmCompressionProvider implements CompressionProvider {\n readonly name = \"llm\";\n private readonly llm: LlmProvider;\n\n /** @param llm - Configured LLM used for summarization. */\n constructor(llm: LlmProvider) {\n this.llm = llm;\n }\n\n /** @inheritdoc */\n async compress(memories: MemoryRecord[]): Promise<string> {\n return compressMemories(this.llm, memories);\n }\n}\n\n/**\n * Compress memories into one summary using an LLM chat completion.\n *\n * @param llm - LLM provider for the summarization call.\n * @param memories - Memories to collapse (must be non-empty).\n * @returns Plain-text summary preserving key facts.\n * @throws {@link CompressionError} when `memories` is empty or the LLM call fails.\n *\n * @example\n * ```ts\n * const summary = await compressMemories(llm, selectedMemories);\n * await wolbarg.compress({ agent, memoryIds, summary });\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\n/**\n * Factory for the default LLM-backed {@link CompressionProvider}.\n *\n * @param llm - LLM used for summarization.\n * @returns A {@link CompressionProvider} named `\"llm\"`.\n */\nexport function createCompressionProvider(\n llm: LlmProvider,\n): CompressionProvider {\n return new LlmCompressionProvider(llm);\n}\n","/**\n * Chunking strategies for document ingestion.\n *\n * Long documents are split into overlapping chunks before embedding and storage.\n * Choose a strategy via {@link createChunkingStrategy} or let ingest auto-detect\n * with {@link inferChunkingStrategy}.\n *\n * @example\n * ```ts\n * import { createChunkingStrategy } from \"wolbarg/chunking\";\n *\n * const chunker = createChunkingStrategy(\"sentence\");\n * const chunks = chunker.chunk(documentText, { chunkSize: 800, overlap: 100 });\n * ```\n */\n\n/** A single text chunk with stable index for ordering. */\nexport interface Chunk {\n /** Chunk body text. */\n text: string;\n /** Zero-based position in the original document. */\n index: number;\n}\n\n/** Options controlling chunk size and overlap. */\nexport interface ChunkingOptions {\n /** Target characters per chunk (default `800`, minimum `32`). */\n chunkSize?: number;\n /** Overlap between consecutive chunks (default `100`, capped at half of chunkSize). */\n overlap?: number;\n}\n\n/**\n * Contract for document chunking strategies.\n *\n * Implement this interface for custom splitters (token-based, semantic, etc.).\n * Wolbarg ingest calls {@link ChunkingStrategy.chunk} after parsing a document.\n */\nexport interface ChunkingStrategy {\n /** Strategy name (e.g. `\"sentence\"`, `\"markdown\"`). */\n readonly name: string;\n /**\n * Split `text` into ordered chunks.\n * @param text - Full document text.\n * @param options - Optional size and overlap overrides.\n * @returns Non-overlapping or sliding-window chunks with indices.\n */\n chunk(text: string, options?: ChunkingOptions): Chunk[];\n}\n\n/** Clamp and validate chunking options with safe defaults. */\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\n/** Merge logical pieces (sentences, paragraphs) into size-bounded chunks. */\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\n/** Fixed-size sliding window over raw text. */\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\n/** Character-based fixed window chunking (ignores sentence boundaries). */\nexport class FixedChunkingStrategy implements ChunkingStrategy {\n readonly name = \"fixed\";\n /** @inheritdoc */\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n const { chunkSize, overlap } = clampOptions(options);\n return slidingWindow(text, chunkSize, overlap);\n }\n}\n\n/** Sentence-boundary-aware chunking (splits on `.!?` followed by whitespace). */\nexport class SentenceChunkingStrategy implements ChunkingStrategy {\n readonly name = \"sentence\";\n /** @inheritdoc */\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\n/** Paragraph-boundary-aware chunking (splits on blank lines). */\nexport class ParagraphChunkingStrategy implements ChunkingStrategy {\n readonly name = \"paragraph\";\n /** @inheritdoc */\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\n/** Markdown heading-aware chunking (splits on `#` headings; falls back to paragraph). */\nexport class MarkdownChunkingStrategy implements ChunkingStrategy {\n readonly name = \"markdown\";\n /** @inheritdoc */\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\n/** Alias for {@link MarkdownChunkingStrategy}. */\nexport class HeadingChunkingStrategy implements ChunkingStrategy {\n readonly name = \"heading\";\n /** @inheritdoc */\n chunk(text: string, options?: ChunkingOptions): Chunk[] {\n return new MarkdownChunkingStrategy().chunk(text, options);\n }\n}\n\n/**\n * Factory for built-in chunking strategies.\n *\n * @param name - Strategy name (default `\"sentence\"`).\n * @returns A {@link ChunkingStrategy} instance.\n *\n * @example\n * ```ts\n * const chunker = createChunkingStrategy(\"markdown\");\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\n/**\n * Infer the best chunking strategy from document structure.\n *\n * Uses markdown chunking when heading markers are present; otherwise sentence chunking.\n *\n * @param text - Document text to inspect.\n * @returns A {@link ChunkingStrategy} suited to the content.\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\n *\r\n * @param value - Candidate string.\r\n * @param fieldName - Field label used in the error message.\r\n * @throws {ValidationError} When value is missing, not a string, or blank.\r\n */\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\n *\r\n * @param value - Candidate number.\r\n * @param fieldName - Field label used in the error message.\r\n * @param options.min - Optional inclusive lower bound.\r\n * @param options.max - Optional inclusive upper bound.\r\n * @throws {ValidationError} When value is not a finite number or out of range.\r\n */\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\n *\r\n * @param metadata - Plain object metadata (empty object serializes to `{}`).\r\n */\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\n *\r\n * @param raw - JSON string from storage (invalid JSON returns `{}`).\r\n */\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\n * @param embedding - Model output vector (must match configured dimensions).\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\n * @param distance - Cosine distance from vec0 / blob fallback search.\r\n * @returns Similarity score in roughly [-1, 1] (typically [0, 1] for normalized embeddings).\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 /**\r\n * Run `fn` exclusively — concurrent callers queue on the same mutex.\r\n *\r\n * @param fn - Async or sync work to serialize.\r\n * @returns The value returned by `fn`.\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\n *\r\n * @param baseUrl - Origin or prefix URL (trailing slashes stripped).\r\n * @param path - Path segment (leading slash optional).\r\n */\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 * ## Custom embedding providers\n *\n * Pass any object that implements {@link EmbeddingProvider} as `embedding` in\n * {@link WolbargOptions}:\n *\n * ```ts\n * const myEmbedder: EmbeddingProvider = {\n * model: \"my-embed-model\",\n * async embed(text) {\n * // Return a Float32Array of fixed dimensionality\n * return new Float32Array([...]);\n * },\n * // Optional — if omitted, the SDK parallelizes `embed` via embedMany\n * async embedBatch(texts) {\n * return Promise.all(texts.map((t) => this.embed(t)));\n * },\n * async validate() {\n * const v = await this.embed(\"health check\");\n * return { dimensions: v.length };\n * },\n * };\n *\n * const ctx = wolbarg({\n * organization: \"acme\",\n * database: { provider: \"sqlite\", url: \"./memory.db\" },\n * embedding: myEmbedder, // or openaiEmbedding({ ... })\n * });\n * ```\n *\n * Built-in factories wrap OpenAI-compatible `POST {baseUrl}/embeddings` APIs.\n * **Important:** keep the same model (and dimensions) for the lifetime of a\n * database — mixing models will cause dimension mismatch errors.\n */\n\nimport type { EmbeddingConfig } from \"../types/index.js\";\nimport { EmbeddingError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\n/**\n * Contract for any embedding backend used by Wolbarg.\n *\n * Implement this to plug in Voyage, Cohere, a local ONNX model, etc. Vectors\n * must be finite floats; dimensionality is fixed after the first successful\n * {@link EmbeddingProvider.validate} / remember.\n */\nexport interface EmbeddingProvider {\n /** Embedding model id (telemetry + cache key namespace). */\n readonly model: string;\n /**\n * Produce a float embedding for the given text.\n *\n * @param text - Non-empty content to embed (memory text or recall query).\n * @returns Dense vector as `Float32Array` (same length for every call).\n */\n embed(text: string): Promise<Float32Array>;\n /**\n * Optional batch embedding. When present, {@link embedMany} and ingest prefer it.\n * When absent, the SDK falls back to concurrent single {@link embed} calls.\n *\n * @param texts - Texts to embed in one request when the API supports batching.\n * @returns One vector per input text, same order as `texts`.\n */\n embedBatch?(texts: string[]): Promise<Float32Array[]>;\n /**\n * Connectivity + dimension probe used during {@link Wolbarg.ready}.\n *\n * @returns Object with `dimensions` equal to the vector length.\n * @throws When the endpoint is unreachable or returns an empty vector.\n */\n validate(): Promise<{ dimensions: number }>;\n}\n\ninterface OpenAIEmbeddingResponse {\n data?: Array<{ embedding?: number[]; index?: number }>;\n error?: { message?: string };\n}\n\n/**\n * OpenAI-compatible embeddings client (`POST {baseUrl}/embeddings`).\n *\n * @param config - See {@link EmbeddingConfig} (`baseUrl`, `apiKey`, `model`,\n * optional `timeoutMs`).\n */\nexport class OpenAICompatibleEmbeddingProvider implements EmbeddingProvider {\n /** Model name sent in the request body. */\n readonly model: string;\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n\n /**\n * @param config - OpenAI-compatible embedding endpoint settings.\n * @param config.baseUrl - API root, e.g. `https://api.openai.com/v1`.\n * @param config.apiKey - Bearer token. Use any non-empty string for local\n * servers that ignore auth.\n * @param config.model - Embedding model id (e.g. `\"text-embedding-3-small\"`).\n * @param config.timeoutMs - Abort after this many ms. Defaults to `30_000`.\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 /**\n * Embed a single string.\n *\n * @param text - Input text.\n * @returns Embedding vector.\n * @throws {EmbeddingError} On HTTP errors, timeouts, or empty vectors.\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 /**\n * Embed multiple strings in one API call when the server supports batch input.\n * Falls back to sequential {@link embed} if the response length mismatches.\n *\n * @param texts - Inputs to embed.\n * @returns One vector per input, same order.\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 /**\n * Probe the endpoint and report vector dimensionality.\n *\n * @returns `{ dimensions }` from a fixed health-check string.\n * @throws {EmbeddingError} When the probe fails.\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 /**\n * Low-level HTTP request to `/embeddings`.\n *\n * @param input - Single string or batch of strings.\n * @returns Parsed OpenAI-style JSON body.\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 /** @param error - Unknown thrown value. @returns Human-readable message. */\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\n/**\n * Build an {@link EmbeddingProvider} from {@link EmbeddingConfig}.\n *\n * @param config - Full config including `baseUrl`, `apiKey`, and `model`.\n * @returns A ready-to-use {@link OpenAICompatibleEmbeddingProvider}.\n *\n * @example\n * ```ts\n * const embedding = createEmbeddingProvider({\n * baseUrl: \"https://api.openai.com/v1\",\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"text-embedding-3-small\",\n * });\n * ```\n */\nexport function createEmbeddingProvider(\n config: EmbeddingConfig,\n): EmbeddingProvider {\n return new OpenAICompatibleEmbeddingProvider(config);\n}\n\n/**\n * Internal helper that binds a default `baseUrl` for named factory exports.\n *\n * @param defaults - Must include `baseUrl`.\n * @returns A factory where `baseUrl` may be omitted by the caller.\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\n/**\n * OpenAI-compatible embeddings with an explicit `baseUrl`.\n *\n * @param config - Full {@link EmbeddingConfig} including `baseUrl`.\n * @returns {@link EmbeddingProvider} instance.\n *\n * @example\n * ```ts\n * embedding: openaiCompatibleEmbedding({\n * baseUrl: \"https://my-proxy.example.com/v1\",\n * apiKey: process.env.API_KEY!,\n * model: \"text-embedding-3-small\",\n * })\n * ```\n */\nexport const openaiCompatibleEmbedding = (\n config: EmbeddingConfig,\n): EmbeddingProvider => createEmbeddingProvider(config);\n\n/**\n * OpenAI Embeddings API (`https://api.openai.com/v1`).\n *\n * @param config - `apiKey` and `model` required (e.g. `\"text-embedding-3-small\"`);\n * optional `timeoutMs` and override `baseUrl`.\n * @returns {@link EmbeddingProvider} for use as `embedding` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * embedding: openaiEmbedding({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"text-embedding-3-small\",\n * })\n * ```\n */\nexport const openaiEmbedding = factory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\n/**\n * Local Ollama embeddings (`http://127.0.0.1:11434/v1`).\n *\n * @param config - `apiKey` may be any non-empty string; `model` is the Ollama\n * embedding model (e.g. `\"nomic-embed-text\"`).\n * @returns {@link EmbeddingProvider} for local Ollama.\n */\nexport const ollamaEmbedding = factory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\n/**\n * OpenRouter embeddings (`https://openrouter.ai/api/v1`).\n *\n * @param config - OpenRouter API key and routed embedding model id.\n * @returns {@link EmbeddingProvider} for OpenRouter.\n */\nexport const openRouterEmbedding = factory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n\n/**\n * LM Studio local server embeddings (`http://127.0.0.1:1234/v1`).\n *\n * @param config - Local API key (often unused) and the loaded embedding model name.\n * @returns {@link EmbeddingProvider} for LM Studio.\n */\nexport const lmStudioEmbedding = factory({\n baseUrl: \"http://127.0.0.1:1234/v1\",\n});\n\n/**\n * Google Gemini embeddings via the OpenAI-compatible endpoint.\n * Default base: `https://generativelanguage.googleapis.com/v1beta/openai`.\n *\n * @param config - Gemini API key and embedding model (e.g. `\"text-embedding-004\"`).\n * @returns {@link EmbeddingProvider} for Gemini.\n */\nexport const geminiEmbedding = factory({\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n});\n\n/**\n * Together AI embeddings (`https://api.together.xyz/v1`).\n *\n * @param config - Together API key and embedding model id.\n * @returns {@link EmbeddingProvider} for Together.\n */\nexport const togetherEmbedding = factory({\n baseUrl: \"https://api.together.xyz/v1\",\n});\n\n/**\n * vLLM OpenAI-compatible embeddings (`http://127.0.0.1:8000/v1`).\n *\n * @param config - Local/server API key (if required) and the served model name.\n * @returns {@link EmbeddingProvider} for vLLM.\n */\nexport const vllmEmbedding = factory({\n baseUrl: \"http://127.0.0.1:8000/v1\",\n});\n\n/**\n * Embed many texts, preferring {@link EmbeddingProvider.embedBatch} when available.\n * Otherwise runs up to `concurrency` parallel {@link EmbeddingProvider.embed} calls.\n *\n * @param provider - Embedding backend.\n * @param texts - Strings to embed (order preserved in the result).\n * @param concurrency - Max parallel single embeds when `embedBatch` is absent.\n * Defaults to `8`.\n * @returns One `Float32Array` per input text.\n */\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 * Transparent embedding cache wrapping any {@link EmbeddingProviderLike}.\n *\n * Keys are `sha256(content):model` so identical text across agents shares vectors.\n * Use {@link withEmbeddingCache} with a {@link EmbeddingCacheStore} implementation.\n */\n\nimport { createHash } from \"node:crypto\";\n\n/**\n * Minimal embedding provider contract for cache wrapping.\n * Avoids circular import with `embedding/index.ts`.\n */\nexport interface EmbeddingProviderLike {\n /** Model name included in cache keys. */\n readonly model: string;\n /** Embed a single text string. */\n embed(text: string): Promise<Float32Array>;\n /** Optional batch embed (cache checks each item before batching misses). */\n embedBatch?(texts: string[]): Promise<Float32Array[]>;\n /** Validate provider connectivity and return embedding dimensions. */\n validate(): Promise<{ dimensions: number }>;\n}\n\n/** User-facing embedding cache configuration (constructor / options). */\nexport interface EmbeddingCacheConfig {\n /** Enable cache (default `true` in 0.4+). */\n enabled?: boolean;\n /** Lazy TTL expiry on read; default no expiry. */\n ttlMs?: number;\n /** LRU eviction cap; default unbounded in-memory + durable store limits. */\n maxEntries?: number;\n}\n\n/** Normalized cache config after defaults are applied. */\nexport interface ResolvedEmbeddingCacheConfig {\n enabled: boolean;\n ttlMs: number | null;\n maxEntries: number | null;\n}\n\n/**\n * Resolve embedding cache config with SDK defaults.\n *\n * @param input - Optional partial config from `wolbarg({ embeddingCache })`.\n */\nexport function resolveEmbeddingCacheConfig(\n input?: EmbeddingCacheConfig,\n): ResolvedEmbeddingCacheConfig {\n return {\n enabled: input?.enabled ?? true,\n ttlMs: input?.ttlMs ?? null,\n maxEntries: input?.maxEntries ?? null,\n };\n}\n\n/**\n * Build a deterministic cache key from content and model name.\n *\n * @param content - Raw text that was embedded.\n * @param model - Embedding model identifier.\n */\nexport function embeddingCacheKey(content: string, model: string): string {\n const hash = createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n return `${hash}:${model}`;\n}\n\n/**\n * Pluggable durable / in-memory store for cached embedding vectors.\n *\n * Implement for Redis, S3, or other shared caches across processes.\n */\nexport interface EmbeddingCacheStore {\n /** Lookup a cached vector; return `null` on miss or expiry. */\n get(cacheKey: string): Promise<Float32Array | null>;\n /** Store a vector (may be write-behind). */\n set(cacheKey: string, model: string, vector: Float32Array): Promise<void>;\n /** Update LRU timestamp for a key (optional optimization). */\n touch(cacheKey: string): Promise<void>;\n /** Evict oldest entries when count exceeds `maxEntries`. */\n evictIfNeeded(maxEntries: number): Promise<void>;\n}\n\n/** Embedding provider wrapped with hit/miss statistics. */\nexport interface CacheAwareEmbedding extends EmbeddingProviderLike {\n /** Cache hits since construction or last {@link CacheAwareEmbedding.resetCacheStats}. */\n readonly cacheHits: number;\n /** Cache misses in the same window. */\n readonly cacheMisses: number;\n /** Reset hit/miss counters to zero. */\n resetCacheStats(): void;\n}\n\n/**\n * Wrap an embedding provider with a content+model cache.\n *\n * Cache check happens per-item before batch assembly so repeated texts never\n * hit the embedding API.\n *\n * @param provider - Underlying embedding provider.\n * @param store - L1 + durable cache store.\n * @param config - Resolved cache options from {@link resolveEmbeddingCacheConfig}.\n * @returns Provider with identical API plus cache stats.\n *\n * @example\n * ```ts\n * const cached = withEmbeddingCache(embedding, sqliteStore, resolveEmbeddingCacheConfig());\n * ```\n */\nexport function withEmbeddingCache(\n provider: EmbeddingProviderLike,\n store: EmbeddingCacheStore,\n config: ResolvedEmbeddingCacheConfig,\n): CacheAwareEmbedding {\n let cacheHits = 0;\n let cacheMisses = 0;\n\n async function embedOne(text: string): Promise<Float32Array> {\n if (!config.enabled) {\n cacheMisses += 1;\n return provider.embed(text);\n }\n const key = embeddingCacheKey(text, provider.model);\n const cached = await store.get(key);\n if (cached) {\n cacheHits += 1;\n // LRU touch is batched inside SqliteEmbeddingCacheStore.get — no per-hit write here.\n return cached;\n }\n cacheMisses += 1;\n const vector = await provider.embed(text);\n // Fire-and-forget durable write — L1 is updated synchronously inside set().\n void store.set(key, provider.model, vector);\n if (config.maxEntries !== null) {\n void store.evictIfNeeded(config.maxEntries);\n }\n return vector;\n }\n\n async function embedBatch(texts: string[]): Promise<Float32Array[]> {\n if (!config.enabled || texts.length === 0) {\n if (provider.embedBatch) {\n cacheMisses += texts.length;\n return provider.embedBatch(texts);\n }\n return Promise.all(texts.map((t) => embedOne(t)));\n }\n\n const results: Array<Float32Array | null> = new Array(texts.length).fill(\n null,\n );\n const missIndexes: number[] = [];\n const missTexts: string[] = [];\n\n for (let i = 0; i < texts.length; i += 1) {\n const text = texts[i]!;\n const key = embeddingCacheKey(text, provider.model);\n const cached = await store.get(key);\n if (cached) {\n cacheHits += 1;\n results[i] = cached;\n } else {\n missIndexes.push(i);\n missTexts.push(text);\n }\n }\n\n if (missTexts.length > 0) {\n cacheMisses += missTexts.length;\n const vectors = provider.embedBatch\n ? await provider.embedBatch(missTexts)\n : await Promise.all(missTexts.map((t) => provider.embed(t)));\n for (let j = 0; j < missIndexes.length; j += 1) {\n const idx = missIndexes[j]!;\n const vector = vectors[j]!;\n results[idx] = vector;\n const key = embeddingCacheKey(missTexts[j]!, provider.model);\n void store.set(key, provider.model, vector);\n }\n if (config.maxEntries !== null) {\n void store.evictIfNeeded(config.maxEntries);\n }\n }\n\n return results as Float32Array[];\n }\n\n return {\n model: provider.model,\n embed: embedOne,\n embedBatch,\n validate: () => provider.validate(),\n get cacheHits() {\n return cacheHits;\n },\n get cacheMisses() {\n return cacheMisses;\n },\n resetCacheStats() {\n cacheHits = 0;\n cacheMisses = 0;\n },\n };\n}\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\n *\r\n * @param a - First embedding vector.\r\n * @param b - Second embedding vector (same length as `a`).\r\n * @returns Distance in [0, 2]; returns `1` when either vector has zero norm.\r\n * @throws {Error} When vector lengths differ.\r\n */\r\nexport function cosineDistance(a: Float32Array, b: Float32Array): number { if (a.length !== b.length) {\r\n throw new Error(\r\n `cosineDistance dimension mismatch: a.length=${a.length}, b.length=${b.length}`,\r\n );\r\n }\r\n const len = a.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\n * @param data - Raw bytes from a SQLite BLOB column.\r\n * @returns Float32Array view over the embedding (may alias `data`'s buffer).\r\n */\r\nexport function bufferToEmbedding(data: Uint8Array | Buffer): Float32Array { 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 * Storage-backend-agnostic embedding_cache table access.\n *\n * Design: L1 Map is the hot path (sync hit). Durable stores are write-behind\n * so cache never contends with memory inserts on the same connection/pool.\n */\n\nimport type { DatabaseSync, StatementSync } from \"node:sqlite\";\nimport type { EmbeddingCacheStore } from \"./cache.js\";\nimport { embeddingToBuffer } from \"../utils/index.js\";\nimport { bufferToEmbedding } from \"../utils/vector.js\";\n\n/** SQL DDL for the `embedding_cache` table (SQLite). */\nexport const CREATE_EMBEDDING_CACHE_TABLE = `\nCREATE TABLE IF NOT EXISTS embedding_cache (\n cache_key TEXT PRIMARY KEY NOT NULL,\n model TEXT NOT NULL,\n vector BLOB NOT NULL,\n created_at TEXT NOT NULL,\n last_used_at TEXT NOT NULL\n);\n`;\n\n/** Index on `last_used_at` for LRU eviction queries. */\nexport const CREATE_EMBEDDING_CACHE_INDEX = `\nCREATE INDEX IF NOT EXISTS idx_embedding_cache_last_used\n ON embedding_cache(last_used_at);\n`;\n\nconst TOUCH_FLUSH_THRESHOLD = 64;\nconst L1_DEFAULT_MAX = 50_000;\n\ntype L1Entry = {\n model: string;\n vector: Float32Array;\n createdAt: number;\n lastUsedAt: number;\n};\n\n/** Shared L1 so repeated texts never touch durable I/O on the hot path. */\nclass L1Cache {\n private readonly map = new Map<string, L1Entry>();\n private readonly maxEntries: number;\n\n constructor(maxEntries = L1_DEFAULT_MAX) {\n this.maxEntries = maxEntries;\n }\n\n get(cacheKey: string, ttlMs: number | null): Float32Array | null {\n const entry = this.map.get(cacheKey);\n if (!entry) {\n return null;\n }\n if (ttlMs !== null && Date.now() - entry.createdAt > ttlMs) {\n this.map.delete(cacheKey);\n return null;\n }\n entry.lastUsedAt = Date.now();\n // Refresh LRU order without reallocating the entry.\n this.map.delete(cacheKey);\n this.map.set(cacheKey, entry);\n return entry.vector;\n }\n\n set(cacheKey: string, model: string, vector: Float32Array): void {\n const now = Date.now();\n if (this.map.has(cacheKey)) {\n this.map.delete(cacheKey);\n }\n this.map.set(cacheKey, {\n model,\n vector,\n createdAt: now,\n lastUsedAt: now,\n });\n this.evictIfNeeded();\n }\n\n touch(cacheKey: string): void {\n const entry = this.map.get(cacheKey);\n if (!entry) {\n return;\n }\n entry.lastUsedAt = Date.now();\n this.map.delete(cacheKey);\n this.map.set(cacheKey, entry);\n }\n\n evictIfNeeded(maxEntries?: number): void {\n const limit = maxEntries ?? this.maxEntries;\n while (this.map.size > limit) {\n const oldest = this.map.keys().next().value;\n if (oldest === undefined) {\n break;\n }\n this.map.delete(oldest);\n }\n }\n\n get size(): number {\n return this.map.size;\n }\n}\n\n/**\n * SQLite-backed embedding cache with L1 hot map + write-behind durable rows.\n *\n * L1 hits never touch SQLite on the recall/remember hot path. Durable writes\n * are deferred so the cache never contends with memory inserts on the same connection.\n *\n * @example\n * ```ts\n * const store = new SqliteEmbeddingCacheStore(() => db, { ttlMs: 86_400_000 });\n * ```\n */\nexport class SqliteEmbeddingCacheStore implements EmbeddingCacheStore {\n private readonly ttlMs: number | null;\n private readonly getDb: () => DatabaseSync | null;\n private readonly l1 = new L1Cache();\n private readonly pendingTouches = new Set<string>();\n private readonly pendingSets = new Map<\n string,\n { model: string; vector: Float32Array; createdAt: number }\n >();\n private persistScheduled = false;\n private stmts: {\n get: StatementSync;\n delete: StatementSync;\n set: StatementSync;\n touch: StatementSync;\n count: StatementSync;\n evict: StatementSync;\n } | null = null;\n\n /**\n * @param dbOrGetter - SQLite `DatabaseSync` or lazy getter (allows late bind).\n * @param options.ttlMs - Optional TTL for cache entries on read.\n */\n constructor(\n dbOrGetter: DatabaseSync | (() => DatabaseSync | null),\n options?: { ttlMs?: number | null },\n ) {\n this.ttlMs = options?.ttlMs ?? null;\n this.getDb =\n typeof dbOrGetter === \"function\" ? dbOrGetter : () => dbOrGetter;\n }\n\n private requireDb(): DatabaseSync | null {\n try {\n return this.getDb();\n } catch {\n return null;\n }\n }\n\n private ensureStatements(db: DatabaseSync): NonNullable<typeof this.stmts> {\n if (this.stmts) {\n return this.stmts;\n }\n this.stmts = {\n get: db.prepare(\n `SELECT model, vector, last_used_at, created_at\n FROM embedding_cache\n WHERE cache_key = ?`,\n ),\n delete: db.prepare(`DELETE FROM embedding_cache WHERE cache_key = ?`),\n set: db.prepare(\n `INSERT INTO embedding_cache (cache_key, model, vector, created_at, last_used_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(cache_key) DO UPDATE SET\n model = excluded.model,\n vector = excluded.vector,\n last_used_at = excluded.last_used_at`,\n ),\n touch: db.prepare(\n `UPDATE embedding_cache SET last_used_at = ? WHERE cache_key = ?`,\n ),\n count: db.prepare(`SELECT COUNT(*) AS c FROM embedding_cache`),\n evict: db.prepare(\n `DELETE FROM embedding_cache WHERE cache_key IN (\n SELECT cache_key FROM embedding_cache\n ORDER BY last_used_at ASC\n LIMIT ?\n )`,\n ),\n };\n return this.stmts;\n }\n\n async get(cacheKey: string): Promise<Float32Array | null> {\n const l1Hit = this.l1.get(cacheKey, this.ttlMs);\n if (l1Hit) {\n return l1Hit;\n }\n // Pending durable write not yet flushed — still a hit.\n const pending = this.pendingSets.get(cacheKey);\n if (pending) {\n this.l1.set(cacheKey, pending.model, pending.vector);\n return pending.vector;\n }\n\n // Cold-path durable read: restore cache after process restart.\n const db = this.requireDb();\n if (!db) return null;\n try {\n const stmts = this.ensureStatements(db);\n const row = stmts.get.get(cacheKey) as\n | { model: string; vector: Uint8Array | Buffer; created_at: string | null }\n | undefined;\n if (!row) return null;\n\n if (this.ttlMs !== null) {\n const createdMs = row.created_at ? Date.parse(row.created_at) : 0;\n if (createdMs && Date.now() - createdMs > this.ttlMs) {\n stmts.delete.run(cacheKey);\n return null;\n }\n }\n\n const vector = bufferToEmbedding(row.vector);\n this.l1.set(cacheKey, row.model, vector);\n\n // Update durable LRU asynchronously via pendingTouches.\n this.pendingTouches.add(cacheKey);\n if (this.pendingTouches.size >= TOUCH_FLUSH_THRESHOLD) {\n this.schedulePersist();\n }\n\n return vector;\n } catch {\n return null;\n }\n }\n\n async set(\n cacheKey: string,\n model: string,\n vector: Float32Array,\n ): Promise<void> {\n this.l1.set(cacheKey, model, vector);\n this.pendingSets.set(cacheKey, {\n model,\n vector,\n createdAt: Date.now(),\n });\n this.pendingTouches.delete(cacheKey);\n this.schedulePersist();\n }\n\n async touch(cacheKey: string): Promise<void> {\n this.l1.touch(cacheKey);\n if (this.pendingSets.has(cacheKey)) {\n return;\n }\n this.pendingTouches.add(cacheKey);\n if (this.pendingTouches.size >= TOUCH_FLUSH_THRESHOLD) {\n this.schedulePersist();\n }\n }\n\n async flushTouches(): Promise<void> {\n await this.flushPending();\n }\n\n async evictIfNeeded(maxEntries: number): Promise<void> {\n this.l1.evictIfNeeded(maxEntries);\n // Durable eviction is deferred — L1 already respects the cap.\n }\n\n private schedulePersist(): void {\n if (this.persistScheduled) {\n return;\n }\n this.persistScheduled = true;\n queueMicrotask(() => {\n this.persistScheduled = false;\n void this.flushPending();\n });\n }\n\n private async flushPending(): Promise<void> {\n if (this.pendingSets.size === 0 && this.pendingTouches.size === 0) {\n return;\n }\n const db = this.requireDb();\n if (!db) {\n this.pendingSets.clear();\n this.pendingTouches.clear();\n return;\n }\n const sets = [...this.pendingSets.entries()];\n this.pendingSets.clear();\n const touches = [...this.pendingTouches];\n this.pendingTouches.clear();\n\n const requeue = (): void => {\n for (const [key, value] of sets) {\n this.pendingSets.set(key, value);\n }\n for (const key of touches) {\n this.pendingTouches.add(key);\n }\n this.stmts = null; // force re-prepare on retry\n this.schedulePersist();\n };\n const now = new Date().toISOString();\n try {\n const stmts = this.ensureStatements(db);\n // Best-effort durable write outside the memory write critical section.\n // Use a short IMMEDIATE try; if busy, re-queue and retry later.\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n } catch {\n for (const [key, value] of sets) {\n this.pendingSets.set(key, value);\n }\n for (const key of touches) {\n this.pendingTouches.add(key);\n }\n this.schedulePersist();\n return;\n }\n try {\n for (const [key, value] of sets) {\n stmts.set.run(\n key,\n value.model,\n embeddingToBuffer(value.vector),\n new Date(value.createdAt).toISOString(),\n now,\n );\n }\n for (const key of touches) {\n stmts.touch.run(now, key);\n }\n db.exec(\"COMMIT\");\n } catch {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore\n }\n requeue();\n }\n } catch {\n requeue();\n }\n }\n}\n\n/** In-memory-only embedding cache for tests and providers without SQL access. */\nexport class MemoryEmbeddingCacheStore implements EmbeddingCacheStore {\n private readonly l1: L1Cache;\n private readonly ttlMs: number | null;\n\n constructor(options?: { ttlMs?: number | null; maxEntries?: number }) {\n this.ttlMs = options?.ttlMs ?? null;\n this.l1 = new L1Cache(options?.maxEntries ?? L1_DEFAULT_MAX);\n }\n\n async get(cacheKey: string): Promise<Float32Array | null> {\n return this.l1.get(cacheKey, this.ttlMs);\n }\n\n async set(\n cacheKey: string,\n model: string,\n vector: Float32Array,\n ): Promise<void> {\n this.l1.set(cacheKey, model, vector);\n }\n\n async touch(cacheKey: string): Promise<void> {\n this.l1.touch(cacheKey);\n }\n\n async evictIfNeeded(maxEntries: number): Promise<void> {\n this.l1.evictIfNeeded(maxEntries);\n }\n}\n\ntype PgQueryable = {\n query: (\n text: string,\n params?: unknown[],\n ) => Promise<{ rows: Record<string, unknown>[]; rowCount: number | null }>;\n};\n\n/**\n * Postgres embedding cache: L1-only on the hot path by default.\n *\n * Durable writes are fire-and-forget on a deferred chain. Set `durable: true`\n * only when cross-process cache sharing is required — it can reduce speedup under concurrency.\n */\nexport class PostgresEmbeddingCacheStore implements EmbeddingCacheStore {\n private readonly ttlMs: number | null;\n private readonly getClient: () => PgQueryable | null;\n private readonly l1 = new L1Cache();\n private readonly pendingTouches = new Set<string>();\n private persistChain: Promise<void> = Promise.resolve();\n private durableEnabled: boolean;\n\n constructor(\n getClient: () => PgQueryable | null,\n options?: { ttlMs?: number | null; durable?: boolean },\n ) {\n this.getClient = getClient;\n this.ttlMs = options?.ttlMs ?? null;\n // Durable off by default for write-heavy / concurrent workloads.\n // L1 still delivers multi-x cache hits within a process.\n this.durableEnabled = options?.durable === true;\n }\n\n async get(cacheKey: string): Promise<Float32Array | null> {\n return this.l1.get(cacheKey, this.ttlMs);\n }\n\n async set(\n cacheKey: string,\n model: string,\n vector: Float32Array,\n ): Promise<void> {\n this.l1.set(cacheKey, model, vector);\n if (!this.durableEnabled) {\n return;\n }\n const now = Date.now();\n this.enqueuePersist(async (client) => {\n const iso = new Date(now).toISOString();\n await client.query(\n `INSERT INTO embedding_cache (cache_key, model, vector, created_at, last_used_at)\n VALUES ($1, $2, $3, $4::timestamptz, $5::timestamptz)\n ON CONFLICT (cache_key) DO UPDATE SET\n model = EXCLUDED.model,\n vector = EXCLUDED.vector,\n last_used_at = EXCLUDED.last_used_at`,\n [cacheKey, model, embeddingToBuffer(vector), iso, iso],\n );\n });\n }\n\n async touch(cacheKey: string): Promise<void> {\n this.l1.touch(cacheKey);\n if (!this.durableEnabled) {\n return;\n }\n this.pendingTouches.add(cacheKey);\n if (this.pendingTouches.size >= TOUCH_FLUSH_THRESHOLD) {\n void this.flushTouches();\n }\n }\n\n async flushTouches(): Promise<void> {\n if (!this.durableEnabled || this.pendingTouches.size === 0) {\n this.pendingTouches.clear();\n return;\n }\n const keys = [...this.pendingTouches];\n this.pendingTouches.clear();\n const now = new Date().toISOString();\n this.enqueuePersist(async (client) => {\n await client.query(\n `UPDATE embedding_cache\n SET last_used_at = $1::timestamptz\n WHERE cache_key = ANY($2::text[])`,\n [now, keys],\n );\n });\n }\n\n async evictIfNeeded(maxEntries: number): Promise<void> {\n this.l1.evictIfNeeded(maxEntries);\n }\n\n private enqueuePersist(\n work: (client: PgQueryable) => Promise<void>,\n ): void {\n this.persistChain = this.persistChain\n .then(async () => {\n const client = this.getClient();\n if (!client) {\n return;\n }\n await work(client);\n })\n .catch(() => undefined);\n }\n}\n","/**\n * LLM provider abstractions and OpenAI-compatible chat implementation.\n *\n * Used for memory compression ({@link Wolbarg.compress}) and experimental\n * {@link Wolbarg.rememberFromMessages} extract mode.\n *\n * ## Custom LLM providers\n *\n * Pass any object that implements {@link LlmProvider} as `llm` in\n * {@link WolbargOptions}:\n *\n * ```ts\n * const myLlm: LlmProvider = {\n * model: \"my-model\",\n * async complete(messages) {\n * // Call your backend; return the assistant text\n * return \"...\";\n * },\n * async validate() {\n * await this.complete([{ role: \"user\", content: \"ok\" }]);\n * },\n * };\n *\n * const ctx = wolbarg({\n * organization: \"acme\",\n * database: { provider: \"sqlite\", url: \"./memory.db\" },\n * embedding: openaiEmbedding({ apiKey: \"...\", model: \"text-embedding-3-small\" }),\n * llm: myLlm, // or openaiLlm({ ... }) / openaiCompatibleLlm({ ... })\n * });\n * ```\n *\n * Built-in factories (`openaiLlm`, `ollamaLlm`, `openRouterLlm`,\n * `openaiCompatibleLlm`) wrap any OpenAI-compatible `/v1/chat/completions` API.\n */\n\nimport type { LlmConfig } from \"../types/index.js\";\nimport { CompressionError } from \"../errors/index.js\";\nimport { joinUrl } from \"../utils/index.js\";\n\n/**\n * One message in a chat completion request.\n *\n * @property role - Speaker role. Use `\"system\"` for instructions, `\"user\"` for\n * prompts, `\"assistant\"` for prior model turns.\n * @property content - Plain-text message body (non-empty for useful completions).\n */\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\n/**\n * Contract for any chat completion backend used by Wolbarg.\n *\n * Implement this interface to plug in a custom LLM (Anthropic, local GGUF via\n * a custom HTTP bridge, Azure OpenAI with extra headers, etc.). The SDK only\n * requires {@link LlmProvider.complete} to return the assistant reply as a\n * string; streaming is not used.\n *\n * @example Custom provider\n * ```ts\n * const anthropicLike: LlmProvider = {\n * model: \"claude-sonnet\",\n * async complete(messages) {\n * const res = await fetch(\"https://api.example.com/complete\", {\n * method: \"POST\",\n * body: JSON.stringify({ messages }),\n * });\n * const data = await res.json();\n * return String(data.text);\n * },\n * async validate() {\n * const reply = await this.complete([{ role: \"user\", content: \"ping\" }]);\n * if (!reply.trim()) throw new Error(\"empty reply\");\n * },\n * };\n * ```\n */\nexport interface LlmProvider {\n /** Model identifier reported in telemetry / logs (any non-empty string). */\n readonly model: string;\n /**\n * Run a chat completion and return the assistant message text.\n *\n * @param messages - Ordered conversation turns. The last message is typically\n * the user (or system+user) prompt the SDK builds for compression / extract.\n * @returns Trimmed assistant text. Empty responses should throw.\n * @throws When the backend fails, times out, or returns no text.\n */\n complete(messages: ChatMessage[]): Promise<string>;\n /**\n * Lightweight connectivity probe invoked during boot when an LLM is configured.\n * Implementations typically call {@link LlmProvider.complete} with a tiny prompt.\n *\n * @throws When the endpoint is unreachable or misconfigured.\n */\n validate(): Promise<void>;\n}\n\ninterface OpenAIChatResponse {\n choices?: Array<{ message?: { content?: string | null } }>;\n error?: { message?: string };\n}\n\n/**\n * OpenAI-compatible chat completions client (`POST {baseUrl}/chat/completions`).\n *\n * Works with OpenAI, Ollama, OpenRouter, LM Studio, vLLM, Azure OpenAI (when\n * the path matches), and any other server that speaks the same JSON schema.\n *\n * @param config - See {@link LlmConfig} for each field (`baseUrl`, `apiKey`,\n * `model`, optional `temperature`, `maxTokens`, `timeoutMs`).\n */\nexport class OpenAICompatibleLlmProvider implements LlmProvider {\n /** Model name sent in the request body and exposed on the provider. */\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 /**\n * @param config - OpenAI-compatible endpoint settings.\n * @param config.baseUrl - API root, e.g. `https://api.openai.com/v1` (no trailing `/chat/completions`).\n * @param config.apiKey - Bearer token (`Authorization: Bearer …`). Use any non-empty\n * string for local servers that ignore auth (e.g. `\"ollama\"`).\n * @param config.model - Chat model id (e.g. `\"gpt-4o-mini\"`, `\"llama3.2\"`).\n * @param config.temperature - Sampling temperature. Defaults to `0.2`.\n * @param config.maxTokens - Max completion tokens. Defaults to `4096`.\n * @param config.timeoutMs - Abort after this many ms. Defaults to `60_000`.\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 /**\n * Call `/chat/completions` and return the first choice’s message content.\n *\n * @param messages - Chat turns in OpenAI message format.\n * @returns Trimmed assistant text.\n * @throws {CompressionError} On HTTP errors, timeouts, or empty content.\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 /**\n * Probe the endpoint with a fixed `\"ok\"` prompt.\n *\n * @throws {CompressionError} When validation fails.\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 /**\n * Low-level HTTP request to `/chat/completions`.\n *\n * @param messages - Chat turns to send.\n * @returns Parsed OpenAI-style JSON body.\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 /** @param error - Unknown thrown value. @returns Human-readable message. */\n private describe(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n}\n\n/**\n * Build an {@link LlmProvider} from {@link LlmConfig}.\n *\n * Prefer named helpers ({@link openaiLlm}, {@link ollamaLlm}, …) when the\n * default `baseUrl` matches your host; use this (or {@link openaiCompatibleLlm})\n * when you need a fully custom base URL.\n *\n * @param config - Full OpenAI-compatible config including `baseUrl`.\n * @returns A ready-to-use {@link OpenAICompatibleLlmProvider}.\n *\n * @example\n * ```ts\n * const llm = createLlmProvider({\n * baseUrl: \"https://api.openai.com/v1\",\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\n * temperature: 0.2,\n * maxTokens: 4096,\n * });\n * ```\n */\nexport function createLlmProvider(config: LlmConfig): LlmProvider {\n return new OpenAICompatibleLlmProvider(config);\n}\n\n/**\n * Internal helper that binds a default `baseUrl` for named factory exports.\n *\n * @param defaults - Must include `baseUrl`; other {@link LlmConfig} fields optional.\n * @returns A factory `(config) => LlmProvider` where `baseUrl` may be omitted.\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\n/**\n * OpenAI-compatible LLM with an explicit `baseUrl` (any compatible host).\n *\n * @param config - Full {@link LlmConfig} including `baseUrl`, `apiKey`, `model`.\n * @returns {@link LlmProvider} instance.\n *\n * @example\n * ```ts\n * llm: openaiCompatibleLlm({\n * baseUrl: \"https://my-proxy.example.com/v1\",\n * apiKey: process.env.API_KEY!,\n * model: \"gpt-4o-mini\",\n * })\n * ```\n */\nexport const openaiCompatibleLlm = (config: LlmConfig): LlmProvider =>\n createLlmProvider(config);\n\n/**\n * OpenAI Chat Completions (`https://api.openai.com/v1`).\n *\n * @param config - `apiKey` and `model` required; optional `temperature`,\n * `maxTokens`, `timeoutMs`, and override `baseUrl`.\n * @returns {@link LlmProvider} for use as `llm` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\n * })\n * ```\n */\nexport const openaiLlm = llmFactory({\n baseUrl: \"https://api.openai.com/v1\",\n});\n\n/**\n * Local Ollama OpenAI-compatible API (`http://127.0.0.1:11434/v1`).\n *\n * @param config - `apiKey` may be any non-empty string (Ollama often ignores it);\n * `model` is the Ollama model name (e.g. `\"llama3.2\"`).\n * @returns {@link LlmProvider} pointing at the local Ollama server.\n *\n * @example\n * ```ts\n * llm: ollamaLlm({ apiKey: \"ollama\", model: \"llama3.2\" })\n * ```\n */\nexport const ollamaLlm = llmFactory({\n baseUrl: \"http://127.0.0.1:11434/v1\",\n});\n\n/**\n * OpenRouter chat API (`https://openrouter.ai/api/v1`).\n *\n * @param config - Use your OpenRouter API key and a routed model id\n * (e.g. `\"openai/gpt-4o-mini\"`).\n * @returns {@link LlmProvider} for OpenRouter.\n *\n * @example\n * ```ts\n * llm: openRouterLlm({\n * apiKey: process.env.OPENROUTER_API_KEY!,\n * model: \"openai/gpt-4o-mini\",\n * })\n * ```\n */\nexport const openRouterLlm = llmFactory({\n baseUrl: \"https://openrouter.ai/api/v1\",\n});\n","/**\n * Document parsers for the ingest pipeline.\n *\n * Converts files, buffers, and raw text into {@link ParsedDocument} instances\n * before chunking and embedding. Optional peers: `pdf-parse`, `mammoth`.\n *\n * @example\n * ```ts\n * import { resolveParser, loadIngestSource } from \"wolbarg/ingest\";\n *\n * const source = await loadIngestSource({ path: \"./report.pdf\" });\n * const parser = resolveParser(source.filename, source.mimeType);\n * const doc = await parser.parse({ buffer: source.buffer, filename: source.filename });\n * ```\n */\n\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ConfigurationError } from \"../errors/index.js\";\n\n/** Normalized output from a document parser. */\nexport interface ParsedDocument {\n /** Extracted plain text (empty for image-only sources). */\n text: string;\n /** Detected or declared MIME type. */\n mimeType: string;\n /** Original filename when known. */\n filename?: string;\n /** Whether the source is a raster image requiring OCR/vision. */\n isImage: boolean;\n /** Raw image bytes when `isImage` is true. */\n imageBuffer?: Buffer;\n}\n\n/**\n * Contract for document parsers.\n *\n * Implement this interface to add HTML, EPUB, or proprietary format support.\n * Register custom parsers in the array passed to {@link resolveParser}.\n *\n * @example Custom parser\n * ```ts\n * const htmlParser: DocumentParserProvider = {\n * name: \"html\",\n * extensions: [\".html\"],\n * async parse({ buffer }) {\n * return { text: buffer.toString(\"utf8\"), mimeType: \"text/html\", isImage: false };\n * },\n * };\n * ```\n */\nexport interface DocumentParserProvider {\n /** Parser identifier. */\n readonly name: string;\n /** File extensions this parser handles (lowercase, with dot). */\n readonly extensions: string[];\n /**\n * Parse a document buffer into text and optional image payload.\n * @param input - Buffer plus optional filename and MIME hints.\n */\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 let mod: unknown;\n try {\n mod = await import(\"mammoth\" as string);\n } catch (error) {\n throw new ConfigurationError(\n 'DOCX ingest requires the optional peer package \"mammoth\". Install it with: npm install mammoth',\n {\n cause: error instanceof Error ? error : undefined,\n suggestion: \"npm install mammoth\",\n operation: \"parse\",\n },\n );\n }\n\n const extractRawText =\n (mod as {\n extractRawText?: (opts: { buffer: Buffer }) => Promise<{ value: string }>;\n }).extractRawText ??\n (mod as {\n default?: {\n extractRawText: (opts: { buffer: Buffer }) => Promise<{ value: string }>;\n };\n }).default?.extractRawText;\n\n if (!extractRawText) {\n throw new ConfigurationError(\n \"DOCX ingest could not find mammoth.extractRawText. Ensure your mammoth version is compatible.\",\n { operation: \"parse\" },\n );\n }\n\n try {\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 (error) {\n throw new ConfigurationError(\n \"DOCX ingest failed to parse the document (it may be corrupt or an unsupported .docx).\",\n {\n cause: error instanceof Error ? error : undefined,\n suggestion: \"Try a different DOCX file or ensure it is not password-protected.\",\n operation: \"parse\",\n },\n );\n }\n }\n}\n\n/** Built-in parsers tried by {@link resolveParser} in order. */\nconst DEFAULT_PARSERS: DocumentParserProvider[] = [\n new TextParser(),\n new ImageParser(),\n new PdfParser(),\n new DocxParser(),\n];\n\n/**\n * Pick a parser by file extension or MIME type.\n *\n * @param filename - Original filename (used for extension lookup).\n * @param mimeType - Optional MIME fallback when extension is unknown.\n * @param parsers - Parser list (defaults to {@link DEFAULT_PARSERS}).\n * @returns Matching {@link DocumentParserProvider} (text parser as final fallback).\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\n/**\n * Load ingest input from path, buffer, or inline text.\n *\n * @param source - Exactly one of `path`, `buffer`, or `text` must be provided.\n * @returns Normalized buffer, filename, MIME, and optional raw text.\n * @throws {@link ConfigurationError} when no source field is set.\n *\n * @example\n * ```ts\n * const { buffer, filename } = await loadIngestSource({ path: \"./notes.md\" });\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\n/** Default parser chain: text, image, PDF, DOCX. */\nexport { DEFAULT_PARSERS };\n","/**\n * Constructor options for Wolbarg (v0.5.5).\n *\n * Pass **provider instances** (custom implementations of the interfaces) or\n * **config objects / factory helpers**. Discriminated at runtime via\n * {@link isEmbeddingProvider}, {@link isLlmProvider}, {@link isStorageProvider},\n * {@link isTelemetryProvider}, and {@link isGraphProvider}.\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 { GraphConfig, GraphProvider } from \"../graph/types.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 ConcurrencyConfig,\n DatabaseConfig,\n EmbeddingCacheConfig,\n EmbeddingConfig,\n LlmConfig,\n MemoryDedupeConfig,\n RetrievalConfig,\n StorageConfig,\n TelemetryConfig,\n} from \"../types/index.js\";\nimport type { VisionProvider } from \"../vision/index.js\";\n\n/**\n * Embedding input: a live {@link EmbeddingProvider} **or** an\n * {@link EmbeddingConfig} / factory result (`openaiEmbedding(...)`, etc.).\n *\n * Custom provider example:\n * ```ts\n * const embedding: EmbeddingProvider = {\n * model: \"custom\",\n * embed: async (text) => { /* return Float32Array *\\/ },\n * validate: async () => ({ dimensions: 768 }),\n * };\n * ```\n */\nexport type EmbeddingInput = EmbeddingProvider | EmbeddingConfig;\n\n/**\n * LLM input: a live {@link LlmProvider} **or** an {@link LlmConfig} /\n * factory result (`openaiLlm(...)`, `ollamaLlm(...)`, etc.).\n *\n * Required for {@link Wolbarg.compress} and `rememberFromMessages({ mode: \"extract\" })`.\n *\n * Custom provider example:\n * ```ts\n * const llm: LlmProvider = {\n * model: \"my-model\",\n * complete: async (messages) => { /* return assistant text *\\/ },\n * validate: async () => { /* ping endpoint *\\/ },\n * };\n * ```\n */\nexport type LlmInput = LlmProvider | LlmConfig;\n\n/**\n * Storage input: a live {@link StorageProvider} **or** a\n * {@link StorageConfig} / {@link DatabaseConfig} (`{ provider: \"sqlite\", url }`).\n */\nexport type StorageInput = StorageProvider | StorageConfig | DatabaseConfig;\n\n/**\n * Graph input: a live {@link GraphProvider} **or** a {@link GraphConfig}\n * (`sqliteGraph({ path })` / `neo4jGraph({ url, username, password })`).\n */\nexport type GraphInput = GraphProvider | GraphConfig;\n\n/**\n * Shared constructor fields (with or without LLM).\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 `storage: sqlite(...)` / `postgres(...)` in docs; `database` remains supported.\n */\n storage?: StorageInput;\n /**\n * Alias for `storage`. Accepts `{ provider, url }` or `{ provider, connectionString }`,\n * or a custom {@link StorageProvider}.\n */\n database?: StorageInput;\n /**\n * Embedding provider instance or config.\n * Use {@link openaiEmbedding} / {@link ollamaEmbedding} / etc., raw\n * {@link EmbeddingConfig}, or any custom {@link EmbeddingProvider}.\n */\n embedding: EmbeddingInput;\n /**\n * Optional independent telemetry system (separate database or custom\n * {@link TelemetryProvider}).\n */\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 /**\n * Optional reranker — skipped when absent.\n * Implement {@link RerankerProvider} or use `jinaReranker` / `cohereReranker` / etc.\n */\n reranker?: RerankerProvider;\n /**\n * Optional keyword search — enables hybrid recall when present.\n * Implement {@link KeywordSearchProvider} or use {@link bm25}.\n */\n keywordSearch?: KeywordSearchProvider;\n /**\n * Optional OCR for image ingest.\n * Implement {@link OCRProvider} or use {@link tesseract}.\n */\n ocr?: OCRProvider;\n /**\n * Optional vision model for image captions during ingest.\n * Implement {@link VisionProvider} or use {@link openaiVision} / {@link geminiVision}.\n */\n vision?: VisionProvider;\n /**\n * Optional graph memory layer (SQLite embedded or Neo4j networked).\n * Fully optional — omitting it does not change existing memory behavior.\n * Accepts a {@link GraphProvider} instance or a recognized config shape.\n */\n graph?: GraphInput;\n /**\n * Optional compression provider (overrides the default LLM-backed compressor).\n * Implement {@link CompressionProvider} for a fully custom compress pipeline.\n */\n compression?: CompressionProvider;\n /**\n * Optional default chunking strategy for ingest.\n * Implement {@link ChunkingStrategy} or use `createChunkingStrategy(...)`.\n */\n chunking?: ChunkingStrategy;\n /** Optional retrieval defaults (over-fetch, hybrid weights, MMR). */\n retrieval?: RetrievalConfig;\n /** SQLite multi-writer concurrency tuning (ignored for Postgres). */\n concurrency?: ConcurrencyConfig;\n /** Transparent embedding cache (default enabled). */\n embeddingCache?: EmbeddingCacheConfig;\n /** Memory write-path options (dedupe / upsert). */\n memory?: {\n /** Exact / near-duplicate detection on remember. See {@link MemoryDedupeConfig}. */\n dedupe?: MemoryDedupeConfig;\n };\n}\n\n/**\n * Options when no LLM is configured (`compress` / extract mode unavailable).\n */\nexport interface WolbargOptionsWithoutLlm extends WolbargOptionsBase {\n llm?: undefined;\n}\n\n/**\n * Options when an LLM is configured (enables {@link Wolbarg.compress}).\n */\nexport interface WolbargOptionsWithLlm extends WolbargOptionsBase {\n /**\n * Chat model used for compression and extract-mode rememberFromMessages.\n * Pass a custom {@link LlmProvider} (`complete` + `validate`) or a config /\n * factory such as {@link openaiLlm} / {@link ollamaLlm} /\n * {@link openaiCompatibleLlm}.\n */\n llm: LlmInput;\n}\n\n/** Discriminated union of constructor options. */\nexport type WolbargOptions =\n | WolbargOptionsWithoutLlm\n | WolbargOptionsWithLlm;\n\n/**\n * Type guard: value is a live {@link EmbeddingProvider} (has `embed`).\n *\n * @param value - Embedding config or provider instance.\n * @returns `true` when `value.embed` is a function.\n */\nexport function isEmbeddingProvider(\n value: EmbeddingInput,\n): value is EmbeddingProvider {\n return typeof (value as EmbeddingProvider).embed === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link LlmProvider} (has `complete`).\n *\n * @param value - LLM config or provider instance.\n * @returns `true` when `value.complete` is a function.\n */\nexport function isLlmProvider(value: LlmInput): value is LlmProvider {\n return typeof (value as LlmProvider).complete === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link StorageProvider} (has `open`).\n *\n * @param value - Storage/database config or provider instance.\n * @returns `true` when `value.open` is a function.\n */\nexport function isStorageProvider(\n value: StorageInput,\n): value is StorageProvider {\n return typeof (value as StorageProvider).open === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link TelemetryProvider} (has `emit`).\n *\n * @param value - Telemetry config or provider instance.\n * @returns `true` when `value.emit` is a function.\n */\nexport function isTelemetryProvider(\n value: TelemetryConfig | TelemetryProvider,\n): value is TelemetryProvider {\n return typeof (value as TelemetryProvider).emit === \"function\";\n}\n\n/**\n * Type guard: value is a live {@link GraphProvider}.\n *\n * @param value - Graph config or provider instance.\n * @returns `true` when `open`, `linkMemories`, and `getRelated` are functions.\n */\nexport function isGraphProvider(value: GraphInput): value is GraphProvider {\n return (\n typeof (value as GraphProvider).open === \"function\" &&\n typeof (value as GraphProvider).linkMemories === \"function\" &&\n typeof (value as GraphProvider).getRelated === \"function\"\n );\n}\n\n/**\n * Resolve connection path from `url` or `connectionString` on a DB config.\n *\n * @param config - Database or storage config object.\n * @returns Non-empty connection string/path, or `\"\"` if neither field is set.\n */\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/**\n * Evaluate a metadata filter against an in-memory metadata object.\n *\n * Used as fallback when SQL push-down is unavailable or for post-filtering.\n *\n * @param metadata - Opaque memory metadata record.\n * @param filter - {@link MetadataFilter} AST to evaluate.\n * @returns `true` when the metadata satisfies the filter.\n */\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 * Compile MetadataFilter ASTs into SQLite json_extract predicates.\n * Returns null when the filter cannot be pushed down safely.\n */\n\nimport type { MetadataComparison, MetadataFilter } from \"./types.js\";\n\nexport interface CompiledMetadataSql {\n /** SQL boolean expression (no leading AND). */\n expression: string;\n params: unknown[];\n}\n\nconst FIELD_RE =\n /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\n\nfunction jsonPath(field: string): string | null {\n if (!FIELD_RE.test(field)) {\n return null;\n }\n return `$.${field}`;\n}\n\nfunction compileComparison(\n field: string,\n op: MetadataComparison,\n): CompiledMetadataSql | null {\n const path = jsonPath(field);\n if (!path) {\n return null;\n }\n const extract = `json_extract(metadata_json, '${path}')`;\n\n if (\"eq\" in op) {\n const value = op.eq;\n // SQLite treats `NULL = NULL` as NULL (unknown), so `IS NULL` isn't enough\n // to distinguish explicit JSON null vs missing keys. Use json_type(...)\n // which returns the string \"null\" only for explicit JSON null.\n if (value === null) {\n return {\n expression: `json_type(metadata_json, '${path}') = 'null'`,\n params: [],\n };\n }\n if (\n value !== null &&\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n return null;\n }\n return { expression: `${extract} = ?`, params: [value] };\n }\n if (\"contains\" in op) {\n return {\n expression: `CAST(${extract} AS TEXT) LIKE '%' || ? || '%'`,\n params: [op.contains],\n };\n }\n if (\"gt\" in op) {\n return { expression: `${extract} > ?`, params: [op.gt] };\n }\n if (\"gte\" in op) {\n return { expression: `${extract} >= ?`, params: [op.gte] };\n }\n if (\"lt\" in op) {\n return { expression: `${extract} < ?`, params: [op.lt] };\n }\n if (\"lte\" in op) {\n return { expression: `${extract} <= ?`, params: [op.lte] };\n }\n if (\"between\" in op) {\n const [lo, hi] = op.between;\n return {\n expression: `${extract} >= ? AND ${extract} <= ?`,\n params: [lo, hi],\n };\n }\n return null;\n}\n\n/** Push a metadata filter into SQLite `json_extract` predicates, or `null` if unsupported. */\nexport function compileMetadataFilterToSql(\n filter: MetadataFilter,\n): CompiledMetadataSql | null {\n if (\"and\" in filter) {\n if (filter.and.length === 0) {\n return { expression: \"1\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n for (const child of filter.and) {\n const compiled = compileMetadataFilterToSql(child);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" AND \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"or\" in filter) {\n if (filter.or.length === 0) {\n return { expression: \"0\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n for (const child of filter.or) {\n const compiled = compileMetadataFilterToSql(child);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" OR \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"not\" in filter) {\n const inner = compileMetadataFilterToSql(filter.not);\n if (!inner) {\n return null;\n }\n return {\n expression: `NOT (${inner.expression})`,\n params: inner.params,\n };\n }\n return compileComparison(filter.field, filter.op);\n}\n","/**\n * Cross-platform structured logger gated by {@link TelemetryLogLevel}.\n *\n * Used internally by {@link TelemetryEmitter}; also exported for adapter packages.\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 /** @param level - Minimum level to print (default `\"info\"`). */\n constructor(private level: TelemetryLogLevel = \"info\") {}\n\n /** Change the minimum log level at runtime. */\n setLevel(level: TelemetryLogLevel): void {\n this.level = level;\n }\n\n /** @returns Current minimum log level. */\n getLevel(): TelemetryLogLevel {\n return this.level;\n }\n\n /** Log at error level. */\n error(message: string, extra?: unknown): void {\n this.write(\"error\", message, extra);\n }\n\n /** Log at warn level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\n */\n warn(message: string, extra?: unknown): void {\n this.write(\"warn\", message, extra);\n }\n\n /** Log at info level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\n */\n info(message: string, extra?: unknown): void {\n this.write(\"info\", message, extra);\n }\n\n /** Log at debug level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\n */\n debug(message: string, extra?: unknown): void {\n this.write(\"debug\", message, extra);\n }\n\n /** Log at trace level.\n * @param message - Primary log line.\n * @param extra - Optional structured payload.\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 * SQL schema constants and migration statements.\n */\n\n/** Current schema version written to `Wolbarg_meta.schema_version`. */\nexport const SCHEMA_VERSION = 4;\n\n/** Keys stored in the `Wolbarg_meta` key-value table. */\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 content_hash 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', 'updated')),\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/**\n * FTS5 index for keyword / BM25 search.\n * `organization` stays UNINDEXED so tenant IDs are not Porter-tokenized;\n * equality filters and bulk DELETE BY organization still use the stored value.\n */\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_EMBEDDING_CACHE_TABLE = `\nCREATE TABLE IF NOT EXISTS embedding_cache (\n cache_key TEXT PRIMARY KEY NOT NULL,\n model TEXT NOT NULL,\n vector BLOB NOT NULL,\n created_at TEXT NOT NULL,\n last_used_at TEXT NOT NULL\n);\n`;\n\n/**\n * Graph memory tables (SQLite graph provider — separate DB file by default).\n * `type` is the node kind (`memory` | `entity`); entity classification lives in metadata.\n */\nexport const CREATE_GRAPH_NODES_TABLE = `\nCREATE TABLE IF NOT EXISTS graph_nodes (\n id TEXT PRIMARY KEY NOT NULL,\n type TEXT NOT NULL CHECK (type IN ('memory', 'entity')),\n ref_id TEXT NOT NULL,\n name TEXT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n);\n`;\n\nexport const CREATE_GRAPH_EDGES_TABLE = `\nCREATE TABLE IF NOT EXISTS graph_edges (\n id TEXT PRIMARY KEY NOT NULL,\n from_node_id TEXT NOT NULL,\n to_node_id TEXT NOT NULL,\n relation TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n FOREIGN KEY (from_node_id) REFERENCES graph_nodes(id) ON DELETE CASCADE,\n FOREIGN KEY (to_node_id) REFERENCES graph_nodes(id) ON DELETE CASCADE\n);\n`;\n\n/** Indexes required for in-SQL recursive CTE graph walks. */\nexport const CREATE_GRAPH_INDEXES = [\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_graph_nodes_type_ref\n ON graph_nodes(type, ref_id);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_from\n ON graph_edges(from_node_id);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_to\n ON graph_edges(to_node_id);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_from_rel\n ON graph_edges(from_node_id, relation);`,\n `CREATE INDEX IF NOT EXISTS idx_graph_edges_to_rel\n ON graph_edges(to_node_id, relation);`,\n] as const;\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 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 /** Agent-scoped active list (compress / forget-by-agent). */\n `CREATE INDEX IF NOT EXISTS idx_memories_org_agent_active_created\n ON memories(organization, agent, created_at) WHERE archived = 0;`,\n `CREATE INDEX IF NOT EXISTS idx_history_memory_id ON memory_history(memory_id);`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_org_agent_hash_active\n ON memories(organization, agent, content_hash)\n WHERE archived = 0 AND content_hash IS NOT NULL;`,\n `CREATE INDEX IF NOT EXISTS idx_embedding_cache_last_used\n ON embedding_cache(last_used_at);`,\n] as const;\n\n/** Dropped in schema v4 — global created_at index was unused (all queries scope by org). */\nexport const DROP_REDUNDANT_INDEXES_V4 = [\n `DROP INDEX IF EXISTS idx_memories_created_at;`,\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 *\n * @param dimensions - Embedding vector length (positive integer).\n * @returns `CREATE VIRTUAL TABLE … vec0(…)` DDL string.\n * @throws {Error} When dimensions is not a positive integer.\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 * Each property is a parameterized query string consumed by\n * {@link SqliteStorageProvider} — not a public runtime API, but exported\n * for tests, tooling, and custom SQLite adapters.\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, content_hash, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, 0, NULL, ?, ?, ?)\n RETURNING rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n `,\n\n getMemoryById: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, 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, content_hash, 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, content_hash, 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, content_hash, created_at, updated_at\n FROM memories\n WHERE organization = ?\n `,\n\n findActiveByContentHash: `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE organization = ? AND agent = ? AND content_hash = ? AND archived = 0\n LIMIT 1\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 OR REPLACE 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 content_hash = COALESCE(?, content_hash),\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\n deleteFtsByOrg: `\n DELETE FROM memories_fts WHERE organization = ?\n `,\n\n deleteFtsByOrgAgent: `\n DELETE FROM memories_fts WHERE organization = ? AND agent = ?\n `,\n\n deleteEmbeddingsByOrg: `\n DELETE FROM memory_embeddings WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ?\n )\n `,\n\n deleteEmbeddingsByOrgAgent: `\n DELETE FROM memory_embeddings WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ? AND agent = ?\n )\n `,\n\n deleteEmbeddingsBlobByOrg: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ?\n )\n `,\n\n deleteEmbeddingsBlobByOrgAgent: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE organization = ? AND agent = ?\n )\n `,\n\n deleteArchivedEmbeddings: `\n DELETE FROM memory_embeddings WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE archived = 1\n )\n `,\n\n deleteArchivedEmbeddingsBlob: `\n DELETE FROM memory_embeddings_blob WHERE memory_rowid IN (\n SELECT rowid FROM memories WHERE archived = 1\n )\n `,\n\n /** Single-pass org stats (avoids 4 separate COUNT queries). */\n getStats: `\n SELECT\n COUNT(*) AS total,\n COALESCE(SUM(CASE WHEN archived = 0 THEN 1 ELSE 0 END), 0) AS active,\n COALESCE(SUM(CASE WHEN archived = 1 THEN 1 ELSE 0 END), 0) AS archived,\n COUNT(DISTINCT CASE WHEN archived = 0 THEN agent END) AS agents\n FROM memories\n WHERE organization = ?\n `,\n} as const;\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\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 search.\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 /**\n * @param dimensions - Embedding vector length.\n * @param initialCapacity - Initial slot capacity (default `256`).\n */\n constructor(dimensions: number, initialCapacity = 256) {\n this.dims = dimensions;\n this.data = new Float32Array(initialCapacity * dimensions);\n }\n\n /** Number of indexed vectors. */\n get size(): number {\n return this.count;\n }\n\n /** Remove all vectors from the index. */\n clear(): void {\n this.rowids.length = 0;\n this.rowidToSlot.clear();\n this.count = 0;\n }\n\n /**\n * Insert or replace a vector for `rowid` (L2-normalized internally).\n * @param rowid - Memory table row identifier.\n * @param embedding - Raw embedding vector.\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 /**\n * Remove a vector by `rowid`.\n * @param rowid - Memory table row identifier.\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 /**\n * Top-k by cosine distance (1 - dot) assuming query is L2-normalized.\n *\n * @param queryNormalized - L2-normalized query vector (use {@link normalizeEmbedding}).\n * @param topK - Maximum hits to return.\n */\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 const rowid = rowids[i]!;\n\n if (heapSize < k) {\n heapDist[heapSize] = distance;\n heapRow[heapSize] = rowid;\n heapSize += 1;\n if (heapSize === k) {\n buildMaxHeap(heapDist, heapRow, k);\n }\n } else {\n const worstDist = heapDist[0]!;\n const worstRow = heapRow[0]!;\n // Deterministic heap behavior: when distances tie, keep the smaller rowid.\n if (distance < worstDist || (distance === worstDist && rowid < worstRow)) {\n heapDist[0] = distance;\n heapRow[0] = rowid;\n siftDown(heapDist, heapRow, 0, k);\n }\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) => {\n const diff = a.distance - b.distance;\n if (diff !== 0) return diff;\n return a.memoryRowid - b.memoryRowid;\n });\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/**\n * L2-normalize an embedding into a new Float32Array of exactly `dims` length.\n *\n * @param embedding - Source vector (may be shorter than `dims`; padded with zeros).\n * @param dims - Output dimensionality (defaults to `embedding.length`).\n */\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 (\n left < n &&\n (dist[left]! > dist[largest]! ||\n (dist[left]! === dist[largest]! && rows[left]! > rows[largest]!))\n ) largest = left;\n if (\n right < n &&\n (dist[right]! > dist[largest]! ||\n (dist[right]! === dist[largest]! && rows[right]! > rows[largest]!))\n ) 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 multi-writer concurrency defaults and validation.\n */\n\nimport { ConfigurationError } from \"../../errors/index.js\";\n\nexport interface ConcurrencyConfig {\n /** Max retry attempts after SQLITE_BUSY. Default: 5 */\n maxRetries?: number;\n /** Base backoff in ms before jitter. Default: 50 */\n baseBackoffMs?: number;\n /** Cap on backoff delay in ms. Default: 2000 */\n maxBackoffMs?: number;\n /** SQLite busy_timeout pragma in ms. Default: 5000 */\n lockTimeoutMs?: number;\n /**\n * Hard ceiling for total lock-wait + retry budget in ms.\n * Default: lockTimeoutMs * (maxRetries + 1).\n */\n lockDeadlineMs?: number;\n /**\n * When true, use multi-process-oriented defaults (higher busy_timeout / retries)\n * unless the caller overrides individual fields.\n */\n multiProcess?: boolean;\n}\n\nexport interface ResolvedConcurrencyConfig {\n maxRetries: number;\n baseBackoffMs: number;\n maxBackoffMs: number;\n lockTimeoutMs: number;\n lockDeadlineMs: number;\n}\n\nexport const DEFAULT_CONCURRENCY: ResolvedConcurrencyConfig = {\n maxRetries: 5,\n baseBackoffMs: 50,\n maxBackoffMs: 2000,\n lockTimeoutMs: 5000,\n lockDeadlineMs: 30_000,\n};\n\n/** Stronger defaults when many OS processes share one SQLite file. */\nexport const MULTI_PROCESS_CONCURRENCY: ResolvedConcurrencyConfig = {\n maxRetries: 12,\n baseBackoffMs: 40,\n maxBackoffMs: 3000,\n lockTimeoutMs: 15_000,\n lockDeadlineMs: 90_000,\n};\n\nexport function resolveConcurrencyConfig(\n input?: ConcurrencyConfig,\n): ResolvedConcurrencyConfig {\n const base = input?.multiProcess\n ? MULTI_PROCESS_CONCURRENCY\n : DEFAULT_CONCURRENCY;\n const maxRetries = input?.maxRetries ?? base.maxRetries;\n const baseBackoffMs = input?.baseBackoffMs ?? base.baseBackoffMs;\n const maxBackoffMs = input?.maxBackoffMs ?? base.maxBackoffMs;\n const lockTimeoutMs = input?.lockTimeoutMs ?? base.lockTimeoutMs;\n const lockDeadlineMs =\n input?.lockDeadlineMs ??\n Math.max(base.lockDeadlineMs, lockTimeoutMs * (maxRetries + 1));\n\n const resolved: ResolvedConcurrencyConfig = {\n maxRetries,\n baseBackoffMs,\n maxBackoffMs,\n lockTimeoutMs,\n lockDeadlineMs,\n };\n\n assertPositiveInt(resolved.maxRetries, \"concurrency.maxRetries\");\n assertPositiveNumber(resolved.baseBackoffMs, \"concurrency.baseBackoffMs\");\n assertPositiveNumber(resolved.maxBackoffMs, \"concurrency.maxBackoffMs\");\n assertPositiveInt(resolved.lockTimeoutMs, \"concurrency.lockTimeoutMs\");\n assertPositiveInt(resolved.lockDeadlineMs, \"concurrency.lockDeadlineMs\");\n\n if (resolved.maxBackoffMs < resolved.baseBackoffMs) {\n throw new ConfigurationError(\n \"concurrency.maxBackoffMs must be >= concurrency.baseBackoffMs\",\n );\n }\n\n return resolved;\n}\n\nfunction assertPositiveInt(value: number, field: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new ConfigurationError(`${field} must be a non-negative integer`);\n }\n}\n\nfunction assertPositiveNumber(value: number, field: string): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new ConfigurationError(`${field} must be a non-negative number`);\n }\n}\n","/**\n * BEGIN IMMEDIATE transactions with SQLITE_BUSY retry + jitter backoff.\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\nimport { StorageLockedError } from \"../../errors/index.js\";\nimport type { ResolvedConcurrencyConfig } from \"./concurrency-config.js\";\n\nexport function isSqliteBusyError(error: unknown): boolean {\n const raw = error instanceof Error ? error.message : String(error);\n const lower = raw.toLowerCase();\n return (\n lower.includes(\"database is locked\") ||\n lower.includes(\"sqlite_busy\") ||\n lower.includes(\"busy\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Full-jitter exponential backoff, capped at maxBackoffMs. */\nfunction backoffDelay(\n attempt: number,\n config: ResolvedConcurrencyConfig,\n): number {\n const exp = Math.min(\n config.maxBackoffMs,\n config.baseBackoffMs * 2 ** attempt,\n );\n // Full jitter: uniform in [0, exp] reduces synchronized retry storms.\n return Math.random() * exp;\n}\n\nfunction deadlineExceeded(\n startedAt: number,\n config: ResolvedConcurrencyConfig,\n): boolean {\n return performance.now() - startedAt >= config.lockDeadlineMs;\n}\n\n/**\n * Run `fn` inside BEGIN IMMEDIATE … COMMIT, retrying on SQLITE_BUSY.\n */\nexport function withImmediateTransactionSync<T>(\n db: DatabaseSync,\n config: ResolvedConcurrencyConfig,\n fn: () => T,\n onRetry?: (attempt: number, delayMs: number, error: unknown) => void,\n): T {\n let lastError: unknown;\n const startedAt = performance.now();\n for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {\n if (attempt > 0 && deadlineExceeded(startedAt, config)) {\n break;\n }\n try {\n db.exec(\"BEGIN IMMEDIATE\");\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 throw error;\n }\n } catch (error) {\n lastError = error;\n const isBusy = isSqliteBusyError(error);\n if (!isBusy) {\n throw error;\n }\n if (attempt >= config.maxRetries || deadlineExceeded(startedAt, config)) {\n break;\n }\n const delay = backoffDelay(attempt, config);\n onRetry?.(attempt + 1, delay, error);\n // Sync path: busy-wait is unavoidable for node:sqlite sync API.\n const end = Date.now() + delay;\n while (Date.now() < end) {\n /* spin */\n }\n }\n }\n throw new StorageLockedError(\n `SQLite write lock could not be acquired after ${config.maxRetries} retries`,\n {\n cause: lastError instanceof Error ? lastError : undefined,\n reason: \"SQLITE_BUSY exhausted retries\",\n suggestion:\n \"Increase concurrency.maxRetries / concurrency.lockDeadlineMs, set concurrency.multiProcess: true for shared-file writers, or use the Postgres backend.\",\n },\n );\n}\n\n/**\n * Async variant — preferred when callers can await between retries.\n */\nexport async function withImmediateTransaction<T>(\n db: DatabaseSync,\n config: ResolvedConcurrencyConfig,\n fn: () => T | Promise<T>,\n onRetry?: (attempt: number, delayMs: number, error: unknown) => void,\n): Promise<T> {\n let lastError: unknown;\n const startedAt = performance.now();\n for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {\n if (attempt > 0 && deadlineExceeded(startedAt, config)) {\n break;\n }\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n try {\n const result = await fn();\n db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // ignore\n }\n throw error;\n }\n } catch (error) {\n lastError = error;\n const isBusy = isSqliteBusyError(error);\n if (!isBusy) {\n throw error;\n }\n if (attempt >= config.maxRetries || deadlineExceeded(startedAt, config)) {\n break;\n }\n const delay = backoffDelay(attempt, config);\n onRetry?.(attempt + 1, delay, error);\n await sleep(delay);\n }\n }\n throw new StorageLockedError(\n `SQLite write lock could not be acquired after ${config.maxRetries} retries`,\n {\n cause: lastError instanceof Error ? lastError : undefined,\n reason: \"SQLITE_BUSY exhausted retries\",\n suggestion:\n \"Increase concurrency.maxRetries / concurrency.lockDeadlineMs, set concurrency.multiProcess: true for shared-file writers, or use the Postgres backend.\",\n },\n );\n}\n","/**\n * Memory content normalization + hash for write-time dedupe.\n */\n\nimport { createHash } from \"node:crypto\";\n\n/**\n * Normalize memory content for exact-match dedupe:\n * 1. Unicode NFC\n * 2. Trim\n * 3. Collapse internal whitespace runs to a single space\n * 4. Do NOT case-fold\n *\n * @param text - Raw memory text.\n * @returns Normalized string used for hashing and comparison.\n */\nexport function normalizeMemoryContent(text: string): string {\n return text.normalize(\"NFC\").trim().replace(/\\s+/g, \" \");\n}\n\n/**\n * SHA-256 hash of normalized memory content for write-time exact dedupe.\n *\n * @param text - Raw memory text (normalized internally).\n */\nexport function hashMemoryContent(text: string): string {\n const normalized = normalizeMemoryContent(text);\n return createHash(\"sha256\").update(normalized, \"utf8\").digest(\"hex\");\n}\n\nexport type MemoryDedupeStrategy = \"exact\" | \"near\" | \"exact-or-near\";\n\nexport interface MemoryDedupeConfig {\n enabled?: boolean;\n strategy?: MemoryDedupeStrategy;\n /** Cosine similarity threshold for near-dup. Default 0.92 */\n nearThreshold?: number;\n /** Max vector candidates for near-dup. Default 8 */\n nearCandidateLimit?: number;\n}\n\nexport interface ResolvedMemoryDedupeConfig {\n enabled: boolean;\n strategy: MemoryDedupeStrategy;\n nearThreshold: number;\n nearCandidateLimit: number;\n}\n\n/** Default resolved dedupe settings when dedupe is disabled or omitted. */\nexport const DEFAULT_MEMORY_DEDUPE: ResolvedMemoryDedupeConfig = {\n enabled: false,\n strategy: \"exact-or-near\",\n nearThreshold: 0.92,\n nearCandidateLimit: 8,\n};\n\n/**\n * Resolve dedupe config from constructor options or per-call override.\n *\n * @param input - `true`/`false`, partial config, or `undefined` for defaults.\n */\nexport function resolveMemoryDedupeConfig(\n input?: boolean | MemoryDedupeConfig,\n): ResolvedMemoryDedupeConfig {\n if (input === undefined) {\n return { ...DEFAULT_MEMORY_DEDUPE };\n }\n if (typeof input === \"boolean\") {\n return { ...DEFAULT_MEMORY_DEDUPE, enabled: input };\n }\n return {\n enabled: input.enabled ?? true,\n strategy: input.strategy ?? DEFAULT_MEMORY_DEDUPE.strategy,\n nearThreshold: input.nearThreshold ?? DEFAULT_MEMORY_DEDUPE.nearThreshold,\n nearCandidateLimit:\n input.nearCandidateLimit ?? DEFAULT_MEMORY_DEDUPE.nearCandidateLimit,\n };\n}\n\n/**\n * Shallow-merge incoming metadata onto existing keys (incoming wins).\n *\n * @param existing - Stored metadata object.\n * @param incoming - New metadata from remember/update.\n */\nexport function mergeMemoryMetadata(\n existing: Record<string, unknown>,\n incoming: Record<string, unknown>,\n): Record<string, unknown> {\n return { ...existing, ...incoming };\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 { AsyncLocalStorage } from \"node:async_hooks\";\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 { compileMetadataFilterToSql } from \"../../filters/sql-compile.js\";\nimport { WolbargLogger } from \"../../telemetry/logger.js\";\nimport {\n CREATE_BLOB_EMBEDDINGS_TABLE,\n CREATE_EMBEDDING_CACHE_TABLE,\n CREATE_FTS_TABLE,\n CREATE_HISTORY_TABLE,\n CREATE_INDEXES,\n CREATE_MEMORIES_TABLE,\n CREATE_META_TABLE,\n DROP_REDUNDANT_INDEXES_V4,\n META_KEYS,\n SCHEMA_VERSION,\n buildVectorTableSql,\n type VectorBackend,\n} from \"../../schema/index.js\";\nimport { SQL } from \"../../sql/index.js\";\nimport {\n AsyncMutex,\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\";\nimport {\n resolveConcurrencyConfig,\n type ConcurrencyConfig,\n type ResolvedConcurrencyConfig,\n} from \"../sqlite/concurrency-config.js\";\nimport {\n withImmediateTransaction,\n isSqliteBusyError,\n} from \"../sqlite/transaction.js\";\nimport { hashMemoryContent } from \"../../memory/dedupe.js\";\n\n/** Hard cap when metadata cannot be fully pushed to SQL (prevents O(n) RAM blowups). */\nconst MAX_METADATA_SCAN = 50_000;\nconst METADATA_PAGE_SIZE = 500;\n/**\n * Multi-row INSERT chunk size. SQLite default bind limit is 999; 9 binds/row → 110.\n * Leave headroom for side-table multi-value inserts in the same transaction.\n */\nconst BATCH_INSERT_CHUNK = 96;\n/** Max ANN overfetch when post-filtering by org/agent/archived. */\nconst MAX_ANN_OVERFETCH = 8192;\n/** Coalesce concurrent single-row inserts (multi-writer throughput). */\nconst INSERT_COALESCE_THRESHOLD = 24;\nconst INSERT_COALESCE_MAX = 96;\n\nconst warnLogger = new WolbargLogger(\"warn\");\nlet warnedSqliteVecFallback = false;\nlet warnedFtsKeywordSearch = false;\n\ninterface PreparedStatements {\n getMeta: StatementSync;\n setMeta: StatementSync;\n insertMemory: StatementSync;\n updateMemoryContent: StatementSync;\n getMemoryById: StatementSync;\n getMemoryByRowid: StatementSync;\n findActiveByContentHash: 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 getStats: StatementSync;\n listRowidsForOrg: StatementSync;\n listRowidsForOrgAgent: StatementSync;\n vectorTableExists: StatementSync;\n blobTableExists: StatementSync;\n insertFts: StatementSync | null;\n deleteFts: StatementSync | null;\n deleteFtsByOrg: StatementSync | null;\n deleteFtsByOrgAgent: StatementSync | null;\n searchFts: StatementSync | null;\n deleteEmbeddingsByOrg: StatementSync | null;\n deleteEmbeddingsByOrgAgent: StatementSync | null;\n deleteEmbeddingsBlobByOrg: StatementSync | null;\n deleteEmbeddingsBlobByOrgAgent: StatementSync | null;\n}\n\nexport interface SqliteProviderOptions {\n /** Filesystem path or `:memory:` connection string. */\n connectionString: string;\n /** Optional write-lock tuning for concurrent async callers. */\n concurrency?: ConcurrencyConfig;\n}\n\n/**\n * SQLite + sqlite-vec {@link StorageProvider} (Node.js built-in `node:sqlite`).\n */\nexport class SqliteStorageProvider implements StorageProvider {\n readonly name = \"sqlite\";\n\n private readonly connectionString: string;\n private readonly concurrency: ResolvedConcurrencyConfig;\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 /** Tracks nesting depth for {@link withTransaction} so we can use savepoints. */\n private transactionDepth = 0;\n /** Incrementing counter for deterministic savepoint names. */\n private savepointCounter = 0;\n /**\n * Serializes top-level write transactions on the single SQLite connection.\n * SQLite is single-writer; serializing in-process avoids SQLITE_BUSY churn\n * AND prevents interleaved BEGIN/SAVEPOINT state corruption when many async\n * callers share one connection (see \"no such savepoint\" class of bugs).\n */\n private readonly writeMutex = new AsyncMutex();\n /**\n * Async-context flag: true while executing inside a top-level write\n * transaction held by this provider. Used so writes issued from within an\n * ambient transaction (e.g. compress()) join that ACID unit, WITHOUT\n * mistaking the coalescer's own flush window for an ambient transaction.\n */\n private readonly txContext = new AsyncLocalStorage<boolean>();\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 private retryLog: ((msg: string) => void) | null = null;\n /** Cached prepared statements for `rowid IN (…)` lookups keyed by list length. */\n private rowidInStatements = new Map<number, StatementSync>();\n /** Cached list SQL statements keyed by clause shape. */\n private listStatements = new Map<string, StatementSync>();\n /** Cached multi-row insert statements keyed by row count. */\n private batchInsertStatements = new Map<number, StatementSync>();\n /** Cached multi-row history inserts keyed by row count. */\n private batchHistoryStatements = new Map<number, StatementSync>();\n /** Cached multi-row FTS inserts keyed by row count. */\n private batchFtsStatements = new Map<number, StatementSync>();\n /** Cached multi-row blob embedding inserts keyed by row count. */\n private batchBlobEmbStatements = new Map<number, StatementSync>();\n /** Coalesce concurrent insertMemory callers into one IMMEDIATE transaction. */\n private insertQueue: Array<{\n input: InsertMemoryInput;\n resolve: (row: MemoryRow) => void;\n reject: (err: unknown) => void;\n }> = [];\n private insertFlushScheduled = false;\n\n /**\n * @param options - SQLite path / `:memory:` and optional concurrency config.\n */\n constructor(options: SqliteProviderOptions) {\n this.connectionString = options.connectionString;\n this.concurrency = resolveConcurrencyConfig(options.concurrency);\n }\n\n /** Absolute or relative path / `:memory:` used by this provider. */\n get path(): string {\n return this.connectionString;\n }\n\n /** Expose DB for embedding cache store (same connection). */\n getDatabase(): DatabaseSync | null {\n return this.db;\n }\n\n /** Register a callback invoked when SQLite busy retries occur (tests / diagnostics). */\n setRetryLogger(fn: ((msg: string) => void) | null): void {\n this.retryLog = fn;\n }\n\n /** Open the database, run migrations, and prepare statements. */\n async open(): Promise<void> {\n // Opening + WAL switch + migrations take brief locks. Under a startup storm\n // (many processes opening one file at once) these can throw SQLITE_BUSY\n // BEFORE any per-write retry loop applies, so retry the whole open here.\n const startedAt = performance.now();\n let attempt = 0;\n for (;;) {\n try {\n this.openOnce();\n return;\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\n const busy = isSqliteBusyError(error);\n const exhausted =\n attempt >= this.concurrency.maxRetries ||\n performance.now() - startedAt >= this.concurrency.lockDeadlineMs;\n if (!busy || exhausted) {\n throw new InitializationError(\n `Failed to open SQLite database: ${this.describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n const base = Math.min(\n this.concurrency.maxBackoffMs,\n this.concurrency.baseBackoffMs * 2 ** attempt,\n );\n const delay = Math.random() * base;\n this.retryLog?.(\n `SQLITE_BUSY during open attempt=${attempt + 1} backoffMs=${Math.round(delay)}`,\n );\n attempt += 1;\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n /** Single open attempt — connect, apply pragmas, migrate, prepare. */\n private openOnce(): void {\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 // busy_timeout must be set FIRST so the WAL switch + migrations below wait\n // for a contended lock instead of failing fast during a startup storm.\n db.exec(`PRAGMA busy_timeout = ${this.concurrency.lockTimeoutMs};`);\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 temp_store = MEMORY;\n PRAGMA cache_size = -32768;\n PRAGMA mmap_size = 134217728;\n PRAGMA wal_autocheckpoint = 2000;\n PRAGMA recursive_triggers = OFF;\n `);\n\n this.sqliteVecLoaded = this.tryLoadSqliteVec(db);\n this.runMigrations(db);\n this.statements = this.prepareStatements(db);\n // FTS consistency check only on fresh / upgraded DBs (see runMigrations).\n // Re-scanning every warm open costs measurable ms for no benefit.\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 if (!warnedSqliteVecFallback) {\n warnedSqliteVecFallback = true;\n warnLogger.warn(\n \"sqlite-vec unavailable on this platform; using blob ANN fallback.\",\n );\n }\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 }\n\n /** Drain pending inserts, optimize, and close the SQLite connection. */\n async close(): Promise<void> {\n // Drain coalesced inserts before tearing down the connection.\n const deadline = Date.now() + 2_000;\n while (this.insertQueue.length > 0 && Date.now() < deadline) {\n await this.flushInsertQueue();\n }\n if (!this.db) {\n return;\n }\n try {\n // Refresh query planner stats before close (cheap; measurable on large DBs).\n try {\n this.db.exec(\"PRAGMA optimize;\");\n } catch {\n // ignore — optimize is best-effort\n }\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 this.rowidInStatements.clear();\n this.listStatements.clear();\n this.batchInsertStatements.clear();\n this.batchHistoryStatements.clear();\n this.batchFtsStatements.clear();\n this.batchBlobEmbStatements.clear();\n }\n }\n\n /**\n * Create or validate vec0 / blob vector storage for the given dimensionality.\n *\n * @param dimensions - Embedding length from the configured model.\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 /** @inheritdoc StorageProvider.getEmbeddingDimensions */\n async getEmbeddingDimensions(): Promise<number | null> {\n return this.readMetaNumber(META_KEYS.embeddingDimensions);\n }\n\n /** @inheritdoc StorageProvider.setEmbeddingDimensions */\n async setEmbeddingDimensions(dimensions: number): Promise<void> {\n await this.setMeta(META_KEYS.embeddingDimensions, String(dimensions));\n this.vectorDimensions = dimensions;\n }\n\n /** Insert a single memory row (coalesced under concurrent writers). */\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n this.requireVectorReady();\n // Inside an ambient transaction (e.g. compress), write immediately so the\n // insert participates in the outer ACID unit instead of the coalesce queue.\n // Gate on the async-context flag (NOT transactionDepth): the coalescer's\n // own flush transiently sets transactionDepth while awaiting, and a\n // concurrent remember() must NOT be pulled onto the savepoint path there.\n if (this.txContext.getStore() === true) {\n return this.insertMemoryImmediate(input);\n }\n // Coalesce concurrent writers into one BEGIN IMMEDIATE + multi-row insert.\n // Without this, each remember() pays a full fsync-bound commit.\n return new Promise<MemoryRow>((resolve, reject) => {\n this.insertQueue.push({ input, resolve, reject });\n if (this.insertQueue.length >= INSERT_COALESCE_THRESHOLD) {\n this.insertFlushScheduled = false;\n void this.flushInsertQueue();\n return;\n }\n this.scheduleInsertFlush();\n });\n }\n\n private scheduleInsertFlush(): void {\n if (this.insertFlushScheduled) {\n return;\n }\n this.insertFlushScheduled = true;\n // setImmediate lets concurrent remember() callers join one IMMEDIATE tx.\n setImmediate(() => {\n this.insertFlushScheduled = false;\n void this.flushInsertQueue();\n });\n }\n\n private async flushInsertQueue(): Promise<void> {\n if (this.insertQueue.length === 0) {\n return;\n }\n const batch = this.insertQueue.splice(0, INSERT_COALESCE_MAX);\n try {\n if (batch.length === 1) {\n const row = await this.insertMemoryImmediate(batch[0]!.input);\n batch[0]!.resolve(row);\n } else {\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 }\n } catch (error) {\n for (const item of batch) {\n item.reject(error);\n }\n }\n if (this.insertQueue.length > 0) {\n void this.flushInsertQueue();\n }\n }\n\n /** Single-row insert without coalescing (used by flush of size 1). */\n private async insertMemoryImmediate(input: InsertMemoryInput): Promise<MemoryRow> {\n const stmts = this.requireStatements();\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\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 contentHash,\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 /** Batch insert memories in chunked multi-row transactions. */\n async insertMemoriesBatch(inputs: InsertMemoryInput[]): Promise<MemoryRow[]> {\n if (inputs.length === 0) {\n return [];\n }\n this.requireVectorReady();\n\n return this.withTransaction(() => {\n const rows: MemoryRow[] = [];\n for (let offset = 0; offset < inputs.length; offset += BATCH_INSERT_CHUNK) {\n const chunk = inputs.slice(offset, offset + BATCH_INSERT_CHUNK);\n const inserted = this.insertMemoryChunk(chunk);\n rows.push(...inserted);\n }\n return rows;\n });\n }\n\n /** Update memory content, metadata, embedding, and content hash. */\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 const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : input.contentText !== undefined\n ? hashMemoryContent(input.contentText)\n : (existing.content_hash ?? null);\n\n stmts.updateMemoryContent.run(\n input.contentText ?? null,\n input.metadata !== undefined ? metadataJson : null,\n contentHash,\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 stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"updated\",\n null,\n input.updatedAt,\n );\n\n return stmts.getMemoryById.get(input.id, input.organization) as unknown as MemoryRow;\n });\n }\n\n /** Find an active memory by org, agent, and content hash (dedupe). */\n async findActiveByContentHash(\n organization: string,\n agent: string,\n contentHash: string,\n ): Promise<MemoryRow | null> {\n const stmts = this.requireStatements();\n const row = stmts.findActiveByContentHash.get(\n organization,\n agent,\n contentHash,\n ) as unknown as MemoryRow | undefined;\n return row ?? null;\n }\n\n /** Scan memories matching metadata filters (may paginate in SQL). */\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 /** BM25 keyword search via FTS5 (`memories_fts`). */\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 if (!warnedFtsKeywordSearch) {\n warnedFtsKeywordSearch = true;\n warnLogger.warn(\n \"FTS keyword search is unavailable; returning empty keyword hits.\",\n );\n }\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 (error) {\n if (!warnedFtsKeywordSearch) {\n warnedFtsKeywordSearch = true;\n warnLogger.warn(\n \"FTS keyword search failed; returning empty keyword hits.\",\n {\n cause: error instanceof Error ? error.message : String(error),\n },\n );\n }\n return [];\n }\n }\n\n /** Fetch a memory row by UUID within an organization. */\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 /** Fetch a memory row by SQLite integer rowid within an organization. */\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 /** Batch-fetch memory rows by SQLite rowids within an organization. */\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 chunkSize = 400;\n for (let offset = 0; offset < rowids.length; offset += chunkSize) {\n const chunk = rowids.slice(offset, offset + chunkSize);\n const stmt = this.getRowidInStatement(chunk.length);\n const rows = stmt.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 /** List memories matching repository filters with optional limit. */\n async listMemories(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n try {\n if (filter.metadata) {\n return this.listMemoriesWithMetadata(filter, limit);\n }\n return this.listMemoriesIndexed(filter, limit);\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 /** Approximate nearest-neighbor search (vec0 or in-memory blob index). */\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 with adaptive overfetch.\n * Global ANN is post-filtered by org/agent/archived; underfill triggers larger k.\n */\n /** ANN search joined with memory rows and org/archived post-filters. */\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 (topK <= 0) {\n return [];\n }\n\n let fetchK = topK;\n const maxFetch = Math.min(Math.max(topK * 64, 512), MAX_ANN_OVERFETCH);\n let out: Array<{ row: MemoryRow; distance: number }> = [];\n\n while (true) {\n const hits = await this.searchVectors(embedding, fetchK);\n if (hits.length === 0) {\n return [];\n }\n const map = await this.getMemoriesByRowids(\n hits.map((h) => h.memoryRowid),\n organization,\n );\n out = [];\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 if (out.length >= topK) {\n return out;\n }\n }\n if (hits.length < fetchK) {\n break;\n }\n if (fetchK >= maxFetch) {\n break;\n }\n fetchK = Math.min(fetchK * 4, maxFetch);\n }\n return out;\n }\n\n /** Soft-archive memories (compression / forget paths). */\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 const orderedIds = [...new Set(ids)].sort();\n for (const id of orderedIds) {\n const existing = stmts.getMemoryById.get(id, organization) as unknown as\n | MemoryRow\n | undefined;\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 from ANN + FTS so recall never resurfaces archived rows.\n if (existing?.rowid !== undefined) {\n this.deleteEmbedding(existing.rowid);\n }\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 /** Hard-delete a single memory by id; returns whether a row was removed. */\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 /** Hard-delete memories matching org / agent / metadata filters. */\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 this.deleteEmbeddingsForScope(filter.organization, agent);\n this.deleteFtsForScope(filter.organization, agent);\n const result = stmts.deleteMemoriesByOrgAgent.run(\n filter.organization,\n agent,\n );\n return Number(result.changes);\n });\n }\n\n /** Remove all memories (and side tables) for an organization. */\n async clearOrganization(organization: string): Promise<number> {\n const stmts = this.requireStatements();\n\n return this.withTransaction(() => {\n this.deleteEmbeddingsForScope(organization);\n this.deleteFtsForScope(organization);\n const result = stmts.deleteMemoriesByOrg.run(organization);\n // Remove orphaned blob rows (memories may already be empty).\n try {\n this.requireDb().exec(`\n DELETE FROM memory_embeddings_blob\n WHERE memory_rowid NOT IN (SELECT rowid FROM memories)\n `);\n } catch {\n // ignore if blob table missing\n }\n return Number(result.changes);\n });\n }\n\n /** List audit history events for a memory id. */\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 /** Append a history row (created / archived / compressed / updated). */\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 /** Aggregate memory counts for an organization (single-pass SQL). */\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 row = stmts.getStats.get(organization) as unknown as {\n total: number | bigint;\n active: number | bigint;\n archived: number | bigint;\n agents: number | bigint;\n };\n return {\n totalMemories: Number(row.total),\n activeMemories: Number(row.active),\n archivedMemories: Number(row.archived),\n totalAgents: Number(row.agents),\n };\n }\n\n /** On-disk database file size in bytes (0 for `:memory:`). */\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 async withTransaction<T>(fn: () => T | Promise<T>): Promise<T> {\n const db = this.requireDb();\n // Genuine synchronous nesting inside an already-held transaction on this\n // connection (e.g. compress() -> insertMemory()/archiveMemories()).\n // SQLite forbids BEGIN/COMMIT inside a transaction, so we use SAVEPOINTs.\n // We DON'T re-acquire the write mutex here: the outer top-level tx already\n // holds it, so re-acquiring would self-deadlock.\n if (this.txContext.getStore() === true) {\n const savepointName = `wolbarg_sp_${this.savepointCounter++}`;\n db.exec(`SAVEPOINT ${savepointName}`);\n try {\n this.transactionDepth += 1;\n const result = await fn();\n db.exec(`RELEASE SAVEPOINT ${savepointName}`);\n return result;\n } catch (error) {\n try {\n db.exec(`ROLLBACK TO SAVEPOINT ${savepointName}`);\n } catch {\n // ignore rollback-to-savepoint failures; original error is more important\n }\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n // Top-level transaction: serialize on the connection so no two BEGIN\n // IMMEDIATE / SAVEPOINT sequences ever interleave on the shared handle.\n return this.writeMutex.runExclusive(() =>\n this.txContext.run(true, async () => {\n this.transactionDepth = 1;\n this.savepointCounter = 0;\n try {\n return await withImmediateTransaction(\n db,\n this.concurrency,\n fn,\n (attempt, delayMs) => {\n this.retryLog?.(\n `SQLITE_BUSY retry attempt=${attempt} backoffMs=${Math.round(delayMs)}`,\n );\n },\n );\n } finally {\n this.transactionDepth = 0;\n }\n }),\n );\n }\n\n // ─── internals ───────────────────────────────────────────────────────────\n\n private tryLoadSqliteVec(db: DatabaseSync): boolean {\n // win32-arm64 (and similar) cannot load sqlite-vec — skip the failed\n // load attempt on every open (saves cold-start ms).\n const plat = `${process.platform}-${process.arch}`;\n if (SqliteStorageProvider.sqliteVecUnsupported.has(plat)) {\n return false;\n }\n try {\n sqliteVec.load(db);\n return true;\n } catch {\n SqliteStorageProvider.sqliteVecUnsupported.add(plat);\n return false;\n }\n }\n\n private static sqliteVecUnsupported = new Set<string>();\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 db.exec(CREATE_EMBEDDING_CACHE_TABLE);\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 this.migrateToV3(db);\n for (const dropSql of DROP_REDUNDANT_INDEXES_V4) {\n db.exec(dropSql);\n }\n for (const indexSql of CREATE_INDEXES) {\n db.exec(indexSql);\n }\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n this.ensureFtsConsistency(db);\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 if (current < 3) {\n db.exec(CREATE_FTS_TABLE);\n this.backfillFts(db);\n this.migrateToV3(db);\n }\n if (current < 4) {\n this.migrateToV4(db);\n }\n for (const indexSql of CREATE_INDEXES) {\n db.exec(indexSql);\n }\n db.prepare(SQL.setMeta).run(META_KEYS.schemaVersion, String(SCHEMA_VERSION));\n this.ensureFtsConsistency(db);\n }\n // current === SCHEMA_VERSION: skip index churn and FTS rescans (warm-start path).\n }\n\n /**\n * Schema v4: drop unused global created_at index, strip archived vectors\n * from ANN, add agent-active covering index (via CREATE_INDEXES).\n */\n private migrateToV4(db: DatabaseSync): void {\n for (const dropSql of DROP_REDUNDANT_INDEXES_V4) {\n db.exec(dropSql);\n }\n\n // Archived memories must not remain in ANN (recall post-filter waste).\n try {\n db.prepare(SQL.deleteArchivedEmbeddings).run();\n } catch {\n // vec table may not exist yet\n }\n try {\n db.prepare(SQL.deleteArchivedEmbeddingsBlob).run();\n } catch {\n // ignore\n }\n this.memoryIndexDirty = true;\n }\n\n /**\n * Schema v3: content_hash column, history 'updated' event, embedding_cache.\n * SQLite cannot ALTER CHECK constraints — rebuild memory_history when needed.\n */\n private migrateToV3(db: DatabaseSync): void {\n // Add content_hash if missing\n const cols = db\n .prepare(`PRAGMA table_info(memories)`)\n .all() as unknown as Array<{ name: string }>;\n const hasHash = cols.some((c) => c.name === \"content_hash\");\n if (!hasHash) {\n db.exec(`ALTER TABLE memories ADD COLUMN content_hash TEXT`);\n }\n\n // Backfill content_hash for active rows (newest wins on collision via unique index)\n const active = db\n .prepare(\n `SELECT id, content_text, updated_at FROM memories WHERE archived = 0 ORDER BY updated_at DESC`,\n )\n .all() as unknown as Array<{\n id: string;\n content_text: string;\n updated_at: string;\n }>;\n const seen = new Set<string>();\n const updateHash = db.prepare(\n `UPDATE memories SET content_hash = ? WHERE id = ?`,\n );\n for (const row of active) {\n const hash = hashMemoryContent(row.content_text);\n // Scope uniqueness is (org, agent, hash) — we only have id here; full\n // uniqueness is enforced after org/agent-aware backfill below.\n updateHash.run(hash, row.id);\n }\n\n // Re-backfill with org+agent awareness: null out older duplicates\n const activeFull = db\n .prepare(\n `SELECT id, organization, agent, content_text, updated_at\n FROM memories WHERE archived = 0\n ORDER BY updated_at DESC`,\n )\n .all() as unknown as Array<{\n id: string;\n organization: string;\n agent: string;\n content_text: string;\n updated_at: string;\n }>;\n seen.clear();\n const clearHash = db.prepare(\n `UPDATE memories SET content_hash = NULL WHERE id = ?`,\n );\n const setHash = db.prepare(\n `UPDATE memories SET content_hash = ? WHERE id = ?`,\n );\n for (const row of activeFull) {\n const hash = hashMemoryContent(row.content_text);\n const key = `${row.organization}\\0${row.agent}\\0${hash}`;\n if (seen.has(key)) {\n clearHash.run(row.id);\n } else {\n seen.add(key);\n setHash.run(hash, row.id);\n }\n }\n\n // Rebuild history table to allow 'updated' in CHECK\n this.migrateHistoryAllowUpdated(db);\n db.exec(CREATE_EMBEDDING_CACHE_TABLE);\n }\n\n private migrateHistoryAllowUpdated(db: DatabaseSync): void {\n const sql = db\n .prepare(\n `SELECT sql FROM sqlite_master WHERE type='table' AND name='memory_history'`,\n )\n .get() as { sql?: string } | undefined;\n if (sql?.sql?.includes(\"'updated'\")) {\n return;\n }\n db.exec(`\n CREATE TABLE IF NOT EXISTS memory_history_v3 (\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', 'updated')),\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 INSERT INTO memory_history_v3 (id, memory_id, event_type, related_memory_id, created_at)\n SELECT id, memory_id, event_type, related_memory_id, created_at FROM memory_history;\n DROP TABLE memory_history;\n ALTER TABLE memory_history_v3 RENAME TO memory_history;\n CREATE INDEX IF NOT EXISTS idx_history_memory_id ON memory_history(memory_id);\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 deleteFtsByOrg: StatementSync | null = null;\n let deleteFtsByOrgAgent: StatementSync | null = null;\n let searchFts: StatementSync | null = null;\n try {\n insertFts = db.prepare(SQL.insertFts);\n deleteFts = db.prepare(SQL.deleteFts);\n deleteFtsByOrg = db.prepare(SQL.deleteFtsByOrg);\n deleteFtsByOrgAgent = db.prepare(SQL.deleteFtsByOrgAgent);\n searchFts = db.prepare(SQL.searchFts);\n } catch {\n // FTS optional\n }\n\n let deleteEmbeddingsByOrg: StatementSync | null = null;\n let deleteEmbeddingsByOrgAgent: StatementSync | null = null;\n let deleteEmbeddingsBlobByOrg: StatementSync | null = null;\n let deleteEmbeddingsBlobByOrgAgent: StatementSync | null = null;\n try {\n deleteEmbeddingsByOrg = db.prepare(SQL.deleteEmbeddingsByOrg);\n deleteEmbeddingsByOrgAgent = db.prepare(SQL.deleteEmbeddingsByOrgAgent);\n } catch {\n // vec table may not exist yet\n }\n try {\n deleteEmbeddingsBlobByOrg = db.prepare(SQL.deleteEmbeddingsBlobByOrg);\n deleteEmbeddingsBlobByOrgAgent = db.prepare(\n SQL.deleteEmbeddingsBlobByOrgAgent,\n );\n } catch {\n // ignore\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 findActiveByContentHash: db.prepare(SQL.findActiveByContentHash),\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 getStats: db.prepare(SQL.getStats),\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 deleteFtsByOrg,\n deleteFtsByOrgAgent,\n searchFts,\n deleteEmbeddingsByOrg,\n deleteEmbeddingsByOrgAgent,\n deleteEmbeddingsBlobByOrg,\n deleteEmbeddingsBlobByOrgAgent,\n };\n }\n\n private listMemoriesIndexed(\n filter: RepositoryFilter,\n limit?: number,\n ): MemoryRow[] {\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 key = `${filter.agent ? \"a\" : \"_\"}:${filter.includeArchived ? \"A\" : \"0\"}:${limit !== undefined ? \"L\" : \"_\"}`;\n let stmt = this.listStatements.get(key);\n if (!stmt) {\n let sql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n `;\n if (limit !== undefined) {\n sql += ` LIMIT ?`;\n }\n stmt = this.requireDb().prepare(sql);\n this.listStatements.set(key, stmt);\n }\n if (limit !== undefined) {\n return stmt.all(...params, limit) as unknown as MemoryRow[];\n }\n return stmt.all(...params) as unknown as MemoryRow[];\n }\n\n /**\n * Metadata-filtered list: push filters to json_extract when possible;\n * otherwise page with a hard scan cap (never load unbounded orgs into RAM).\n */\n private listMemoriesWithMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): MemoryRow[] {\n const want = limit ?? MAX_METADATA_SCAN;\n const compiled = filter.metadata\n ? compileMetadataFilterToSql(filter.metadata)\n : null;\n\n if (compiled) {\n const clauses: string[] = [`organization = ?`, `(${compiled.expression})`];\n const params: unknown[] = [filter.organization, ...compiled.params];\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, content_hash, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n LIMIT ?\n `;\n params.push(want);\n return this.requireDb()\n .prepare(sql)\n .all(...(params as never[])) as unknown as MemoryRow[];\n }\n\n // Fallback: paged JS filter with hard scan ceiling.\n const matched: MemoryRow[] = [];\n let offset = 0;\n const db = this.requireDb();\n const clauses: string[] = [`organization = ?`];\n const baseParams: Array<string | number> = [filter.organization];\n if (filter.agent) {\n clauses.push(`agent = ?`);\n baseParams.push(filter.agent);\n }\n if (!filter.includeArchived) {\n clauses.push(`archived = 0`);\n }\n const pageSql = `\n SELECT rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at ASC\n LIMIT ? OFFSET ?\n `;\n const pageStmt = db.prepare(pageSql);\n while (matched.length < want && offset < MAX_METADATA_SCAN) {\n const pageLimit = Math.min(METADATA_PAGE_SIZE, MAX_METADATA_SCAN - offset);\n const page = pageStmt.all(\n ...baseParams,\n pageLimit,\n offset,\n ) as unknown as MemoryRow[];\n if (page.length === 0) {\n break;\n }\n for (const row of page) {\n if (\n matchesMetadata(\n deserializeMetadata(row.metadata_json),\n filter.metadata!,\n )\n ) {\n matched.push(row);\n if (matched.length >= want) {\n return matched;\n }\n }\n }\n offset += page.length;\n if (page.length < pageLimit) {\n break;\n }\n }\n return matched;\n }\n\n private getRowidInStatement(count: number): StatementSync {\n let stmt = this.rowidInStatements.get(count);\n if (!stmt) {\n const placeholders = Array.from({ length: count }, () => \"?\").join(\",\");\n const sql = `${SQL.getMemoriesByRowidsPrefix}${placeholders})`;\n stmt = this.requireDb().prepare(sql);\n this.rowidInStatements.set(count, stmt);\n }\n return stmt;\n }\n\n private insertMemoryChunk(inputs: InsertMemoryInput[]): MemoryRow[] {\n const stmts = this.requireStatements();\n const n = inputs.length;\n if (n === 1) {\n const input = inputs[0]!;\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n const row = stmts.insertMemory.get(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n contentHash,\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 this.insertEmbedding(row.rowid, input.embedding);\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n stmts.insertHistory.run(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n return [row];\n }\n\n let stmt = this.batchInsertStatements.get(n);\n if (!stmt) {\n const valueRow =\n \"(?, ?, ?, ?, ?, 0, NULL, ?, ?, ?)\";\n const values = Array.from({ length: n }, () => valueRow).join(\", \");\n const sql = `\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n ) VALUES ${values}\n RETURNING rowid, id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n `;\n stmt = this.requireDb().prepare(sql);\n this.batchInsertStatements.set(n, stmt);\n }\n\n const binds: unknown[] = [];\n for (const input of inputs) {\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n binds.push(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n serializeMetadata(input.metadata),\n contentHash,\n input.createdAt,\n input.updatedAt,\n );\n }\n\n const rows = stmt.all(...(binds as never[])) as unknown as MemoryRow[];\n if (rows.length !== n) {\n throw new DatabaseError(\"Failed to read memories after batch insert\");\n }\n for (const row of rows) {\n if (row.rowid === undefined) {\n throw new DatabaseError(\"Failed to read memory rowid after batch insert\");\n }\n }\n\n // Multi-row side tables — one statement each instead of 3N run() calls.\n this.insertEmbeddingsBatch(rows, inputs);\n this.insertFtsBatch(inputs);\n this.insertHistoryBatch(inputs);\n return rows;\n }\n\n private insertEmbeddingsBatch(\n rows: MemoryRow[],\n inputs: InsertMemoryInput[],\n ): void {\n const n = rows.length;\n if (this.vectorBackend === \"sqlite-vec\") {\n for (let i = 0; i < n; i += 1) {\n this.insertEmbedding(rows[i]!.rowid!, inputs[i]!.embedding);\n }\n return;\n }\n // Blob backend: multi-value INSERT + incremental in-memory index upsert.\n let stmt = this.batchBlobEmbStatements.get(n);\n if (!stmt) {\n const values = Array.from({ length: n }, () => \"(?, ?)\").join(\", \");\n stmt = this.requireDb().prepare(\n `INSERT OR REPLACE INTO memory_embeddings_blob (memory_rowid, embedding) VALUES ${values}`,\n );\n this.batchBlobEmbStatements.set(n, stmt);\n }\n const binds: unknown[] = [];\n for (let i = 0; i < n; i += 1) {\n binds.push(rows[i]!.rowid!, embeddingToBuffer(inputs[i]!.embedding));\n }\n stmt.run(...(binds as never[]));\n if (this.memoryIndex && this.vectorDimensions !== null) {\n for (let i = 0; i < n; i += 1) {\n this.memoryIndex.upsert(rows[i]!.rowid!, inputs[i]!.embedding);\n }\n this.memoryIndexDirty = false;\n } else {\n this.memoryIndexDirty = true;\n }\n }\n\n private insertFtsBatch(inputs: InsertMemoryInput[]): void {\n const stmts = this.requireStatements();\n if (!stmts.insertFts) {\n return;\n }\n const n = inputs.length;\n let stmt = this.batchFtsStatements.get(n);\n if (!stmt) {\n const values = Array.from({ length: n }, () => \"(?, ?, ?, ?)\").join(\", \");\n stmt = this.requireDb().prepare(\n `INSERT INTO memories_fts (content_text, memory_id, organization, agent) VALUES ${values}`,\n );\n this.batchFtsStatements.set(n, stmt);\n }\n const binds: unknown[] = [];\n for (const input of inputs) {\n binds.push(\n input.contentText,\n input.id,\n input.organization,\n input.agent,\n );\n }\n try {\n stmt.run(...(binds as never[]));\n } catch {\n // Fall back to per-row if FTS shape differs.\n for (const input of inputs) {\n this.insertFtsRow(\n input.id,\n input.organization,\n input.agent,\n input.contentText,\n );\n }\n }\n }\n\n private insertHistoryBatch(inputs: InsertMemoryInput[]): void {\n const n = inputs.length;\n let stmt = this.batchHistoryStatements.get(n);\n if (!stmt) {\n const values = Array.from({ length: n }, () => \"(?, ?, ?, ?, ?)\").join(\n \", \",\n );\n stmt = this.requireDb().prepare(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ${values}`,\n );\n this.batchHistoryStatements.set(n, stmt);\n }\n const binds: unknown[] = [];\n for (const input of inputs) {\n binds.push(\n crypto.randomUUID(),\n input.id,\n \"created\",\n null,\n input.createdAt,\n );\n }\n stmt.run(...(binds as never[]));\n }\n\n private deleteEmbeddingsForScope(\n organization: string,\n agent?: string,\n ): void {\n const stmts = this.requireStatements();\n try {\n if (this.vectorBackend === \"sqlite-vec\") {\n if (agent) {\n stmts.deleteEmbeddingsByOrgAgent?.run(organization, agent);\n } else {\n stmts.deleteEmbeddingsByOrg?.run(organization);\n }\n } else {\n if (agent) {\n stmts.deleteEmbeddingsBlobByOrgAgent?.run(organization, agent);\n } else {\n stmts.deleteEmbeddingsBlobByOrg?.run(organization);\n }\n this.memoryIndexDirty = true;\n if (!agent) {\n this.memoryIndex?.clear();\n }\n }\n } catch {\n // Vector table may not exist yet on a fresh DB.\n }\n }\n\n private deleteFtsForScope(organization: string, agent?: string): void {\n const stmts = this.requireStatements();\n try {\n if (agent) {\n stmts.deleteFtsByOrgAgent?.run(organization, agent);\n } else {\n stmts.deleteFtsByOrg?.run(organization);\n }\n } catch {\n // FTS optional\n }\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 try {\n stmts.deleteEmbeddingsByOrg = db.prepare(SQL.deleteEmbeddingsByOrg);\n stmts.deleteEmbeddingsByOrgAgent = db.prepare(\n SQL.deleteEmbeddingsByOrgAgent,\n );\n } catch {\n // ignore\n }\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 try {\n stmts.deleteEmbeddingsBlobByOrg = db.prepare(SQL.deleteEmbeddingsBlobByOrg);\n stmts.deleteEmbeddingsBlobByOrgAgent = db.prepare(\n SQL.deleteEmbeddingsBlobByOrgAgent,\n );\n } catch {\n // ignore\n }\n }\n\n private insertEmbedding(rowid: number | bigint, embedding: Float32Array): void {\n const stmts = this.requireStatements();\n if (this.vectorBackend === \"sqlite-vec\") {\n // node:sqlite + sqlite-vec require BigInt for vec0 integer PKs (esp. Linux).\n stmts.insertEmbedding!.run(this.toVecRowid(rowid), this.toVectorParam(embedding));\n return;\n }\n const id = Number(rowid);\n stmts.insertEmbeddingBlob!.run(id, embeddingToBuffer(embedding));\n // Keep the hot in-memory ANN index incremental — avoid O(n) rebuilds.\n if (this.memoryIndex) {\n this.memoryIndex.upsert(id, embedding);\n this.memoryIndexDirty = false;\n } else {\n this.memoryIndexDirty = true;\n }\n }\n\n private deleteEmbedding(rowid: number | bigint): void {\n const stmts = this.requireStatements();\n try {\n if (this.vectorBackend === \"sqlite-vec\" && stmts.deleteEmbedding) {\n stmts.deleteEmbedding.run(this.toVecRowid(rowid));\n } else if (stmts.deleteEmbeddingBlob) {\n const id = Number(rowid);\n stmts.deleteEmbeddingBlob.run(id);\n this.memoryIndex?.remove(id);\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: Number(row.memory_rowid),\n distance: Number(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 /** sqlite-vec vec0 PKs must be bound as BigInt under node:sqlite. */\n private toVecRowid(rowid: number | bigint): bigint {\n return typeof rowid === \"bigint\" ? rowid : BigInt(rowid);\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 * Compile MetadataFilter ASTs into PostgreSQL JSONB predicates.\n * Returns null when the filter cannot be pushed down safely.\n */\n\nimport type { MetadataComparison, MetadataFilter } from \"./types.js\";\nimport type { CompiledMetadataSql } from \"./sql-compile.js\";\n\nconst FIELD_RE =\n /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\n\n/** Safe identifier path → JSONB text extract expression (no bind params). */\nfunction jsonbTextExtract(field: string): string | null {\n if (!FIELD_RE.test(field)) {\n return null;\n }\n const parts = field.split(\".\");\n if (parts.length === 1) {\n return `metadata_json->>'${parts[0]}'`;\n }\n const path = parts.join(\",\");\n return `metadata_json #>> '{${path}}'`;\n}\n\nfunction jsonbContainment(\n field: string,\n value: string | number | boolean | null,\n paramIndex: number,\n): CompiledMetadataSql | null {\n if (!FIELD_RE.test(field)) {\n return null;\n }\n const parts = field.split(\".\");\n let obj: unknown = value;\n for (let i = parts.length - 1; i >= 0; i -= 1) {\n obj = { [parts[i]!]: obj };\n }\n return {\n expression: `metadata_json @> $${paramIndex}::jsonb`,\n params: [JSON.stringify(obj)],\n };\n}\n\nfunction compileComparison(\n field: string,\n op: MetadataComparison,\n startIndex: number,\n): CompiledMetadataSql | null {\n if (\"eq\" in op) {\n const value = op.eq;\n if (\n value !== null &&\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n return null;\n }\n return jsonbContainment(field, value, startIndex);\n }\n\n const extract = jsonbTextExtract(field);\n if (!extract) {\n return null;\n }\n\n if (\"contains\" in op) {\n return {\n expression: `${extract} LIKE '%' || $${startIndex} || '%'`,\n params: [op.contains],\n };\n }\n if (\"gt\" in op) {\n return {\n expression: `(${extract})::numeric > $${startIndex}`,\n params: [op.gt],\n };\n }\n if (\"gte\" in op) {\n return {\n expression: `(${extract})::numeric >= $${startIndex}`,\n params: [op.gte],\n };\n }\n if (\"lt\" in op) {\n return {\n expression: `(${extract})::numeric < $${startIndex}`,\n params: [op.lt],\n };\n }\n if (\"lte\" in op) {\n return {\n expression: `(${extract})::numeric <= $${startIndex}`,\n params: [op.lte],\n };\n }\n if (\"between\" in op) {\n const [lo, hi] = op.between;\n return {\n expression: `(${extract})::numeric >= $${startIndex} AND (${extract})::numeric <= $${startIndex + 1}`,\n params: [lo, hi],\n };\n }\n return null;\n}\n\nfunction compileInner(\n filter: MetadataFilter,\n startIndex: number,\n): CompiledMetadataSql | null {\n if (\"and\" in filter) {\n if (filter.and.length === 0) {\n return { expression: \"TRUE\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n let idx = startIndex;\n for (const child of filter.and) {\n const compiled = compileInner(child, idx);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n idx += compiled.params.length;\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" AND \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"or\" in filter) {\n if (filter.or.length === 0) {\n return { expression: \"FALSE\", params: [] };\n }\n const parts: CompiledMetadataSql[] = [];\n let idx = startIndex;\n for (const child of filter.or) {\n const compiled = compileInner(child, idx);\n if (!compiled) {\n return null;\n }\n parts.push(compiled);\n idx += compiled.params.length;\n }\n return {\n expression: parts.map((p) => `(${p.expression})`).join(\" OR \"),\n params: parts.flatMap((p) => p.params),\n };\n }\n if (\"not\" in filter) {\n const inner = compileInner(filter.not, startIndex);\n if (!inner) {\n return null;\n }\n return {\n expression: `NOT (${inner.expression})`,\n params: inner.params,\n };\n }\n return compileComparison(filter.field, filter.op, startIndex);\n}\n\n/**\n * Push a metadata filter into PostgreSQL JSONB predicates, or `null` if unsupported.\n * Parameter placeholders are `$N` starting at `startIndex` (default `1`).\n *\n * @param filter - Metadata filter AST.\n * @param startIndex - First `$N` index for bound parameters.\n */\nexport function compileMetadataFilterToPostgres(\n filter: MetadataFilter,\n startIndex = 1,\n): CompiledMetadataSql | null {\n return compileInner(filter, startIndex);\n}\n","/**\n * Postgres LISTEN/NOTIFY backend for cross-process subscribe().\n *\n * Uses a dedicated connection (not the pool). Payload is IDs + metadata only.\n */\n\nimport type { Pool, PoolClient } from \"pg\";\nimport type {\n MemoryChangeCallback,\n MemoryChangeEvent,\n SubscribeBackend,\n SubscribeFilter,\n SubscribableEvent,\n Unsubscribe,\n} from \"./types.js\";\n\n/** Postgres `LISTEN` channel name for cross-process memory change events. */\nexport const WOLBARG_NOTIFY_CHANNEL = \"wolbarg_events\";\n\ninterface Subscription {\n filter: SubscribeFilter;\n callback: MemoryChangeCallback;\n}\n\nfunction matchesFilter(\n filter: SubscribeFilter,\n event: MemoryChangeEvent,\n): boolean {\n if (filter.organization !== event.organization) {\n return false;\n }\n if (filter.agent !== undefined && filter.agent !== event.agent) {\n return false;\n }\n if (filter.event === undefined) {\n return true;\n }\n const events = Array.isArray(filter.event) ? filter.event : [filter.event];\n return events.some(\n (e: SubscribableEvent) => e === \"*\" || e === event.event,\n );\n}\n\n/**\n * Serialize a {@link MemoryChangeEvent} for `pg_notify` (≤ ~7900 bytes).\n *\n * @param event - Change event emitted after a memory write.\n */\nexport function serializeNotifyPayload(event: MemoryChangeEvent): string {\n const payload = JSON.stringify({\n event: event.event,\n organization: event.organization,\n agent: event.agent,\n memoryId: event.memoryId,\n timestamp: event.timestamp,\n traceId: event.traceId,\n sessionId: event.sessionId,\n upsertAction: event.upsertAction,\n });\n if (payload.length > 7900) {\n // Hard Postgres NOTIFY limit is 8000 bytes — drop optional fields.\n return JSON.stringify({\n event: event.event,\n organization: event.organization,\n agent: event.agent,\n memoryId: Array.isArray(event.memoryId)\n ? event.memoryId.slice(0, 20)\n : event.memoryId,\n timestamp: event.timestamp,\n });\n }\n return payload;\n}\n\n/**\n * Parse a NOTIFY payload back into a {@link MemoryChangeEvent}.\n *\n * @param raw - JSON string from `pg_notify`.\n * @returns Parsed event or `null` when invalid.\n */\nexport function parseNotifyPayload(raw: string): MemoryChangeEvent | null {\n try {\n const parsed = JSON.parse(raw) as MemoryChangeEvent;\n if (\n !parsed ||\n typeof parsed.event !== \"string\" ||\n typeof parsed.organization !== \"string\" ||\n typeof parsed.agent !== \"string\" ||\n typeof parsed.timestamp !== \"string\"\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport interface PostgresListenerOptions {\n /** Factory that returns a dedicated client (not from the write pool). */\n connect: () => Promise<PoolClient>;\n /** Optional reconnect delay in ms. Default 1000. */\n reconnectDelayMs?: number;\n onError?: (error: unknown) => void;\n}\n\n/** Cross-process {@link SubscribeBackend} using Postgres LISTEN/NOTIFY. */\nexport class PostgresSubscribeListener implements SubscribeBackend {\n private readonly subscriptions = new Map<number, Subscription>();\n private nextId = 1;\n private client: PoolClient | null = null;\n private closed = false;\n private reconnecting = false;\n private listenInFlight: Promise<void> | null = null;\n private readonly reconnectDelayMs: number;\n private readonly connect: () => Promise<PoolClient>;\n private readonly onError?: (error: unknown) => void;\n\n /**\n * @param options.connect - Factory returning a dedicated LISTEN client.\n * @param options.reconnectDelayMs - Delay before reconnect attempts (default 1000).\n * @param options.onError - Optional error hook for connection failures.\n */\n constructor(options: PostgresListenerOptions) {\n this.connect = options.connect;\n this.reconnectDelayMs = options.reconnectDelayMs ?? 1000;\n this.onError = options.onError;\n }\n\n /** Open the LISTEN connection (lazy — also started on first subscribe). */\n async start(): Promise<void> {\n if (this.closed) {\n return;\n }\n await this.ensureListening();\n }\n\n private async ensureListening(): Promise<void> {\n if (this.client || this.closed) {\n return;\n }\n if (this.listenInFlight) {\n await this.listenInFlight;\n return;\n }\n this.listenInFlight = this.openListenConnection();\n try {\n await this.listenInFlight;\n } finally {\n this.listenInFlight = null;\n }\n }\n\n private async openListenConnection(): Promise<void> {\n if (this.client || this.closed) {\n return;\n }\n const client = await this.connect();\n if (this.closed) {\n try {\n client.release(true);\n } catch {\n // ignore\n }\n return;\n }\n this.client = client;\n client.on(\"notification\", (msg) => {\n if (msg.channel !== WOLBARG_NOTIFY_CHANNEL || !msg.payload) {\n return;\n }\n const event = parseNotifyPayload(msg.payload);\n if (!event) {\n return;\n }\n this.dispatch(event);\n });\n client.on(\"error\", (error) => {\n this.onError?.(error);\n void this.handleDisconnect();\n });\n client.on(\"end\", () => {\n void this.handleDisconnect();\n });\n await client.query(`LISTEN ${WOLBARG_NOTIFY_CHANNEL}`);\n }\n\n private async handleDisconnect(): Promise<void> {\n if (this.closed || this.reconnecting) {\n return;\n }\n this.reconnecting = true;\n const prev = this.client;\n this.client = null;\n if (prev) {\n try {\n prev.release(true);\n } catch {\n // ignore\n }\n }\n try {\n await new Promise((r) => setTimeout(r, this.reconnectDelayMs));\n if (!this.closed) {\n await this.ensureListening();\n }\n } catch (error) {\n this.onError?.(error);\n this.reconnecting = false;\n if (!this.closed) {\n void this.handleDisconnect();\n }\n return;\n }\n this.reconnecting = false;\n }\n\n private dispatch(event: MemoryChangeEvent): void {\n for (const sub of this.subscriptions.values()) {\n if (!matchesFilter(sub.filter, event)) {\n continue;\n }\n try {\n sub.callback(event);\n } catch (error) {\n console.error(\n \"[wolbarg] subscribe callback error:\",\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n\n /**\n * Register a filtered callback for memory change events.\n *\n * @param filter - Organization / agent / event-type filter.\n * @param callback - Invoked synchronously on each matching NOTIFY.\n * @returns Unsubscribe function.\n */\n subscribe(\n filter: SubscribeFilter,\n callback: MemoryChangeCallback,\n ): Unsubscribe {\n if (this.closed) {\n throw new Error(\"Subscribe backend is closed\");\n }\n const id = this.nextId++;\n this.subscriptions.set(id, { filter, callback });\n void this.ensureListening();\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /** True when at least one subscribe() callback is registered. */\n hasSubscribers(): boolean {\n return this.subscriptions.size > 0;\n }\n\n /**\n * Local emit is a no-op for Postgres — writers use NOTIFY in-transaction.\n * Kept so the shared SubscribeBackend interface is uniform.\n */\n emit(_event: MemoryChangeEvent): void {\n // Cross-process delivery happens via NOTIFY from the storage layer.\n }\n\n /** Tear down LISTEN connection and clear subscriptions. */\n async close(): Promise<void> {\n this.closed = true;\n this.subscriptions.clear();\n const pending = this.listenInFlight;\n if (pending) {\n await pending.catch(() => undefined);\n }\n const client = this.client;\n this.client = null;\n if (!client) {\n return;\n }\n // Destroy the pooled LISTEN client — UNLISTEN+release can hang while the\n // connection sits in ClientRead waiting for notifications.\n try {\n client.release(true);\n } catch {\n try {\n (client as { end?: () => Promise<void> }).end?.();\n } catch {\n // ignore\n }\n }\n }\n}\n\n/** Issue NOTIFY inside an already-open transaction client. */\nexport async function notifyMemoryChange(\n client: { query: (sql: string, params?: unknown[]) => Promise<unknown> },\n event: MemoryChangeEvent,\n): Promise<void> {\n const payload = serializeNotifyPayload(event);\n await client.query(`SELECT pg_notify($1, $2)`, [\n WOLBARG_NOTIFY_CHANNEL,\n payload,\n ]);\n}\n\n/**\n * Build a {@link PostgresSubscribeListener} from an existing `pg` Pool.\n *\n * @param pool - Postgres connection pool (uses `pool.connect()` for LISTEN).\n * @param onError - Optional connection error callback.\n */\nexport function createPostgresListenerFromPool(\n pool: Pool,\n onError?: (error: unknown) => void,\n): PostgresSubscribeListener {\n return new PostgresSubscribeListener({\n connect: () => pool.connect(),\n onError,\n });\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\n * - float4[] vector bind (no text \"[f,f,…]\" parse tax)\n * - Org/agent/archived denormalized on embeddings for filtered ANN\n * - Large bulk inserts via sequential fat unnest (COPY-class amortization)\n * - JSONB metadata filter pushdown\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { DatabaseError, InitializationError, ConfigurationError } from \"../../errors/index.js\";\nimport { matchesMetadata } from \"../../filters/match.js\";\nimport { compileMetadataFilterToPostgres } from \"../../filters/sql-compile-postgres.js\";\nimport { SCHEMA_VERSION, META_KEYS } from \"../../schema/index.js\";\nimport { WolbargLogger } from \"../../telemetry/logger.js\";\nimport {\n deserializeMetadata,\n serializeMetadata,\n} from \"../../utils/index.js\";\nimport { cosineDistance } from \"../../utils/vector.js\";\nimport { hashMemoryContent } from \"../../memory/dedupe.js\";\nimport { notifyMemoryChange } from \"../../subscribe/postgres-listener.js\";\nimport type { MemoryChangeEvent } from \"../../subscribe/types.js\";\nimport type {\n HistoryRow,\n InsertMemoryInput,\n MemoryRow,\n RepositoryFilter,\n StorageProvider,\n UpdateMemoryInput,\n VectorSearchHit,\n} from \"../types.js\";\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 on?: (event: \"connect\", listener: (client: PgPoolClient) => void) => void;\n totalCount?: number;\n idleCount?: number;\n waitingCount?: number;\n};\n\nexport interface PostgresProviderOptions {\n connectionString: string;\n maxPoolSize?: number;\n /**\n * When false, uses `synchronous_commit=off` on every pool connection.\n * Much higher write throughput; recent commits can be lost on OS crash.\n * Default true (full durability).\n */\n durableWrites?: boolean;\n}\n\nconst warnLogger = new WolbargLogger(\"warn\");\n\n/** True for Postgres deadlock / serialization failures that are safe to retry. */\nfunction isRetriablePgTxError(error: unknown): boolean {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as { code?: unknown }).code ?? \"\")\n : \"\";\n if (code === \"40P01\" || code === \"40001\") {\n return true;\n }\n const msg = error instanceof Error ? error.message : String(error);\n return /deadlock detected|could not serialize access/i.test(msg);\n}\n\nfunction pgTxBackoffMs(attempt: number): number {\n const base = 25 * 2 ** attempt;\n const jitter = Math.random() * 25;\n return Math.min(1000, base + jitter);\n}\nlet warnedPgvectorFallback = false;\nlet warnedFtsKeywordSearch = false;\nlet warnedHnswSoftFail = false;\n\n/** Statement names for per-connection prepared-statement cache. */\nconst STMT = {\n insertOne: \"Wolbarg_insert_one_v5\",\n insertBatch: \"Wolbarg_insert_batch_v6\",\n} as const;\n\n/**\n * Bind embedding as float4[] for `$n::float4[]::vector` (single-row path).\n * Avoids multi-KB text literals and Postgres vector text parse.\n */\nfunction toFloat4Param(embedding: Float32Array): number[] {\n const out = new Array<number>(embedding.length);\n for (let i = 0; i < embedding.length; i += 1) {\n out[i] = embedding[i]!;\n }\n return out;\n}\n\n/**\n * pgvector text literal for batch unnest.\n * node-pg cannot reliably bind float4[][] (collapses to float4[] → cast errors).\n */\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\n/** Append/override a libpq query param (e.g. options=-c synchronous_commit=off). */\nfunction appendConnectionOption(\n connectionString: string,\n key: string,\n value: string,\n): string {\n try {\n const url = new URL(connectionString);\n if (key === \"options\") {\n const existing = url.searchParams.get(\"options\");\n url.searchParams.set(\n \"options\",\n existing ? `${existing} ${value}`.trim() : value,\n );\n } else {\n url.searchParams.set(key, value);\n }\n return url.toString();\n } catch {\n const sep = connectionString.includes(\"?\") ? \"&\" : \"?\";\n return `${connectionString}${sep}${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n }\n}\n\n/** Session GUCs that must be set before the pool hands out a client. */\nfunction withPoolStartupOptions(\n connectionString: string,\n durableWrites: boolean,\n): string {\n const flags = [\n \"-c jit=off\",\n // Bake HNSW search GUCs into the connection — avoids per-recall set_config.\n \"-c hnsw.ef_search=40\",\n \"-c hnsw.iterative_scan=relaxed_order\",\n // Bound waits so lock storms cannot hang agents indefinitely.\n \"-c statement_timeout=30000\",\n \"-c lock_timeout=10000\",\n \"-c idle_in_transaction_session_timeout=60000\",\n ];\n if (!durableWrites) {\n flags.unshift(\"-c synchronous_commit=off\");\n }\n return appendConnectionOption(connectionString, \"options\", flags.join(\" \"));\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, content_hash, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$9,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, content_hash, 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 gen_random_uuid()::text, 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, organization, agent, archived)\n SELECT id, $8::float4[]::vector, $2, $3, false FROM mem\n )\n SELECT * FROM mem`;\n\n/** Batch: RETURNING id only — caller rebuilds MemoryRow from inputs. */\nconst INSERT_BATCH_SQL = `WITH mem AS (\n INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n )\n SELECT id, org, agent, txt, meta::jsonb, false, NULL, h, c, u\n FROM unnest(\n $1::text[], $2::text[], $3::text[], $4::text[],\n $5::text[], $6::timestamptz[], $7::timestamptz[], $8::text[]\n ) AS t(id, org, agent, txt, meta, c, u, h)\n RETURNING id\n ),\n hist AS (\n INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n SELECT gen_random_uuid()::text, id, 'created', NULL, c\n FROM unnest($1::text[], $6::timestamptz[]) AS t(id, 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, organization, agent, archived)\n SELECT id, emb::vector, org, agent, false\n FROM unnest($1::text[], $9::text[], $2::text[], $3::text[]) AS t(id, emb, org, agent)\n )\n SELECT id FROM mem`;\n\n/** Cap per flush so multiple batches pipeline across the pool. */\nconst COALESCE_FLUSH_MAX = 128;\nconst COALESCE_FLUSH_THRESHOLD = 48;\nconst COALESCE_MAX_PARALLEL = 24;\nconst BULK_CHUNK_NO_HNSW = 500;\nconst BULK_CHUNK_WITH_HNSW = 250;\nconst COPY_BATCH_THRESHOLD = 48;\n\n/** PostgreSQL + pgvector {@link StorageProvider} (`pg` optional peer). */\nexport class PostgresStorageProvider implements StorageProvider {\n readonly name = \"postgres\";\n\n private readonly connectionString: string;\n private readonly maxPoolSize: number;\n private readonly durableWrites: boolean;\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 /** Dedup concurrent CREATE INDEX so mixed read/write storms don't pile up. */\n private hnswBuildInFlight: Promise<void> | null = null;\n private hasContentTsv = 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 insertFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private insertFlushInFlight = 0;\n /** Per-provider TX context — never share across PostgresStorageProvider instances. */\n private readonly txStore = new AsyncLocalStorage<PgPoolClient>();\n\n /**\n * @param options - Connection string, pool size, and durability flags.\n */\n constructor(options: PostgresProviderOptions) {\n this.maxPoolSize = options.maxPoolSize ?? 64;\n this.durableWrites = options.durableWrites !== false;\n // Bake GUCs into the URL — never SET on 'connect' (races with pool checkout).\n this.connectionString = withPoolStartupOptions(\n options.connectionString,\n this.durableWrites,\n );\n }\n\n /** Current pg pool occupancy stats (for diagnostics / subscribe setup). */\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 /** Dedicated pool accessor for LISTEN/NOTIFY subscribe backend. */\n getPool(): PgPool | null {\n return this.pool;\n }\n\n /** Open the connection pool and run migrations. */\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 connectionTimeoutMillis: 10_000,\n allowExitOnIdle: true,\n keepAlive: true,\n });\n // Do NOT query on 'connect' — node-pg may check the client out concurrently\n // (overlapping query warning + multi-second stalls under concurrency).\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 const schemaKey = `${this.connectionString}::${dims}`;\n if (!PostgresStorageProvider.vectorSchemaReady.has(schemaKey)) {\n await this.ensureVectorTables(dims);\n PostgresStorageProvider.vectorSchemaReady.add(schemaKey);\n } else {\n this.hasPgvector = true;\n // HNSW may have been dropped by a prior bulk load — check cheaply.\n const idx = await this.query(\n `SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embeddings_hnsw' LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n this.hnswIndexEnsured = idx.rows.length > 0;\n }\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 /** Drain coalesced inserts and end the connection pool. */\n async close(): Promise<void> {\n if (this.insertFlushTimer) {\n clearTimeout(this.insertFlushTimer);\n this.insertFlushTimer = null;\n }\n // Drain coalesced inserts before tearing down the pool.\n const deadline = Date.now() + 5_000;\n while (\n (this.insertQueue.length > 0 || this.insertFlushInFlight > 0) &&\n Date.now() < deadline\n ) {\n if (this.insertQueue.length > 0) {\n await this.flushInsertQueue();\n } else {\n await new Promise<void>((r) => setTimeout(r, 5));\n }\n }\n if (!this.pool) {\n return;\n }\n await this.pool.end();\n this.pool = null;\n }\n\n /**\n * Run a search query. HNSW GUCs are baked into pool startup options —\n * no per-recall connect()+set_config round-trip.\n */\n private async withSearchSession<T>(\n fn: (client: PgQueryable) => Promise<T>,\n ): Promise<T> {\n return fn(this.requirePool());\n }\n\n /**\n * Drop HNSW so bulk / concurrent inserts avoid graph maintenance.\n * Next recall rebuilds the index (lazy).\n */\n async dropVectorIndex(): Promise<void> {\n await this.query(`DROP INDEX IF EXISTS idx_memory_embeddings_hnsw`).catch(\n () => undefined,\n );\n this.hnswIndexEnsured = false;\n }\n\n /** Force HNSW build now (e.g. before timed recall benches). */\n async ensureVectorIndex(): Promise<void> {\n await this.ensureHnswIndex();\n }\n\n /**\n * Create pgvector tables and HNSW index for the given dimensionality.\n *\n * @param dimensions - Embedding length from the configured model.\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 // Denormalize tenant filters onto embeddings so ANN can pre-filter.\n await this.query(\n `ALTER TABLE memory_embeddings ADD COLUMN IF NOT EXISTS organization TEXT`,\n ).catch(() => undefined);\n await this.query(\n `ALTER TABLE memory_embeddings ADD COLUMN IF NOT EXISTS agent TEXT`,\n ).catch(() => undefined);\n await this.query(\n `ALTER TABLE memory_embeddings ADD COLUMN IF NOT EXISTS archived BOOLEAN NOT NULL DEFAULT false`,\n ).catch(() => undefined);\n // One-shot denormalization — skip when columns are already populated.\n const needsBackfill = await this.query(\n `SELECT 1 FROM memory_embeddings WHERE organization IS NULL LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n if (needsBackfill.rows.length > 0) {\n await this.query(`\n UPDATE memory_embeddings e\n SET organization = m.organization,\n agent = m.agent,\n archived = m.archived\n FROM memories m\n WHERE m.id = e.memory_id\n AND e.organization IS NULL\n `).catch(() => undefined);\n }\n await this.query(\n `CREATE INDEX IF NOT EXISTS idx_memory_embeddings_org_active\n ON memory_embeddings (organization)\n WHERE archived = false`,\n ).catch(() => undefined);\n // Do not create HNSW here — defer until first search so bulk inserts stay fast.\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 /** Cross-process subscribe: NOTIFY after a committed write. */\n /**\n * Issue `pg_notify` for cross-process {@link subscribe} delivery.\n *\n * @param event - Memory change payload (IDs + metadata only).\n */\n async notifyChange(event: MemoryChangeEvent): Promise<void> {\n await notifyMemoryChange(this.requirePool(), event);\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 /** Delete all rows for an organization (dev / test helper). */\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 /** Truncate all Wolbarg tables (dev / test helper). */\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 if (this.hnswBuildInFlight) {\n await this.hnswBuildInFlight;\n return;\n }\n this.hnswBuildInFlight = this.buildHnswIndex();\n try {\n await this.hnswBuildInFlight;\n } finally {\n this.hnswBuildInFlight = null;\n }\n }\n\n private async buildHnswIndex(): Promise<void> {\n if (this.hnswIndexEnsured) {\n return;\n }\n try {\n // CONCURRENTLY avoids blocking writers during mixed read/write storms.\n // IF NOT EXISTS is safe when another backend already finished the build.\n await this.query(`\n CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_memory_embeddings_hnsw\n ON memory_embeddings USING hnsw (embedding vector_cosine_ops)\n WITH (m = 16, ef_construction = 32)\n `);\n this.hnswIndexEnsured = true;\n this.hnswCreateFailures = 0;\n } catch (error) {\n // Another session may have created it; treat as success when present.\n const idx = await this.query(\n `SELECT 1 FROM pg_indexes WHERE indexname = 'idx_memory_embeddings_hnsw' LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n if (idx.rows.length > 0) {\n this.hnswIndexEnsured = true;\n this.hnswCreateFailures = 0;\n return;\n }\n this.hnswCreateFailures += 1;\n if (this.hnswCreateFailures === 1 && !warnedHnswSoftFail) {\n warnedHnswSoftFail = true;\n warnLogger.warn(\n \"HNSW index creation failed; ANN will fall back to sequential scan.\",\n );\n }\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 // Soft-fail: ANN can still run as a sequential scan this round.\n }\n }\n\n /** @inheritdoc StorageProvider.getEmbeddingDimensions */\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 /** @inheritdoc StorageProvider.setEmbeddingDimensions */\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 /** Insert a single memory row (coalesced under concurrent writers). */\n async insertMemory(input: InsertMemoryInput): Promise<MemoryRow> {\n this.requireVectorReady();\n\n // Inside an ambient transaction (e.g. compress), never join the coalesce\n // queue — that would commit on a different connection and break atomicity.\n if (this.txStore.getStore()) {\n return this.insertMemoryImmediate(input);\n }\n\n // Coalesce briefly so concurrent remember() calls share one unnest.\n // Do NOT hold a global inFlight mutex — that serializes Postgres like SQLite.\n return new Promise<MemoryRow>((resolve, reject) => {\n this.insertQueue.push({ input, resolve, reject });\n if (this.insertQueue.length >= COALESCE_FLUSH_THRESHOLD) {\n this.clearInsertFlushTimer();\n void this.flushInsertQueue();\n return;\n }\n this.scheduleInsertFlush();\n });\n }\n\n private clearInsertFlushTimer(): void {\n if (this.insertFlushTimer) {\n clearImmediate(this.insertFlushTimer as unknown as NodeJS.Immediate);\n clearTimeout(this.insertFlushTimer);\n this.insertFlushTimer = null;\n }\n this.insertFlushScheduled = false;\n }\n\n /** Flush coalesced inserts after a turn so concurrent remember() can join. */\n private scheduleInsertFlush(): void {\n if (this.insertFlushScheduled) {\n return;\n }\n this.insertFlushScheduled = true;\n // setImmediate > queueMicrotask: concurrent awaiters after embed can join.\n this.insertFlushTimer = setImmediate(() => {\n this.insertFlushTimer = null;\n this.insertFlushScheduled = false;\n void this.flushInsertQueue();\n }) as unknown as ReturnType<typeof setTimeout>;\n }\n\n private async flushInsertQueue(): Promise<void> {\n if (this.insertFlushInFlight >= COALESCE_MAX_PARALLEL) {\n this.scheduleInsertFlush();\n return;\n }\n // Cap flush size so remaining queue can pipeline on other pool connections.\n const batch = this.insertQueue.splice(0, COALESCE_FLUSH_MAX);\n this.clearInsertFlushTimer();\n if (batch.length === 0) {\n return;\n }\n this.insertFlushInFlight += 1;\n // Kick another flush immediately if more work remains (parallel drains).\n if (\n this.insertQueue.length > 0 &&\n this.insertFlushInFlight < COALESCE_MAX_PARALLEL\n ) {\n void this.flushInsertQueue();\n }\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 -= 1;\n if (this.insertQueue.length > 0) {\n void this.flushInsertQueue();\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 contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\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 toFloat4Param(input.embedding),\n contentHash,\n ]);\n return this.mapRow(inserted.rows[0]!);\n }\n return this.insertOneBlob(input);\n }\n\n /** Batch insert via unnest / COPY paths with optional HNSW deferral. */\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 contentHashes = new Array<string | null>(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 contentHashes[i] =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n vectors[i] = toVectorLiteral(input.embedding);\n }\n\n await this.queryNamed(STMT.insertBatch, INSERT_BATCH_SQL, [\n ids,\n orgs,\n agents,\n texts,\n metas,\n created,\n updated,\n contentHashes,\n vectors,\n ]);\n\n // RETURNING id only — rebuild rows from inputs (avoids shipping JSONB back).\n return inputs.map((_, i) => ({\n id: ids[i]!,\n organization: orgs[i]!,\n agent: agents[i]!,\n content_text: texts[i]!,\n metadata_json: metas[i]!,\n archived: 0,\n compressed_into: null,\n content_hash: contentHashes[i] ?? null,\n created_at: created[i]!,\n updated_at: updated[i]!,\n }));\n }\n\n /** Parallel unnest when HNSW is absent; sequential when index must stay consistent. */\n private async insertBatchChunked(\n inputs: InsertMemoryInput[],\n ): Promise<MemoryRow[]> {\n const chunkSize = this.hnswIndexEnsured\n ? BULK_CHUNK_WITH_HNSW\n : BULK_CHUNK_NO_HNSW;\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 // No HNSW → pipeline chunks across the pool. With HNSW → sequential (lock-friendly).\n if (!this.hnswIndexEnsured) {\n const parts = 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 parts) {\n for (let j = 0; j < part.length; j += 1) {\n out[offset + j] = part[j]!;\n }\n offset += part.length;\n }\n return out;\n }\n const out: MemoryRow[] = new Array(inputs.length);\n let offset = 0;\n for (const chunk of chunks) {\n const part = await this.insertBatchPgvector(chunk);\n for (let j = 0; j < part.length; j += 1) {\n out[offset + j] = part[j]!;\n }\n offset += part.length;\n }\n return out;\n }\n\n private async insertOneBlob(input: InsertMemoryInput): Promise<MemoryRow> {\n return this.withTransaction(async () => {\n const buf = Buffer.from(\n input.embedding.buffer,\n input.embedding.byteOffset,\n input.embedding.byteLength,\n );\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : hashMemoryContent(input.contentText);\n const inserted = await this.query(\n `INSERT INTO memories (\n id, organization, agent, content_text, metadata_json,\n archived, compressed_into, content_hash, created_at, updated_at\n ) VALUES ($1,$2,$3,$4,$5::jsonb,false,NULL,$8,$6,$7)\n RETURNING id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, content_hash, 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 contentHash,\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\n /** Update memory content, metadata, embedding, and content hash. */\n async updateMemory(input: UpdateMemoryInput): Promise<MemoryRow | null> {\n return this.withTransaction(async () => {\n const locked = await this.query(\n `SELECT id, organization, agent, content_text, metadata_json,\n archived::int AS archived, compressed_into, content_hash, created_at, updated_at\n FROM memories\n WHERE id = $1 AND organization = $2\n FOR UPDATE`,\n [input.id, input.organization],\n );\n if (locked.rows.length === 0) {\n return null;\n }\n const existing = this.mapRow(locked.rows[0]!);\n const contentHash =\n input.contentHash !== undefined\n ? input.contentHash\n : input.contentText !== undefined\n ? hashMemoryContent(input.contentText)\n : (existing.content_hash ?? null);\n await this.query(\n `UPDATE memories SET\n content_text = COALESCE($1, content_text),\n metadata_json = COALESCE($2::jsonb, metadata_json),\n content_hash = COALESCE($3, content_hash),\n updated_at = $4\n WHERE id = $5 AND organization = $6`,\n [\n input.contentText ?? null,\n input.metadata !== undefined ? serializeMetadata(input.metadata) : null,\n contentHash,\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 await this.query(\n `INSERT INTO memory_history (id, memory_id, event_type, related_memory_id, created_at)\n VALUES ($1,$2,'updated',NULL,$3)`,\n [crypto.randomUUID(), input.id, input.updatedAt],\n );\n return this.getMemoryById(input.id, input.organization);\n });\n }\n\n /** Find an active memory by org, agent, and content hash (dedupe). */\n async findActiveByContentHash(\n organization: string,\n agent: string,\n contentHash: string,\n ): 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, content_hash, created_at, updated_at\n FROM memories\n WHERE organization = $1 AND agent = $2 AND content_hash = $3 AND archived = false\n LIMIT 1`,\n [organization, agent, contentHash],\n );\n const row = result.rows[0];\n return row ? this.mapRow(row) : null;\n }\n\n /** Fetch a memory row by UUID within an organization. */\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, content_hash, 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 /** Fetch a memory row by internal rowid within an organization. */\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 /** Batch-fetch memory rows by rowids within an organization. */\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 /** List memories matching repository filters with optional limit. */\n async listMemories(filter: RepositoryFilter, limit?: number): Promise<MemoryRow[]> {\n const want =\n limit !== undefined ? limit : filter.metadata ? 10_000 : undefined;\n const compiled = filter.metadata\n ? compileMetadataFilterToPostgres(filter.metadata, 2)\n : null;\n\n if (compiled) {\n const clauses = [`organization = $1`, `(${compiled.expression})`];\n const params: unknown[] = [filter.organization, ...compiled.params];\n let idx = params.length + 1;\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 (want !== undefined) {\n sql += ` LIMIT $${idx}`;\n params.push(want);\n }\n const result = await this.query(sql, params);\n return result.rows.map((r) => this.mapRow(r));\n }\n\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 /** Scan memories matching metadata filters. */\n async searchByMetadata(\n filter: RepositoryFilter,\n limit?: number,\n ): Promise<MemoryRow[]> {\n return this.listMemories(filter, limit);\n }\n\n /** Full-text keyword search via `tsvector` / GIN index. */\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 (error) {\n if (!warnedFtsKeywordSearch) {\n warnedFtsKeywordSearch = true;\n warnLogger.warn(\n \"FTS keyword search failed; returning empty keyword hits.\",\n {\n cause: error instanceof Error ? error.message : String(error),\n },\n );\n }\n return [];\n }\n }\n\n /** pgvector cosine ANN search (HNSW when index is present). */\n async searchVectors(\n embedding: Float32Array,\n topK: number,\n ): Promise<VectorSearchHit[]> {\n this.requireVectorReady();\n if (this.hasPgvector) {\n await this.ensureHnswIndex();\n return this.withSearchSession(async (client) => {\n const result = await client.query(\n `SELECT r.row_num AS memory_rowid, ann.distance\n FROM (\n SELECT e.memory_id, (e.embedding <=> $1::float4[]::vector) AS distance\n FROM memory_embeddings e\n WHERE e.archived = false\n ORDER BY e.embedding <=> $1::float4[]::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 [toFloat4Param(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\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 /** ANN search joined with memory rows and org/archived post-filters. */\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 // Scope to organization before scoring — shared DBs accumulate many orgs\n // across a suite; global topK + post-filter underfills tenant recalls.\n const clauses = [`m.organization = $1`];\n const params: unknown[] = [organization];\n if (options?.agent) {\n clauses.push(`m.agent = $2`);\n params.push(options.agent);\n }\n if (!options?.includeArchived) {\n clauses.push(`m.archived = false`);\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 r.row_num AS rowid, e.embedding\n FROM memory_embeddings_blob e\n JOIN memory_row_map r ON r.memory_id = e.memory_id\n JOIN memories m ON m.id = e.memory_id\n WHERE ${clauses.join(\" AND \")}`,\n params,\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 row: this.mapRow(row),\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 await this.ensureHnswIndex();\n const vec = toFloat4Param(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 // Org-scoped exact KNN — avoids filtered-HNSW iterative_scan tax when the\n // shared DB holds many tenants (common in long-lived Postgres). For typical\n // agent memory corpora (<~50k/org) this is faster and more predictable.\n const agentClause = options?.agent ? \"AND e.agent = $4\" : \"\";\n const archivedClause = options?.includeArchived\n ? \"\"\n : \"AND e.archived = false\";\n const params = options?.agent\n ? [vec, topK, organization, options.agent]\n : [vec, topK, organization];\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 r.row_num AS rowid,\n (e.embedding <=> $1::float4[]::vector) AS distance\n FROM memory_embeddings e\n JOIN memory_row_map r ON r.memory_id = e.memory_id\n JOIN memories m ON m.id = e.memory_id\n WHERE e.organization = $3\n ${agentClause}\n ${archivedClause}\n AND m.organization = $3\n ORDER BY e.embedding <=> $1::float4[]::vector\n LIMIT $2`,\n params,\n );\n return mapHits(result.rows);\n }\n\n /** Soft-archive memories (compression / forget paths). */\n async archiveMemories(\n ids: string[],\n organization: string,\n compressedIntoId: string,\n archivedAt: string,\n ): Promise<string[]> {\n return this.withTransaction(async () => {\n if (ids.length === 0) {\n return [];\n }\n // Deterministic lock order prevents multi-row deadlocks across compressors.\n const orderedIds = [...new Set(ids)].sort();\n await this.query(\n `SELECT id FROM memories\n WHERE organization = $1 AND archived = false AND id = ANY($2::text[])\n ORDER BY id\n FOR UPDATE`,\n [organization, orderedIds],\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, orderedIds],\n );\n const archived = result.rows.map((r) => String(r.id));\n if (archived.length === 0) {\n return [];\n }\n if (this.hasPgvector) {\n await this.query(\n `UPDATE memory_embeddings\n SET archived = true\n WHERE memory_id = ANY($1::text[])`,\n [archived],\n );\n } else {\n // Blob ANN has no archived flag — drop embeddings so exact scan skips them.\n await this.query(\n `DELETE FROM memory_embeddings_blob WHERE memory_id = ANY($1::text[])`,\n [archived],\n );\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\n /** Hard-delete a single memory by id; returns whether a row was removed. */\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 /** Hard-delete memories matching org / agent / metadata filters. */\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 /** Remove all memories for an organization. */\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 /** List audit history events for a memory id. */\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 /** Append a history row (created / archived / compressed / updated). */\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 /** Aggregate memory counts for an organization. */\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 /** Approximate on-disk database size in bytes (`pg_database_size`). */\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 = this.txStore.getStore();\n if (existing) {\n return fn();\n }\n\n const maxAttempts = 5;\n let lastError: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n const client = await this.requirePool().connect();\n try {\n await client.query(\"BEGIN\");\n const result = await this.txStore.run(client, fn);\n await client.query(\"COMMIT\");\n return result;\n } catch (error) {\n await client.query(\"ROLLBACK\").catch(() => undefined);\n lastError = error;\n if (isRetriablePgTxError(error) && attempt < maxAttempts - 1) {\n await new Promise((r) => setTimeout(r, pgTxBackoffMs(attempt)));\n continue;\n }\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 throw new DatabaseError(\n `Transaction failed after retries: ${this.describe(lastError)}`,\n { cause: lastError instanceof Error ? lastError : undefined },\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\n const versionRow = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.schemaVersion],\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n const current =\n versionRow.rows[0]?.value !== undefined\n ? Number(versionRow.rows[0].value)\n : null;\n\n if (current !== null && current > SCHEMA_VERSION) {\n throw new InitializationError(\n `Database schema version ${current} is newer than this Wolbarg SDK (${SCHEMA_VERSION}). Please upgrade Wolbarg to open this database.`,\n );\n }\n\n // Fast path: schema already current — skip DDL churn and hash backfill.\n if (current === SCHEMA_VERSION) {\n const tsvProbe = await this.query(\n `SELECT 1 FROM information_schema.columns\n WHERE table_name = 'memories' AND column_name = 'content_tsv'\n LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n this.hasContentTsv = tsvProbe.rows.length > 0;\n return;\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', 'updated')),\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 // Drop redundant archived btree — partial active indexes cover the hot path.\n await this.query(\n `DROP INDEX IF EXISTS idx_memories_org_archived`,\n ).catch(() => undefined);\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 // Schema v3: content_hash + unique active index + history updated event\n await this.query(\n `ALTER TABLE memories ADD COLUMN IF NOT EXISTS content_hash TEXT`,\n ).catch(() => undefined);\n await this.query(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_memories_org_agent_hash_active\n ON memories(organization, agent, content_hash)\n WHERE archived = false AND content_hash IS NOT NULL`,\n ).catch(() => undefined);\n await this.query(`\n CREATE TABLE IF NOT EXISTS embedding_cache (\n cache_key TEXT PRIMARY KEY NOT NULL,\n model TEXT NOT NULL,\n vector BYTEA NOT NULL,\n created_at TIMESTAMPTZ NOT NULL,\n last_used_at TIMESTAMPTZ NOT NULL\n )\n `).catch(() => undefined);\n\n // Widen history CHECK to allow 'updated' (drop + recreate constraint if present)\n await this.query(`\n DO $$\n BEGIN\n ALTER TABLE memory_history DROP CONSTRAINT IF EXISTS memory_history_event_type_check;\n ALTER TABLE memory_history ADD CONSTRAINT memory_history_event_type_check\n CHECK (event_type IN ('created', 'archived', 'compressed', 'updated'));\n EXCEPTION WHEN others THEN\n NULL;\n END $$;\n `).catch(() => undefined);\n\n // Backfill content_hash ONLY when upgrading from a pre-v3 schema.\n // Running this on every open() was the dominant cold-start cost (~100ms+).\n const priorVersion = await this.query(\n `SELECT value FROM Wolbarg_meta WHERE key = $1`,\n [META_KEYS.schemaVersion],\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n const prior =\n priorVersion.rows[0]?.value !== undefined\n ? Number(priorVersion.rows[0].value)\n : null;\n const needsHashBackfill = prior === null || !Number.isFinite(prior) || prior < 3;\n\n if (needsHashBackfill) {\n const active = await this.query(\n `SELECT id, organization, agent, content_text, updated_at\n FROM memories WHERE archived = false AND content_hash IS NULL\n ORDER BY updated_at DESC`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n const seen = new Set<string>();\n for (const row of active.rows) {\n const hash = hashMemoryContent(String(row.content_text));\n const key = `${row.organization}\\0${row.agent}\\0${hash}`;\n if (seen.has(key)) {\n await this.query(\n `UPDATE memories SET content_hash = NULL WHERE id = $1`,\n [row.id],\n ).catch(() => undefined);\n } else {\n seen.add(key);\n await this.query(\n `UPDATE memories SET content_hash = $1 WHERE id = $2`,\n [hash, row.id],\n ).catch(() => undefined);\n }\n }\n }\n\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.schemaVersion, String(SCHEMA_VERSION)],\n ).catch(() => undefined);\n\n // Stored tsvector column — keyword/hybrid avoid re-computing to_tsvector.\n // Probe first: ALTER on every open is expensive when the column exists.\n const tsvProbe = await this.query(\n `SELECT 1 FROM information_schema.columns\n WHERE table_name = 'memories' AND column_name = 'content_tsv'\n LIMIT 1`,\n ).catch(() => ({ rows: [] as Record<string, unknown>[] }));\n if (tsvProbe.rows.length > 0) {\n this.hasContentTsv = true;\n } else {\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 }\n\n private async tryEnablePgvector(): Promise<boolean> {\n const cached = PostgresStorageProvider.pgvectorByConn.get(\n this.connectionString,\n );\n if (cached !== undefined) {\n return cached;\n }\n try {\n await this.query(`CREATE EXTENSION IF NOT EXISTS vector`);\n PostgresStorageProvider.pgvectorByConn.set(this.connectionString, true);\n return true;\n } catch (error) {\n PostgresStorageProvider.pgvectorByConn.set(this.connectionString, false);\n if (!warnedPgvectorFallback) {\n warnedPgvectorFallback = true;\n warnLogger.warn(\n \"pgvector extension is unavailable; using blob cosine search fallback.\",\n {\n cause:\n error instanceof Error ? error.message : `unknown error: ${String(error)}`,\n },\n );\n }\n return false;\n }\n }\n\n private static pgvectorByConn = new Map<string, boolean>();\n private static vectorSchemaReady = new Set<string>();\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 meta AS (\n SELECT organization, agent, archived FROM memories WHERE id = $1\n )\n INSERT INTO memory_embeddings (memory_id, embedding, organization, agent, archived)\n SELECT $1, $2::float4[]::vector, meta.organization, meta.agent, meta.archived\n FROM meta\n ON CONFLICT (memory_id) DO UPDATE SET\n embedding = EXCLUDED.embedding,\n organization = EXCLUDED.organization,\n agent = EXCLUDED.agent,\n archived = EXCLUDED.archived`,\n [memoryId, toFloat4Param(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 = this.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 = this.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 content_hash:\n row.content_hash === null || row.content_hash === undefined\n ? null\n : String(row.content_hash),\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 * Creates SQLite or PostgreSQL {@link StorageProvider} instances from config.\n * Prefer {@link createStorageProvider} over the deprecated {@link createDatabaseProvider}.\n *\n * @example\n * ```ts\n * import { createStorageProvider } from \"wolbarg/storage\";\n *\n * const storage = createStorageProvider({\n * provider: \"sqlite\",\n * url: \"./memory.db\",\n * });\n * await storage.open();\n * ```\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\n/**\n * Create a storage provider from SQLite or PostgreSQL configuration.\n *\n * @param config - Storage or database config with `provider` and connection URL.\n * @param options - Optional SQLite concurrency tuning.\n * @param options.concurrency - Lock retry / timeout settings for SQLite writes.\n * @returns An unopened {@link StorageProvider} — call `open()` before use.\n * @throws {@link ConfigurationError} when URL or provider is invalid.\n *\n * @example\n * ```ts\n * const storage = createStorageProvider(\n * { provider: \"postgres\", url: process.env.DATABASE_URL! },\n * { concurrency: { maxRetries: 5 } },\n * );\n * ```\n */\nexport function createStorageProvider(\n config: StorageConfig | DatabaseConfig,\n options?: { concurrency?: import(\"../types/index.js\").ConcurrencyConfig },\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 concurrency: options?.concurrency,\n });\n }\n\n if (config.provider === \"postgres\") {\n return new PostgresStorageProvider({\n connectionString,\n maxPoolSize: config.maxPoolSize,\n durableWrites: config.durableWrites,\n });\n }\n\n throw new ConfigurationError(\n `Unsupported storage provider: ${String((config as { provider: string }).provider)}`,\n );\n}\n\n/**\n * @deprecated Prefer {@link createStorageProvider}.\n * @param config - Legacy database configuration object.\n * @returns A {@link StorageProvider} instance.\n */\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","/** Published SDK semver — keep in sync with `package.json` `version`. */\nexport const SDK_VERSION = \"0.5.6\";\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\";\nimport { SDK_VERSION } from \"../version.js\";\n\nlet warnedMissingExportManifest = false;\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 /** Embedding provider model captured at export time. */\n embeddingModel?: string;\n /** Expected embedding vector dimensionality captured at export time. */\n embeddingDimensions?: number;\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\n/**\n * Portable memory database import / export contract.\n *\n * Implement for S3, tarball, or remote backup targets. Built-in:\n * {@link SqliteMemoryTransferProvider} (file copy + manifest).\n */\nexport interface MemoryTransferProvider {\n exportTo(\n path: string,\n sourcePath: string,\n organization?: string,\n embeddingModel?: string,\n embeddingDimensions?: number,\n ): Promise<MemoryExportResult>;\n importFrom(\n path: string,\n targetPath: string,\n expected?: {\n organization?: string;\n embeddingModel?: string;\n embeddingDimensions?: number;\n },\n ): Promise<MemoryImportResult>;\n}\n\n/** SQLite file copy + JSON manifest export/import implementation. */\nexport class SqliteMemoryTransferProvider implements MemoryTransferProvider {\n async exportTo(\n exportPath: string,\n sourcePath: string,\n organization?: string,\n embeddingModel?: string,\n embeddingDimensions?: number,\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 ...(embeddingModel ? { embeddingModel } : {}),\n ...(embeddingDimensions ? { embeddingDimensions } : {}),\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 expected?: {\n organization?: string;\n embeddingModel?: string;\n embeddingDimensions?: number;\n },\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 | undefined;\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 if (!warnedMissingExportManifest) {\n warnedMissingExportManifest = true;\n console.warn(\n \"[wolbarg:warn] export manifest is missing; skipping manifest-based import validation.\",\n );\n }\n }\n\n if (manifest) {\n if (\n expected?.organization &&\n manifest.organization &&\n expected.organization !== manifest.organization\n ) {\n throw new ValidationError(\n \"Import failed: export organization does not match the current Wolbarg organization.\",\n );\n }\n if (\n expected?.embeddingDimensions != null &&\n manifest.embeddingDimensions != null &&\n expected.embeddingDimensions !== manifest.embeddingDimensions\n ) {\n throw new ValidationError(\n `Import failed: embedding dimension mismatch (expected ${expected.embeddingDimensions}, got ${manifest.embeddingDimensions}).`,\n );\n }\n if (\n expected?.embeddingModel &&\n manifest.embeddingModel &&\n expected.embeddingModel !== manifest.embeddingModel\n ) {\n throw new ValidationError(\n `Import failed: embedding model mismatch (expected ${expected.embeddingModel}, got ${manifest.embeddingModel}).`,\n );\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 const tmpTarget = `${resolvedTarget}.tmp-import-${Date.now()}`;\n\n // Import into a temporary path first, then do an atomic swap. This keeps\n // the original database intact if the copy fails mid-way.\n for (const suffix of [\"\", \"-wal\", \"-shm\"]) {\n const side = `${tmpTarget}${suffix}`;\n if (fs.existsSync(side)) {\n fs.rmSync(side, { force: true });\n }\n }\n\n await copySqlite(dbExportPath, tmpTarget);\n\n // Swap temp -> target (main file + WAL/SHM siblings).\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\n fs.renameSync(tmpTarget, resolvedTarget);\n for (const suffix of [\"-wal\", \"-shm\"]) {\n const from = `${tmpTarget}${suffix}`;\n const to = `${resolvedTarget}${suffix}`;\n if (fs.existsSync(from)) {\n fs.renameSync(from, to);\n }\n }\n\n return { path: resolvedTarget, manifest: manifest ?? undefined };\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 * Conversation → memory helpers for {@link Wolbarg.rememberFromMessages}.\n * Experimental until 1.0 — keep extraction thin; apps own richer pipelines.\n */\n\nimport type { ChatMessage } from \"../llm/index.js\";\nimport type {\n ConversationMessage,\n MemoryDedupeConfig,\n MemoryMetadata,\n RememberFromMessagesOptions,\n RememberFromMessagesRawStrategy,\n} from \"../types/index.js\";\nimport { ValidationError } from \"../errors/index.js\";\n\nconst DEFAULT_RAW_STRATEGY: RememberFromMessagesRawStrategy = \"last_user\";\n\n/** Normalize and validate incoming chat messages. */\nexport function normalizeConversationMessages(\n messages: ConversationMessage[],\n): ConversationMessage[] {\n if (!Array.isArray(messages)) {\n throw new ValidationError(\"messages must be an array\");\n }\n if (messages.length === 0) {\n throw new ValidationError(\"messages must be a non-empty array\");\n }\n\n return messages.map((message, index) => {\n if (!message || typeof message !== \"object\") {\n throw new ValidationError(`messages[${index}] must be an object`);\n }\n if (typeof message.role !== \"string\" || message.role.trim().length === 0) {\n throw new ValidationError(`messages[${index}].role must be a non-empty string`);\n }\n if (typeof message.content !== \"string\") {\n throw new ValidationError(`messages[${index}].content must be a string`);\n }\n return {\n role: message.role.trim(),\n content: message.content.trim(),\n };\n });\n}\n\n/**\n * Resolve and validate options for {@link Wolbarg.rememberFromMessages}.\n *\n * @param options - Agent, mode, rawStrategy, metadata, dedupe overrides.\n */\nexport function resolveRememberFromMessagesOptions(\n options: RememberFromMessagesOptions,\n): {\n agent: string;\n mode: \"raw\" | \"extract\";\n rawStrategy: RememberFromMessagesRawStrategy;\n metadata?: MemoryMetadata;\n dedupe?: boolean | MemoryDedupeConfig;\n} {\n if (!options || typeof options !== \"object\") {\n throw new ValidationError(\"options is required\");\n }\n if (typeof options.agent !== \"string\" || options.agent.trim().length === 0) {\n throw new ValidationError(\"agent must be a non-empty string\");\n }\n\n const mode = options.mode ?? \"raw\";\n if (mode !== \"raw\" && mode !== \"extract\") {\n throw new ValidationError('mode must be \"raw\" or \"extract\"');\n }\n\n const rawStrategy = options.rawStrategy ?? DEFAULT_RAW_STRATEGY;\n if (rawStrategy !== \"last_user\" && rawStrategy !== \"all_user\") {\n throw new ValidationError('rawStrategy must be \"last_user\" or \"all_user\"');\n }\n\n return {\n agent: options.agent.trim(),\n mode,\n rawStrategy,\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n ...(options.dedupe !== undefined ? { dedupe: options.dedupe } : {}),\n };\n}\n\n/** Select user texts to store in `mode: \"raw\"`. */\nexport function selectRawUserTexts(\n messages: ConversationMessage[],\n strategy: RememberFromMessagesRawStrategy,\n): string[] {\n const userTexts = messages\n .filter((m) => m.role === \"user\" && m.content.length > 0)\n .map((m) => m.content);\n\n if (userTexts.length === 0) {\n throw new ValidationError(\n 'no user messages with non-empty content — nothing to remember in mode \"raw\"',\n );\n }\n\n if (strategy === \"last_user\") {\n return [userTexts[userTexts.length - 1]!];\n }\n return userTexts;\n}\n\n/** Build the fixed experimental extract prompt. */\nexport function buildExtractMessages(\n messages: ConversationMessage[],\n): ChatMessage[] {\n const transcript = messages\n .map((m) => `${m.role}: ${m.content}`)\n .join(\"\\n\");\n\n return [\n {\n role: \"system\",\n content:\n \"Extract durable factual memories from the conversation. \" +\n \"Return only atomic facts, one per line. \" +\n \"No numbering, bullets, or commentary. \" +\n \"If there are no facts worth storing, reply with exactly NONE.\",\n },\n {\n role: \"user\",\n content: transcript,\n },\n ];\n}\n\n/** Parse LLM extract output into fact strings. */\nexport function parseExtractedFacts(llmOutput: string): string[] {\n const trimmed = llmOutput.trim();\n if (trimmed.length === 0 || /^none$/i.test(trimmed)) {\n return [];\n }\n\n const facts: string[] = [];\n for (const line of trimmed.split(/\\r?\\n/)) {\n let fact = line.trim();\n if (fact.length === 0) continue;\n fact = fact.replace(/^[-*•]\\s+/, \"\");\n fact = fact.replace(/^\\d+[.)]\\s+/, \"\");\n if (fact.length === 0 || /^none$/i.test(fact)) continue;\n facts.push(fact);\n }\n return facts;\n}\n","/**\n * Memory domain helpers — map storage rows to public API types.\n *\n * Used internally by the Wolbarg facade and exportable for custom tooling.\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\n/**\n * Convert a storage {@link MemoryRow} to a public {@link MemoryRecord}.\n *\n * @param row - Raw database row.\n * @returns Parsed memory with Date objects and deserialized metadata.\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\n/**\n * Convert a storage row plus similarity score to a {@link RecallResult}.\n *\n * @param row - Raw database row.\n * @param similarity - Cosine similarity in `[0, 1]` (higher is better).\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\n/**\n * Convert a history table row to a public {@link HistoryEvent}.\n *\n * @param row - Raw history row from storage.\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\nexport {\n normalizeConversationMessages,\n resolveRememberFromMessagesOptions,\n selectRawUserTexts,\n buildExtractMessages,\n parseExtractedFacts,\n} from \"./from-messages.js\";\n","/**\n * Retrieval pipeline — score fusion, MMR diversification, and adaptive over-fetch.\n *\n * Internal helpers used by `recall()` to combine semantic and keyword signals,\n * diversify results, and size candidate pools before reranking.\n */\n\nimport type { HybridConfig, MmrConfig, RecallResult } from \"../types/index.js\";\n\n/** Candidate with separate semantic, keyword, and fused scores during recall. */\nexport interface ScoredCandidate {\n /** Memory UUID. */\n id: string;\n /** Normalized semantic similarity score. */\n semanticScore: number;\n /** Normalized keyword / BM25 score. */\n keywordScore: number;\n /** Weighted combination of semantic and keyword scores. */\n fusedScore: number;\n /** Full recall result for downstream ranking. */\n result: RecallResult;\n}\n\n/**\n * Fuse semantic and keyword score maps using configured weights.\n *\n * Scores are max-normalized per channel before weighting so scales are comparable.\n *\n * @param semantic - Memory id → raw semantic score.\n * @param keyword - Memory id → raw keyword score.\n * @param weights - Hybrid weights (must sum conceptually to 1.0 in typical configs).\n * @returns Memory id → fused score.\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\n/**\n * Resolve hybrid recall config to concrete weights, or `null` when hybrid is off.\n *\n * @param hybrid - `true` (defaults), `false`, or partial {@link HybridConfig}.\n * @returns Resolved weights or `null` when hybrid search is disabled.\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\n/**\n * Resolve MMR lambda from config, or `null` when MMR is off.\n *\n * @param mmr - `true` (lambda 0.5), `false`, or {@link MmrConfig}.\n * @returns Lambda in `[0, 1]` or `null` when diversification is disabled.\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 (MMR) diversification of recall candidates.\n *\n * Balances relevance (`similarity`) against redundancy using character Jaccard\n * as a cheap token-overlap proxy for embedding similarity.\n *\n * @param candidates - Scored recall results (pre-sorted by relevance).\n * @param topK - Number of diverse results to select.\n * @param lambda - Trade-off: `1` = pure relevance, `0` = pure diversity.\n * @returns Reordered subset of at most `topK` candidates.\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 const best = remaining[bestIdx]!;\n if (\n score > bestScore ||\n (score === bestScore && candidate.id < best.id)\n ) {\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\n/** Token-set Jaccard similarity between two strings (case-insensitive). */\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\n/**\n * Compute how many vector candidates to fetch before filtering / reranking.\n *\n * Uses a higher over-fetch factor when metadata filters are active because\n * post-filtering shrinks the candidate pool.\n *\n * @param topK - Final number of results requested by the caller.\n * @param overFetchFactor - Base multiplier from retrieval config.\n * @param hasFilters - Whether metadata or agent filters will post-filter hits.\n * @returns Candidate pool size capped at 1000.\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 * Shared Memory / Entity serialization helpers for graph backends.\n */\n\nimport type { MemoryRecord } from \"../types/index.js\";\n\n/** Minimal stub when only an id is known. */\nexport function stubMemoryRecord(id: string): MemoryRecord {\n return {\n id,\n organization: \"\",\n agent: \"\",\n content: { text: \"\" },\n metadata: {},\n archived: false,\n compressedInto: null,\n createdAt: new Date(0),\n updatedAt: new Date(0),\n };\n}\n\n/** Serialize graph node metadata to a JSON string (`{}` when undefined). */\nexport function serializeMetadata(meta: Record<string, unknown> | undefined): string {\n return JSON.stringify(meta ?? {});\n}\n\n/**\n * Deserialize graph node metadata from storage (object, JSON string, or empty).\n *\n * @param raw - Value from SQLite / Neo4j column.\n * @returns Plain metadata object; invalid input becomes `{}`.\n */\nexport function deserializeMetadata(raw: unknown): Record<string, unknown> {\n if (raw == null || raw === \"\") return {};\n if (typeof raw === \"object\" && !Array.isArray(raw)) {\n return raw as Record<string, unknown>;\n }\n if (typeof raw !== \"string\") return {};\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n /* ignore */\n }\n return {};\n}\n\n/**\n * Map a storage or Cypher row into a {@link MemoryRecord}.\n *\n * @param row - Snake_case or camelCase column names from graph backends.\n */\nexport function rowToMemoryRecord(row: Record<string, unknown>): MemoryRecord {\n const id = String(row.id ?? row.n_id ?? \"\");\n const createdAt = parseDate(row.created_at ?? row.createdAt);\n const updatedAt = parseDate(row.updated_at ?? row.updatedAt);\n return {\n id,\n organization: String(row.organization ?? \"\"),\n agent: String(row.agent ?? \"\"),\n content: { text: String(row.content_text ?? row.contentText ?? \"\") },\n metadata: deserializeMetadata(row.metadata_json ?? row.metadata),\n archived: Boolean(row.archived),\n compressedInto:\n row.compressed_into == null || row.compressed_into === \"\"\n ? null\n : String(row.compressed_into),\n createdAt,\n updatedAt,\n };\n}\n\nfunction parseDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === \"string\" || typeof value === \"number\") {\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return d;\n }\n return new Date(0);\n}\n\n/**\n * Stable entity id from name+type (portable across backends).\n *\n * @param name - Human-readable entity label.\n * @param type - Entity classification (e.g. `\"person\"`, `\"project\"`).\n * @returns Deterministic id prefixed with `ent_`.\n */\nexport function entityIdFrom(name: string, type: string): string {\n const key = `${type.trim().toLowerCase()}::${name.trim().toLowerCase()}`;\n // Simple deterministic hash → hex (no crypto dependency required).\n let h = 2166136261;\n for (let i = 0; i < key.length; i += 1) {\n h ^= key.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n const a = (h >>> 0).toString(16).padStart(8, \"0\");\n let h2 = 5381;\n for (let i = 0; i < key.length; i += 1) {\n h2 = (h2 * 33) ^ key.charCodeAt(i);\n }\n const b = (h2 >>> 0).toString(16).padStart(8, \"0\");\n return `ent_${a}${b}`;\n}\n","/**\n * Cascade delete helpers for the SQLite graph schema.\n *\n * Removes a memory graph node (and all incident edges) when the matching\n * memory is hard-deleted via forget/clear. Edge FK CASCADE covers edges when\n * the node row is deleted; we still delete edges explicitly first so partial\n * failures never leave dangling REFERENCES if FKs are off.\n */\n\nimport type { DatabaseSync } from \"node:sqlite\";\n\n/** Relation used for entity → memory links (never walked by getRelated). */\nexport const ENTITY_MENTIONS_RELATION = \"MENTIONS\";\n\n/**\n * Delete the memory graph node for `memoryId` and all edges that reference it.\n *\n * @param db - Open SQLite graph database handle.\n * @param memoryId - Wolbarg memory UUID (`graph_nodes.ref_id` for type `memory`).\n */\nexport function cascadeDeleteMemoryNode(\n db: DatabaseSync,\n memoryId: string,\n): void {\n const node = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'memory' AND ref_id = ?`,\n )\n .get(memoryId) as { id: string } | undefined;\n if (!node) return;\n\n db.prepare(\n `DELETE FROM graph_edges WHERE from_node_id = ? OR to_node_id = ?`,\n ).run(node.id, node.id);\n db.prepare(`DELETE FROM graph_nodes WHERE id = ?`).run(node.id);\n}\n","/**\n * Embedded SQLite graph provider (file-backed, local/dev).\n *\n * Implements the five typed {@link GraphProvider} methods with plain SQL and\n * recursive CTEs — no Cypher. Schema is created on open (plain CREATE TABLE IF\n * NOT EXISTS; no graph-engine DDL / schema-creation-on-first-write complexity).\n *\n * Uses the same `node:sqlite` + {@link withImmediateTransaction} patterns as\n * {@link SqliteStorageProvider}. Graph data lives in a separate SQLite file from\n * the memory store by default.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nimport { ConfigurationError, DatabaseError } from \"../../errors/index.js\";\nimport {\n CREATE_GRAPH_EDGES_TABLE,\n CREATE_GRAPH_INDEXES,\n CREATE_GRAPH_NODES_TABLE,\n} from \"../../schema/index.js\";\nimport {\n resolveConcurrencyConfig,\n type ConcurrencyConfig,\n type ResolvedConcurrencyConfig,\n} from \"../../storage/sqlite/concurrency-config.js\";\nimport { withImmediateTransaction } from \"../../storage/sqlite/transaction.js\";\nimport type { MemoryRecord } from \"../../types/index.js\";\nimport {\n entityIdFrom,\n serializeMetadata,\n stubMemoryRecord,\n} from \"../memory-node.js\";\nimport {\n cascadeDeleteMemoryNode,\n ENTITY_MENTIONS_RELATION,\n} from \"../sync/cascade.js\";\nimport type {\n GetRelatedOptions,\n GraphEntityInput,\n GraphHealthResult,\n GraphProvider,\n} from \"../types.js\";\n\n/** Default traversal depth when `options.depth` is omitted (matches Neo4j). */\nexport const DEFAULT_GET_RELATED_DEPTH = 1;\nconst MAX_GET_RELATED_DEPTH = 16;\n\nexport interface SqliteGraphProviderOptions {\n /** Path to the graph SQLite file (separate from the memory store by default). */\n path: string;\n /** Optional write-concurrency tuning (same shape as memory SQLite). */\n concurrency?: ConcurrencyConfig;\n}\n\n/**\n * File-backed {@link GraphProvider} using recursive SQL CTEs over `graph_nodes` / `graph_edges`.\n */\nexport class SqliteGraphProvider implements GraphProvider {\n readonly name = \"sqlite\";\n private readonly dbPath: string;\n private readonly concurrency: ResolvedConcurrencyConfig;\n private db: DatabaseSync | null = null;\n private opened = false;\n\n /**\n * @param options - Graph SQLite path and optional concurrency tuning.\n */\n constructor(options: SqliteGraphProviderOptions) {\n if (!options?.path || typeof options.path !== \"string\" || !options.path.trim()) {\n throw new ConfigurationError(\"sqlite graph requires a non-empty path\");\n }\n this.dbPath = path.resolve(options.path.trim());\n this.concurrency = resolveConcurrencyConfig(options.concurrency);\n }\n\n /** Whether this provider supports file snapshots for checkpoint / export. */\n supportsFileSnapshot(): boolean {\n return this.dbPath !== \":memory:\";\n }\n\n /** Absolute graph database path, or `null` for `:memory:`. */\n getDataPath(): string | null {\n return this.dbPath === \":memory:\" ? null : this.dbPath;\n }\n\n /** Open the graph SQLite file, apply pragmas, and create schema if needed. */\n async open(): Promise<void> {\n if (this.opened) return;\n\n try {\n if (this.dbPath !== \":memory:\") {\n fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });\n }\n\n const db = new DatabaseSync(this.dbPath);\n db.exec(\"PRAGMA journal_mode = WAL;\");\n db.exec(`\n PRAGMA synchronous = NORMAL;\n PRAGMA foreign_keys = ON;\n PRAGMA busy_timeout = ${this.concurrency.lockTimeoutMs};\n PRAGMA temp_store = MEMORY;\n PRAGMA cache_size = -8192;\n PRAGMA wal_autocheckpoint = 1000;\n `);\n\n db.exec(CREATE_GRAPH_NODES_TABLE);\n db.exec(CREATE_GRAPH_EDGES_TABLE);\n for (const indexSql of CREATE_GRAPH_INDEXES) {\n db.exec(indexSql);\n }\n\n this.db = db;\n this.opened = true;\n } catch (error) {\n try {\n this.db?.close();\n } catch {\n /* ignore */\n }\n this.db = null;\n this.opened = false;\n throw new DatabaseError(\n `Failed to open SQLite graph database: ${describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n }\n\n /** Close the graph database connection. */\n async close(): Promise<void> {\n if (!this.db) {\n this.opened = false;\n return;\n }\n try {\n try {\n this.db.exec(\"PRAGMA optimize;\");\n } catch {\n /* best-effort */\n }\n this.db.close();\n } catch (error) {\n throw new DatabaseError(\n `Failed to close SQLite graph database: ${describe(error)}`,\n { cause: error instanceof Error ? error : undefined },\n );\n } finally {\n this.db = null;\n this.opened = false;\n }\n }\n\n /**\n * Create or replace a directed memory↔memory edge.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - Edge label (e.g. `\"related_to\"`, `\"caused_by\"`).\n * @param metadata - Optional JSON metadata stored on the edge.\n */\n async linkMemories(\n fromId: string,\n toId: string,\n relation: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n const fromNode = this.ensureMemoryNodeSync(db, fromId);\n const toNode = this.ensureMemoryNodeSync(db, toId);\n db.prepare(\n `DELETE FROM graph_edges\n WHERE from_node_id = ? AND to_node_id = ? AND relation = ?`,\n ).run(fromNode, toNode, relation);\n db.prepare(\n `INSERT INTO graph_edges (id, from_node_id, to_node_id, relation, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n crypto.randomUUID(),\n fromNode,\n toNode,\n relation,\n serializeMetadata(metadata),\n nowIso(),\n );\n });\n }\n\n /**\n * Remove edges between two memories.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - When set, only delete edges with this relation label.\n */\n async unlinkMemories(\n fromId: string,\n toId: string,\n relation?: string,\n ): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n const fromNode = this.findMemoryNodeId(db, fromId);\n const toNode = this.findMemoryNodeId(db, toId);\n if (!fromNode || !toNode) return;\n if (relation !== undefined) {\n db.prepare(\n `DELETE FROM graph_edges\n WHERE from_node_id = ? AND to_node_id = ? AND relation = ?`,\n ).run(fromNode, toNode, relation);\n return;\n }\n db.prepare(\n `DELETE FROM graph_edges WHERE from_node_id = ? AND to_node_id = ?`,\n ).run(fromNode, toNode);\n });\n }\n\n /**\n * Bounded recursive CTE over `graph_edges`.\n *\n * Default depth: {@link DEFAULT_GET_RELATED_DEPTH} (1). Cap: 16.\n * Only memory↔memory edges are walked (entity MENTIONS edges are excluded).\n * Cycle-safe via path membership (`instr`) so A→B→C→A terminates.\n *\n * Returns stub {@link MemoryRecord}s (id + empty fields). The facade\n * re-hydrates full rows via `toMemoryRecord` from storage when possible.\n */\n async getRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const db = this.requireDb();\n const depth = Math.max(\n 1,\n Math.min(options?.depth ?? DEFAULT_GET_RELATED_DEPTH, MAX_GET_RELATED_DEPTH),\n );\n const direction = options?.direction ?? \"both\";\n const relation = options?.relation ?? null;\n\n const start = this.findMemoryNodeId(db, memoryId);\n if (!start) return [];\n\n const sql = buildGetRelatedSql(direction);\n // Bind: start id (anchor), start id (path seed), max depth, relation×2 (nullable filter).\n const rows = db\n .prepare(sql)\n .all(start, start, depth, relation, relation) as Array<{\n ref_id: string;\n }>;\n\n const seen = new Set<string>();\n const out: MemoryRecord[] = [];\n for (const row of rows) {\n if (row.ref_id === memoryId || seen.has(row.ref_id)) continue;\n seen.add(row.ref_id);\n out.push(stubMemoryRecord(row.ref_id));\n }\n return out;\n }\n\n /**\n * Insert or update a named entity node.\n *\n * @param entity - Entity name, type, and optional metadata.\n * @returns Stable entity id ({@link entityIdFrom}).\n */\n async upsertEntity(entity: GraphEntityInput): Promise<string> {\n const id = entityIdFrom(entity.name, entity.type);\n const db = this.requireDb();\n const meta = serializeMetadata({\n ...(entity.metadata ?? {}),\n entityType: entity.type,\n });\n await this.withTx(() => {\n const existing = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'entity' AND ref_id = ?`,\n )\n .get(id) as { id: string } | undefined;\n if (existing) {\n db.prepare(\n `UPDATE graph_nodes SET name = ?, metadata = ? WHERE id = ?`,\n ).run(entity.name, meta, existing.id);\n } else {\n db.prepare(\n `INSERT INTO graph_nodes (id, type, ref_id, name, metadata, created_at)\n VALUES (?, 'entity', ?, ?, ?, ?)`,\n ).run(id, id, entity.name, meta, nowIso());\n }\n });\n return id;\n }\n\n /**\n * Link an entity to a memory via a `MENTIONS` edge (not traversed by {@link getRelated}).\n *\n * @param entityId - Entity id from {@link upsertEntity}.\n * @param memoryId - Target memory UUID.\n * @param role - Optional role string stored on the edge metadata.\n */\n async linkEntityToMemory(\n entityId: string,\n memoryId: string,\n role?: string,\n ): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n const entity = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'entity' AND ref_id = ?`,\n )\n .get(entityId) as { id: string } | undefined;\n if (!entity) {\n throw new DatabaseError(`Entity not found: ${entityId}`, {\n operation: \"linkEntityToMemory\",\n });\n }\n const memoryNode = this.ensureMemoryNodeSync(db, memoryId);\n db.prepare(\n `DELETE FROM graph_edges\n WHERE from_node_id = ? AND to_node_id = ? AND relation = ?`,\n ).run(entity.id, memoryNode, ENTITY_MENTIONS_RELATION);\n db.prepare(\n `INSERT INTO graph_edges (id, from_node_id, to_node_id, relation, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n crypto.randomUUID(),\n entity.id,\n memoryNode,\n ENTITY_MENTIONS_RELATION,\n serializeMetadata({ role: role ?? \"\" }),\n nowIso(),\n );\n });\n }\n\n /**\n * Remove the memory node and incident edges when a memory is hard-deleted.\n *\n * @param memoryId - Wolbarg memory UUID.\n */\n async deleteMemory(memoryId: string): Promise<void> {\n const db = this.requireDb();\n await this.withTx(() => {\n cascadeDeleteMemoryNode(db, memoryId);\n });\n }\n\n /**\n * Raw Cypher escape hatch — **not supported** on the SQLite graph provider.\n * Use the typed methods, or open the underlying SQLite file yourself for raw SQL.\n */\n async query(_cypher: string, _params?: Record<string, unknown>): Promise<unknown> {\n throw new DatabaseError(\n \"raw Cypher queries are not supported by the SQLite graph provider — use the typed methods, or query the underlying SQLite tables directly via your own connection if you need raw access\",\n {\n operation: \"query\",\n suggestion:\n \"Use linkMemories / getRelated / upsertEntity / linkEntityToMemory, or open the graph .db file with node:sqlite for ad-hoc SQL\",\n },\n );\n }\n\n /** Lightweight connectivity and schema statistics check. */\n async health(): Promise<GraphHealthResult> {\n try {\n if (!this.opened || !this.db) {\n return { ok: false, backend: \"sqlite\", details: { reason: \"not open\" } };\n }\n const nodeCount = Number(\n (this.db.prepare(`SELECT COUNT(*) AS c FROM graph_nodes`).get() as { c: number | bigint })\n .c,\n );\n const edgeCount = Number(\n (this.db.prepare(`SELECT COUNT(*) AS c FROM graph_edges`).get() as { c: number | bigint })\n .c,\n );\n return {\n ok: true,\n backend: \"sqlite\",\n details: {\n path: this.dbPath,\n embedded: true,\n nodeCount,\n edgeCount,\n exists: this.dbPath === \":memory:\" || fs.existsSync(this.dbPath),\n },\n };\n } catch (error) {\n return {\n ok: false,\n backend: \"sqlite\",\n details: {\n path: this.dbPath,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n private async withTx<T>(fn: () => T): Promise<T> {\n const db = this.requireDb();\n return withImmediateTransaction(db, this.concurrency, fn);\n }\n\n private requireDb(): DatabaseSync {\n if (!this.db || !this.opened) {\n throw new DatabaseError(\"SQLite graph is not open\", {\n operation: \"graph\",\n suggestion: \"Call ready() / open() before graph operations\",\n });\n }\n return this.db;\n }\n\n private findMemoryNodeId(db: DatabaseSync, memoryId: string): string | null {\n const row = db\n .prepare(\n `SELECT id FROM graph_nodes WHERE type = 'memory' AND ref_id = ?`,\n )\n .get(memoryId) as { id: string } | undefined;\n return row?.id ?? null;\n }\n\n private ensureMemoryNodeSync(db: DatabaseSync, memoryId: string): string {\n const existing = this.findMemoryNodeId(db, memoryId);\n if (existing) return existing;\n db.prepare(\n `INSERT INTO graph_nodes (id, type, ref_id, name, metadata, created_at)\n VALUES (?, 'memory', ?, NULL, '{}', ?)`,\n ).run(memoryId, memoryId, nowIso());\n return memoryId;\n }\n}\n\n/**\n * Build a recursive CTE for getRelated.\n * Bind order: startId, startId, maxDepth, relation, relation.\n * Path membership (`instr`) terminates cycles.\n */\nfunction buildGetRelatedSql(direction: \"in\" | \"out\" | \"both\"): string {\n const mentions = ENTITY_MENTIONS_RELATION;\n\n if (direction === \"out\") {\n return `\n WITH RECURSIVE walk(node_id, depth, path) AS (\n SELECT ? AS node_id, 0, '/' || ? || '/'\n UNION ALL\n SELECT e.to_node_id, w.depth + 1, w.path || e.to_node_id || '/'\n FROM walk w\n JOIN graph_edges e ON e.from_node_id = w.node_id\n JOIN graph_nodes dest ON dest.id = e.to_node_id AND dest.type = 'memory'\n WHERE w.depth < ?\n AND instr(w.path, '/' || e.to_node_id || '/') = 0\n AND (? IS NULL OR e.relation = ?)\n AND e.relation != '${mentions}'\n )\n SELECT DISTINCT n.ref_id AS ref_id\n FROM walk w\n JOIN graph_nodes n ON n.id = w.node_id\n WHERE w.depth > 0 AND n.type = 'memory'\n `;\n }\n\n if (direction === \"in\") {\n return `\n WITH RECURSIVE walk(node_id, depth, path) AS (\n SELECT ? AS node_id, 0, '/' || ? || '/'\n UNION ALL\n SELECT e.from_node_id, w.depth + 1, w.path || e.from_node_id || '/'\n FROM walk w\n JOIN graph_edges e ON e.to_node_id = w.node_id\n JOIN graph_nodes src ON src.id = e.from_node_id AND src.type = 'memory'\n WHERE w.depth < ?\n AND instr(w.path, '/' || e.from_node_id || '/') = 0\n AND (? IS NULL OR e.relation = ?)\n AND e.relation != '${mentions}'\n )\n SELECT DISTINCT n.ref_id AS ref_id\n FROM walk w\n JOIN graph_nodes n ON n.id = w.node_id\n WHERE w.depth > 0 AND n.type = 'memory'\n `;\n }\n\n return `\n WITH RECURSIVE walk(node_id, depth, path) AS (\n SELECT ? AS node_id, 0, '/' || ? || '/'\n UNION ALL\n SELECT neighbor.id, w.depth + 1, w.path || neighbor.id || '/'\n FROM walk w\n JOIN graph_edges e\n ON e.from_node_id = w.node_id OR e.to_node_id = w.node_id\n JOIN graph_nodes neighbor\n ON neighbor.id = CASE\n WHEN e.from_node_id = w.node_id THEN e.to_node_id\n ELSE e.from_node_id\n END\n AND neighbor.type = 'memory'\n WHERE w.depth < ?\n AND instr(w.path, '/' || neighbor.id || '/') = 0\n AND (? IS NULL OR e.relation = ?)\n AND e.relation != '${mentions}'\n )\n SELECT DISTINCT n.ref_id AS ref_id\n FROM walk w\n JOIN graph_nodes n ON n.id = w.node_id\n WHERE w.depth > 0 AND n.type = 'memory'\n `;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Neo4j graph provider (networked, production).\n *\n * Uses neo4j-driver session.run with parameterized Cypher for typed methods —\n * NOT GraphProvider.query(). Schema-flexible: nodes/relationships are created\n * freely without DDL.\n *\n * Install as optional peer: `npm install neo4j-driver`.\n */\n\nimport { ConfigurationError, DatabaseError } from \"../../errors/index.js\";\nimport type { MemoryRecord } from \"../../types/index.js\";\nimport {\n entityIdFrom,\n rowToMemoryRecord,\n serializeMetadata,\n} from \"../memory-node.js\";\nimport type {\n GetRelatedOptions,\n GraphEntityInput,\n GraphHealthResult,\n GraphProvider,\n} from \"../types.js\";\n\ntype Neo4jRecord = {\n get: (key: string) => unknown;\n keys: string[];\n toObject: () => Record<string, unknown>;\n};\n\ntype Neo4jResult = {\n records: Neo4jRecord[];\n};\n\ntype Neo4jSession = {\n run: (\n cypher: string,\n params?: Record<string, unknown>,\n ) => Promise<Neo4jResult>;\n close: () => Promise<void>;\n};\n\ntype Neo4jDriver = {\n session: (options?: { database?: string }) => Neo4jSession;\n verifyConnectivity: () => Promise<void>;\n close: () => Promise<void>;\n getServerInfo?: () => Promise<unknown>;\n};\n\ntype Neo4jModule = {\n driver: (\n url: string,\n auth: { username: string; password: string } | unknown,\n options?: Record<string, unknown>,\n ) => Neo4jDriver;\n auth: {\n basic: (username: string, password: string) => unknown;\n };\n};\n\nexport interface Neo4jGraphProviderOptions {\n /** Bolt / Neo4j URI (e.g. `neo4j://localhost:7687`). */\n url: string;\n /** Neo4j username. */\n username: string;\n /** Neo4j password. */\n password: string;\n /** Optional multi-database name (Neo4j 4+). */\n database?: string;\n}\n\n/**\n * Networked {@link GraphProvider} backed by Neo4j (`neo4j-driver` optional peer).\n */\nexport class Neo4jGraphProvider implements GraphProvider {\n readonly name = \"neo4j\";\n private readonly url: string;\n private readonly username: string;\n private readonly password: string;\n private readonly database: string | undefined;\n private driver: Neo4jDriver | null = null;\n private opened = false;\n\n /**\n * @param options - Bolt URL, credentials, and optional database name.\n */\n constructor(options: Neo4jGraphProviderOptions) {\n if (!options?.url?.trim()) {\n throw new ConfigurationError(\"neo4j graph requires a non-empty url\");\n }\n if (!options?.username?.trim()) {\n throw new ConfigurationError(\"neo4j graph requires a non-empty username\");\n }\n if (typeof options.password !== \"string\") {\n throw new ConfigurationError(\"neo4j graph requires a password string\");\n }\n this.url = options.url.trim();\n this.username = options.username.trim();\n this.password = options.password;\n this.database = options.database?.trim() || undefined;\n }\n\n /** Neo4j does not support local file snapshots for checkpoint pairing. */\n supportsFileSnapshot(): boolean {\n return false;\n }\n\n /** Always `null` — graph data lives in the remote Neo4j cluster. */\n getDataPath(): string | null {\n return null;\n }\n\n /** Connect to Neo4j, verify connectivity, and ensure uniqueness constraints. */\n async open(): Promise<void> {\n if (this.opened) return;\n\n let mod: Neo4jModule;\n try {\n mod = (await import(\"neo4j-driver\")) as unknown as Neo4jModule;\n } catch {\n throw new ConfigurationError(\n 'Neo4j graph requires the optional \"neo4j-driver\" package. Install it with: npm install neo4j-driver',\n );\n }\n\n this.driver = mod.driver(\n this.url,\n mod.auth.basic(this.username, this.password),\n );\n await this.driver.verifyConnectivity();\n this.opened = true;\n // Ensure uniqueness constraints (best-effort; Neo4j is schema-flexible).\n await this.withSession(async (session) => {\n try {\n await session.run(\n `CREATE CONSTRAINT memory_id IF NOT EXISTS FOR (m:Memory) REQUIRE m.id IS UNIQUE`,\n );\n } catch {\n /* older Neo4j / community editions may lack IF NOT EXISTS */\n }\n try {\n await session.run(\n `CREATE CONSTRAINT entity_id IF NOT EXISTS FOR (e:Entity) REQUIRE e.id IS UNIQUE`,\n );\n } catch {\n /* ignore */\n }\n });\n }\n\n /** Close the neo4j-driver connection. */\n async close(): Promise<void> {\n if (this.driver) {\n await this.driver.close();\n }\n this.driver = null;\n this.opened = false;\n }\n\n private requireDriver(): Neo4jDriver {\n if (!this.driver || !this.opened) {\n throw new DatabaseError(\"Neo4j graph is not open\", {\n operation: \"graph\",\n suggestion: \"Call ready() / open() before graph operations\",\n });\n }\n return this.driver;\n }\n\n private async withSession<T>(fn: (session: Neo4jSession) => Promise<T>): Promise<T> {\n const driver = this.requireDriver();\n const session = this.database\n ? driver.session({ database: this.database })\n : driver.session();\n try {\n return await fn(session);\n } finally {\n await session.close();\n }\n }\n\n private async run(\n cypher: string,\n params: Record<string, unknown> = {},\n ): Promise<Record<string, unknown>[]> {\n return this.withSession((session) =>\n this.runOnSession(session, cypher, params),\n );\n }\n\n private async runOnSession(\n session: Neo4jSession,\n cypher: string,\n params: Record<string, unknown> = {},\n ): Promise<Record<string, unknown>[]> {\n const result = await session.run(cypher, params);\n return result.records.map((rec) => {\n try {\n return rec.toObject();\n } catch {\n const obj: Record<string, unknown> = {};\n for (const key of rec.keys) {\n obj[key] = unwrapNeo4jValue(rec.get(key));\n }\n return obj;\n }\n });\n }\n\n private async ensureMemoryNode(\n id: string,\n session?: Neo4jSession,\n ): Promise<void> {\n const cypher = `MERGE (m:Memory { id: $id })\n ON CREATE SET\n m.organization = '',\n m.agent = '',\n m.content_text = '',\n m.metadata_json = '{}',\n m.archived = false,\n m.compressed_into = '',\n m.created_at = '',\n m.updated_at = ''`;\n\n if (session) {\n await this.runOnSession(session, cypher, { id });\n return;\n }\n await this.run(cypher, { id });\n }\n\n /**\n * MERGE a directed `RELATED` relationship between two memory nodes.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - Relationship label stored on `RELATED.relation`.\n * @param metadata - Optional JSON metadata on the relationship.\n */\n async linkMemories(\n fromId: string,\n toId: string,\n relation: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n // Single session for the whole typed write (avoid 3 separate sessions).\n await this.withSession(async (session) => {\n await this.ensureMemoryNode(fromId, session);\n await this.ensureMemoryNode(toId, session);\n await this.runOnSession(\n session,\n `MATCH (a:Memory { id: $fromId }), (b:Memory { id: $toId })\n MERGE (a)-[r:RELATED { relation: $relation }]->(b)\n SET r.metadata_json = $metadata`,\n {\n fromId,\n toId,\n relation,\n metadata: serializeMetadata(metadata),\n },\n );\n });\n }\n\n /**\n * Delete `RELATED` relationship(s) between two memories.\n *\n * @param fromId - Source memory UUID.\n * @param toId - Target memory UUID.\n * @param relation - When set, only delete edges with this relation property.\n */\n async unlinkMemories(\n fromId: string,\n toId: string,\n relation?: string,\n ): Promise<void> {\n if (relation !== undefined) {\n await this.run(\n `MATCH (a:Memory { id: $fromId })-[r:RELATED { relation: $relation }]->(b:Memory { id: $toId })\n DELETE r`,\n { fromId, toId, relation },\n );\n return;\n }\n await this.run(\n `MATCH (a:Memory { id: $fromId })-[r:RELATED]->(b:Memory { id: $toId })\n DELETE r`,\n { fromId, toId },\n );\n }\n\n /**\n * Native Neo4j variable-length path traversal.\n * Relationship filter uses RELATED.relation property for parity with Kuzu.\n */\n async getRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const depth = Math.max(1, Math.min(options?.depth ?? 1, 16));\n const direction = options?.direction ?? \"both\";\n const relation = options?.relation;\n\n // Build direction-specific pattern. Depth is inlined (integer) — Neo4j\n // does not allow parameters inside [*1..n] in all versions.\n const pathPattern =\n direction === \"out\"\n ? `(start)-[:RELATED*1..${depth}]->(n:Memory)`\n : direction === \"in\"\n ? `(start)<-[:RELATED*1..${depth}]-(n:Memory)`\n : `(start)-[:RELATED*1..${depth}]-(n:Memory)`;\n\n const cypher = relation\n ? `MATCH (start:Memory { id: $id }), p = ${pathPattern}\n WHERE ALL(r IN relationships(p) WHERE r.relation = $relation)\n AND n.id <> $id\n RETURN DISTINCT\n n.id AS id, n.organization AS organization, n.agent AS agent,\n n.content_text AS content_text, n.metadata_json AS metadata_json,\n n.archived AS archived, n.compressed_into AS compressed_into,\n n.created_at AS created_at, n.updated_at AS updated_at`\n : `MATCH (start:Memory { id: $id }), p = ${pathPattern}\n WHERE n.id <> $id\n RETURN DISTINCT\n n.id AS id, n.organization AS organization, n.agent AS agent,\n n.content_text AS content_text, n.metadata_json AS metadata_json,\n n.archived AS archived, n.compressed_into AS compressed_into,\n n.created_at AS created_at, n.updated_at AS updated_at`;\n\n const params: Record<string, unknown> = { id: memoryId };\n if (relation !== undefined) params.relation = relation;\n\n const rows = await this.run(cypher, params);\n return rows.map((row) =>\n rowToMemoryRecord(unwrapRow(row)),\n );\n }\n\n /**\n * MERGE an `Entity` node keyed by deterministic id.\n *\n * @param entity - Entity name, type, and optional metadata.\n * @returns Stable entity id ({@link entityIdFrom}).\n */\n async upsertEntity(entity: GraphEntityInput): Promise<string> {\n const id = entityIdFrom(entity.name, entity.type);\n await this.run(\n `MERGE (e:Entity { id: $id })\n SET e.name = $name, e.type = $type, e.metadata_json = $metadata`,\n {\n id,\n name: entity.name,\n type: entity.type,\n metadata: serializeMetadata(entity.metadata),\n },\n );\n return id;\n }\n\n /**\n * MERGE a `MENTIONS` relationship from entity to memory.\n *\n * @param entityId - Entity id from {@link upsertEntity}.\n * @param memoryId - Target memory UUID.\n * @param role - Optional role string on the relationship.\n */\n async linkEntityToMemory(\n entityId: string,\n memoryId: string,\n role?: string,\n ): Promise<void> {\n // Single session for the whole typed write (avoid 3 separate sessions).\n await this.withSession(async (session) => {\n await this.ensureMemoryNode(memoryId, session);\n const found = await this.runOnSession(\n session,\n `MATCH (e:Entity { id: $id }) RETURN e.id AS id`,\n { id: entityId },\n );\n if (found.length === 0) {\n throw new DatabaseError(`Entity not found: ${entityId}`, {\n operation: \"linkEntityToMemory\",\n });\n }\n await this.runOnSession(\n session,\n `MATCH (e:Entity { id: $entityId }), (m:Memory { id: $memoryId })\n MERGE (e)-[r:MENTIONS]->(m)\n SET r.role = $role`,\n { entityId, memoryId, role: role ?? \"\" },\n );\n });\n }\n\n /**\n * DETACH DELETE the memory node and all incident relationships.\n *\n * @param memoryId - Wolbarg memory UUID.\n */\n async deleteMemory(memoryId: string): Promise<void> {\n await this.run(\n `MATCH (m:Memory { id: $id })\n DETACH DELETE m`,\n { id: memoryId },\n );\n }\n\n /**\n * Run arbitrary parameterized Cypher (escape hatch for advanced graph queries).\n *\n * @param cypher - Cypher query string.\n * @param params - Bound parameters for the query.\n * @returns Raw row objects from the driver.\n */\n async query(\n cypher: string,\n params?: Record<string, unknown>,\n ): Promise<unknown> {\n return this.run(cypher, params ?? {});\n }\n\n /** Verify connectivity and return server metadata when available. */\n async health(): Promise<GraphHealthResult> {\n try {\n if (!this.opened || !this.driver) {\n return { ok: false, backend: \"neo4j\", details: { reason: \"not open\" } };\n }\n await this.driver.verifyConnectivity();\n let serverInfo: unknown = undefined;\n if (typeof this.driver.getServerInfo === \"function\") {\n serverInfo = await this.driver.getServerInfo();\n }\n return {\n ok: true,\n backend: \"neo4j\",\n details: {\n url: this.url,\n database: this.database ?? \"default\",\n networked: true,\n serverInfo,\n },\n };\n } catch (error) {\n return {\n ok: false,\n backend: \"neo4j\",\n details: {\n url: this.url,\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n}\n\nfunction unwrapNeo4jValue(value: unknown): unknown {\n if (value == null) return value;\n if (typeof value === \"object\" && value !== null && \"toNumber\" in value) {\n try {\n return (value as { toNumber: () => number }).toNumber();\n } catch {\n /* Integer overflow — keep as-is */\n }\n }\n if (typeof value === \"object\" && value !== null && \"properties\" in value) {\n return unwrapRow(\n (value as { properties: Record<string, unknown> }).properties,\n );\n }\n return value;\n}\n\nfunction unwrapRow(row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = unwrapNeo4jValue(v);\n }\n return out;\n}\n","/**\n * Configuration validation for SDK initialization and constructor options.\n *\n * All validators throw {@link ConfigurationError} or {@link ValidationError}\n * with field-scoped messages suitable for IDE hover documentation.\n */\n\nimport type {\n WolbargOptions,\n StorageInput,\n GraphInput,\n} from \"./options.js\";\nimport {\n isEmbeddingProvider,\n isGraphProvider,\n isLlmProvider,\n isStorageProvider,\n isTelemetryProvider,\n resolveDatabaseUrl,\n} from \"./options.js\";\nimport type {\n DatabaseConfig,\n EmbeddingConfig,\n EmbeddingCacheConfig,\n InitOptions,\n LlmConfig,\n MemoryDedupeConfig,\n StorageConfig,\n TelemetryConfig,\n RetrievalConfig,\n} from \"../types/index.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport { SqliteGraphProvider } from \"../graph/providers/sqlite-graph.js\";\nimport { Neo4jGraphProvider } from \"../graph/providers/neo4j.js\";\nimport type { GraphConfig, GraphProvider } from \"../graph/types.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 assertFiniteNumber(value: unknown, fieldName: string): asserts value is number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new ConfigurationError(`${fieldName} must be a finite number`);\n }\n}\n\nfunction assertNumberMin(value: number, fieldName: string, min: number): void {\n if (!Number.isFinite(value) || value < min) {\n throw new ConfigurationError(`${fieldName} must be >= ${min}`);\n }\n}\n\nfunction assertNumberInRange(\n value: number,\n fieldName: string,\n min: number,\n max: number,\n): void {\n if (!Number.isFinite(value) || value < min || value > max) {\n throw new ConfigurationError(`${fieldName} must be between ${min} and ${max}`);\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\n/**\n * Validate and normalize embedding provider configuration.\n *\n * @param config - Raw embedding config from `wolbarg({ embedding })`.\n * @returns Trimmed, normalized config with trailing slashes removed from `baseUrl`.\n * @throws {@link ConfigurationError} when required fields are missing or invalid.\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\n/**\n * Validate and normalize LLM provider configuration.\n *\n * @param config - Raw LLM config from `wolbarg({ llm })`.\n * @returns Normalized config with validated temperature and token limits.\n * @throws {@link ConfigurationError} when URLs, models, or numeric ranges are invalid.\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\nfunction validateRetrievalConfig(config: RetrievalConfig): RetrievalConfig {\n if (config === null || typeof config !== \"object\") {\n throw new ConfigurationError(\"retrieval must be an object\");\n }\n\n const out: RetrievalConfig = {};\n\n if (config.overFetchFactor !== undefined) {\n assertFiniteNumber(config.overFetchFactor, \"retrieval.overFetchFactor\");\n assertNumberMin(config.overFetchFactor, \"retrieval.overFetchFactor\", 0);\n if (config.overFetchFactor <= 0) {\n throw new ConfigurationError(\"retrieval.overFetchFactor must be > 0\");\n }\n out.overFetchFactor = config.overFetchFactor;\n }\n\n if (config.hybrid !== undefined) {\n if (config.hybrid === null || typeof config.hybrid !== \"object\") {\n throw new ConfigurationError(\"retrieval.hybrid must be an object\");\n }\n const hybrid = config.hybrid;\n const outHybrid: NonNullable<RetrievalConfig[\"hybrid\"]> = {};\n\n if (hybrid.semanticWeight !== undefined) {\n assertFiniteNumber(hybrid.semanticWeight, \"retrieval.hybrid.semanticWeight\");\n if (hybrid.semanticWeight < 0) {\n throw new ConfigurationError(\n \"retrieval.hybrid.semanticWeight must be >= 0\",\n );\n }\n outHybrid.semanticWeight = hybrid.semanticWeight;\n }\n\n if (hybrid.keywordWeight !== undefined) {\n assertFiniteNumber(hybrid.keywordWeight, \"retrieval.hybrid.keywordWeight\");\n if (hybrid.keywordWeight < 0) {\n throw new ConfigurationError(\n \"retrieval.hybrid.keywordWeight must be >= 0\",\n );\n }\n outHybrid.keywordWeight = hybrid.keywordWeight;\n }\n\n if (Object.keys(outHybrid).length > 0) {\n out.hybrid = outHybrid;\n }\n }\n\n if (config.mmr !== undefined) {\n if (config.mmr === null || typeof config.mmr !== \"object\") {\n throw new ConfigurationError(\"retrieval.mmr must be an object\");\n }\n const mmr = config.mmr;\n const outMmr: NonNullable<RetrievalConfig[\"mmr\"]> = {};\n\n if (mmr.lambda !== undefined) {\n assertFiniteNumber(mmr.lambda, \"retrieval.mmr.lambda\");\n assertNumberInRange(mmr.lambda, \"retrieval.mmr.lambda\", 0, 1);\n outMmr.lambda = mmr.lambda;\n }\n\n if (Object.keys(outMmr).length > 0) {\n out.mmr = outMmr;\n }\n }\n\n return out;\n}\n\nfunction validateMemoryDedupeConfig(config: MemoryDedupeConfig): MemoryDedupeConfig {\n if (config === null || typeof config !== \"object\") {\n throw new ConfigurationError(\"memory.dedupe must be an object\");\n }\n const out: MemoryDedupeConfig = {};\n\n if (config.enabled !== undefined) {\n if (typeof config.enabled !== \"boolean\") {\n throw new ConfigurationError(\"memory.dedupe.enabled must be a boolean\");\n }\n out.enabled = config.enabled;\n }\n\n if (config.strategy !== undefined) {\n const allowed = new Set([\"exact\", \"near\", \"exact-or-near\"]);\n if (!allowed.has(config.strategy)) {\n throw new ConfigurationError(\n `memory.dedupe.strategy must be one of ${Array.from(allowed).join(\", \")}`,\n );\n }\n out.strategy = config.strategy;\n }\n\n if (config.nearThreshold !== undefined) {\n assertFiniteNumber(config.nearThreshold, \"memory.dedupe.nearThreshold\");\n assertNumberInRange(\n config.nearThreshold,\n \"memory.dedupe.nearThreshold\",\n 0,\n 1,\n );\n out.nearThreshold = config.nearThreshold;\n }\n\n if (config.nearCandidateLimit !== undefined) {\n assertFiniteNumber(\n config.nearCandidateLimit,\n \"memory.dedupe.nearCandidateLimit\",\n );\n assertNumberMin(\n config.nearCandidateLimit,\n \"memory.dedupe.nearCandidateLimit\",\n 1,\n );\n out.nearCandidateLimit = config.nearCandidateLimit;\n }\n\n return out;\n}\n\nfunction validateEmbeddingCacheConfig(\n config: EmbeddingCacheConfig,\n): EmbeddingCacheConfig {\n if (config === null || typeof config !== \"object\") {\n throw new ConfigurationError(\"embeddingCache must be an object\");\n }\n\n const out: EmbeddingCacheConfig = {};\n\n if (config.enabled !== undefined) {\n if (typeof config.enabled !== \"boolean\") {\n throw new ConfigurationError(\"embeddingCache.enabled must be a boolean\");\n }\n out.enabled = config.enabled;\n }\n\n if (config.ttlMs !== undefined) {\n assertFiniteNumber(config.ttlMs, \"embeddingCache.ttlMs\");\n if (config.ttlMs < 0) {\n throw new ConfigurationError(\"embeddingCache.ttlMs must be >= 0\");\n }\n out.ttlMs = config.ttlMs;\n }\n\n if (config.maxEntries !== undefined) {\n assertFiniteNumber(config.maxEntries, \"embeddingCache.maxEntries\");\n if (config.maxEntries < 0) {\n throw new ConfigurationError(\"embeddingCache.maxEntries must be >= 0\");\n }\n out.maxEntries = config.maxEntries;\n }\n\n return out;\n}\n\n/**\n * Normalize SQLite or PostgreSQL database configuration.\n *\n * Resolves `url` / `connectionString` aliases and validates the provider name.\n *\n * @param config - Storage or database config object.\n * @returns Normalized {@link DatabaseConfig} with both `url` and `connectionString` set.\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 ...(\"durableWrites\" in config && config.durableWrites !== undefined\n ? { durableWrites: config.durableWrites }\n : {}),\n };\n }\n return {\n provider: \"sqlite\",\n connectionString,\n url: connectionString,\n };\n}\n\n/**\n * Validate telemetry configuration (independent database from memory storage).\n *\n * @param config - Telemetry block from `wolbarg({ telemetry })`.\n * @returns Normalized config with defaults for capture flags and log level.\n * @throws {@link ConfigurationError} for unsupported providers (Neo4j/Kuzu) or missing URL.\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 const providerName = String(\n (config.database as { provider?: string }).provider ?? \"\",\n );\n if (providerName === \"kuzu\" || providerName === \"neo4j\") {\n throw new ConfigurationError(\n `telemetry supports sqlite or postgres only (got \"${providerName}\")`,\n {\n reason: `provider=${providerName}`,\n suggestion:\n 'Use telemetry: { database: { provider: \"sqlite\", url: \"./telemetry.db\" } }. Graph backends (kuzu/neo4j) are not valid telemetry stores.',\n },\n );\n }\n if (config.database.provider !== \"sqlite\") {\n throw new ConfigurationError(\n `Unsupported telemetry provider \"${config.database.provider}\". Only \"sqlite\" is implemented; PostgreSQL typed but not implemented. Telemetry supports sqlite or postgres only — not kuzu/neo4j.`,\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 compatibility entry point).\n *\n * @param options - Legacy `init()` shape with organization, database, embedding, optional llm.\n * @returns Trimmed organization and normalized nested configs.\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\n/**\n * Validate and normalize the full `wolbarg()` constructor options object.\n *\n * Resolves storage/database aliases, validates retrieval, dedupe, embedding cache,\n * telemetry, and graph inputs.\n *\n * @param options - Raw constructor options.\n * @returns Normalized options safe for Wolbarg construction.\n * @throws {@link ConfigurationError} on invalid or conflicting configuration.\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 checkpointDirectory =\n options.checkpointDirectory !== undefined\n ? (() => {\n assertNonEmpty(options.checkpointDirectory, \"checkpointDirectory\");\n return options.checkpointDirectory.trim();\n })()\n : undefined;\n\n const storageInput = resolveStorageInput(options);\n let storage: StorageInput = storageInput;\n if (!isStorageProvider(storageInput)) {\n storage = normalizeDatabaseConfig(storageInput);\n }\n\n if (\n !isStorageProvider(storageInput) &&\n storageInput.provider === \"postgres\" &&\n storageInput.maxPoolSize !== undefined\n ) {\n assertFiniteNumber(\n storageInput.maxPoolSize,\n \"database.maxPoolSize\",\n );\n assertNumberMin(storageInput.maxPoolSize, \"database.maxPoolSize\", 1);\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 let graph = options.graph;\n if (graph !== undefined) {\n graph = resolveGraphInput(graph);\n }\n\n const retrieval =\n options.retrieval !== undefined ? validateRetrievalConfig(options.retrieval) : undefined;\n\n const embeddingCache =\n options.embeddingCache !== undefined\n ? validateEmbeddingCacheConfig(options.embeddingCache)\n : undefined;\n\n const memory =\n options.memory !== undefined && options.memory.dedupe !== undefined\n ? { ...options.memory, dedupe: validateMemoryDedupeConfig(options.memory.dedupe) }\n : options.memory;\n\n return {\n ...options,\n organization: options.organization.trim(),\n storage,\n database: undefined,\n ...(telemetry ? { telemetry } : {}),\n ...(graph !== undefined ? { graph } : {}),\n ...(retrieval !== undefined ? { retrieval } : {}),\n ...(embeddingCache !== undefined ? { embeddingCache } : {}),\n ...(checkpointDirectory !== undefined ? { checkpointDirectory } : {}),\n ...(memory !== undefined ? { memory } : {}),\n };\n}\n\n/**\n * Accept a {@link GraphProvider} instance or `{ provider: \"sqlite\" | \"neo4j\", … }` config.\n *\n * Instantiates built-in SQLite / Neo4j providers from config objects.\n *\n * @param input - Graph provider instance or config.\n * @returns Resolved {@link GraphProvider} ready for `open()`.\n * @throws {@link ConfigurationError} on garbage input or unsupported provider names.\n *\n * @example\n * ```ts\n * const graph = resolveGraphInput({ provider: \"sqlite\", path: \"./graph.db\" });\n * ```\n */\nexport function resolveGraphInput(input: GraphInput): GraphProvider {\n if (input == null || typeof input !== \"object\") {\n throw new ConfigurationError(\n \"graph must be a GraphProvider instance or a config object\",\n {\n suggestion:\n \"Use graph: sqliteGraph({ path }) or graph: neo4jGraph({ url, username, password })\",\n },\n );\n }\n if (Array.isArray(input)) {\n throw new ConfigurationError(\n \"graph must be a GraphProvider instance or a config object\",\n {\n suggestion:\n \"Use graph: sqliteGraph({ path }) or graph: neo4jGraph({ url, username, password })\",\n },\n );\n }\n if (isGraphProvider(input)) {\n return input;\n }\n const config = input as GraphConfig;\n if (config.provider === \"sqlite\") {\n if (typeof config.path !== \"string\" || !config.path.trim()) {\n throw new ConfigurationError(\n 'graph sqlite config requires a non-empty \"path\"',\n );\n }\n return new SqliteGraphProvider({ path: config.path });\n }\n if (config.provider === \"neo4j\") {\n if (typeof config.url !== \"string\" || !config.url.trim()) {\n throw new ConfigurationError('graph neo4j config requires a non-empty \"url\"');\n }\n if (typeof config.username !== \"string\" || !config.username.trim()) {\n throw new ConfigurationError(\n 'graph neo4j config requires a non-empty \"username\"',\n );\n }\n if (typeof config.password !== \"string\") {\n throw new ConfigurationError('graph neo4j config requires a \"password\" string');\n }\n return new Neo4jGraphProvider({\n url: config.url,\n username: config.username,\n password: config.password,\n database: config.database,\n });\n }\n throw new ConfigurationError(\n `Unsupported graph provider \"${String((config as { provider?: string }).provider)}\". Supported: \"sqlite\", \"neo4j\", or a GraphProvider instance.`,\n {\n suggestion:\n 'Use graph: sqliteGraph({ path: \"./local-graph.db\" }) or graph: neo4jGraph({ url, username, password })',\n },\n );\n}\n","/**\n * Trace context helpers — `session_id`, `trace_id`, `parent_trace_id`.\n *\n * Used by {@link TelemetryEmitter} to correlate memory operations in Studio.\n */\n\nimport { createId } from \"../utils/index.js\";\n\n/** Distributed trace context attached to telemetry events. */\nexport interface TraceContext {\n /** Wolbarg instance session id (stable for process lifetime). */\n sessionId: string;\n /** Unique id for this operation span. */\n traceId: string;\n /** Parent span id when nested, else `null`. */\n parentTraceId: string | null;\n}\n\n/** Create a new session id (UUID v4). */\nexport function createSessionId(): string {\n return createId();\n}\n\n/** Create a new trace id (UUID v4). */\nexport function createTraceId(): string {\n return createId();\n}\n\n/**\n * Create a root trace context for a top-level operation.\n *\n * @param sessionId - Session from {@link createSessionId} or {@link TelemetryEmitter.sessionId}.\n */\nexport function createRootTrace(sessionId: string): TraceContext {\n return {\n sessionId,\n traceId: createTraceId(),\n parentTraceId: null,\n };\n}\n\n/**\n * Create a child trace linked to a parent span.\n *\n * @param parent - Parent operation trace context.\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\n/** No-op telemetry provider used when observability is disabled. */\nexport class NoopTelemetryProvider implements TelemetryProvider {\n readonly name = \"noop\";\n\n /** @inheritdoc TelemetryProvider.open */\n async open(): Promise<void> {}\n /** @inheritdoc TelemetryProvider.close */\n async close(): Promise<void> {}\n /** @inheritdoc TelemetryProvider.emit */\n emit(_event: TelemetryEventInput): void {}\n /** @inheritdoc TelemetryProvider.flush */\n async flush(): Promise<void> {}\n}\n\n/**\n * Handle for an in-flight traced operation.\n *\n * Created by {@link TelemetryEmitter.start}. Call `success()` or `failure()`\n * exactly once when the operation completes.\n */\nexport interface OperationTraceHandle {\n /** Distributed trace context (session, trace, parent ids). */\n context: TraceContext;\n /** `performance.now()` at operation start. */\n startedAt: number;\n /** Partial latency breakdown filled via {@link OperationTraceHandle.mark}. */\n latency: Partial<LatencyBreakdown>;\n /** Start a child trace for nested operations. */\n child(operation: TelemetryOperation): OperationTraceHandle;\n /** Record stage latency in milliseconds. */\n mark(stage: keyof Omit<LatencyBreakdown, \"totalMs\">, ms: number): void;\n /** Emit a successful completion event. */\n success(fields?: Partial<TelemetryEventInput>): void;\n /** Emit a failed completion event. */\n failure(error: unknown, fields?: Partial<TelemetryEventInput>): void;\n}\n\n/** Default organization injected into events when not overridden per-call. */\nexport interface TelemetryEmitterContext {\n /** Organization namespace from Wolbarg constructor. */\n organization?: string | null;\n}\n\n/**\n * Async telemetry emitter — never blocks memory operations.\n *\n * Wraps a {@link TelemetryProvider} with session/trace lifecycle helpers and\n * configurable capture flags (queries, latency, errors, similarity scores).\n */\nexport class TelemetryEmitter {\n /** Stable session id for this Wolbarg instance lifetime. */\n readonly sessionId: string;\n /** Structured logger gated by telemetry log level. */\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 /**\n * @param provider - Telemetry backend, or `null` for {@link NoopTelemetryProvider}.\n * @param config - Capture flags and log level.\n * @param context - Default organization injected into events.\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 /** Whether telemetry is enabled and backed by a non-noop provider. */\n get enabled(): boolean {\n return this.config.enabled && this.provider.name !== \"noop\";\n }\n\n /** Replace the underlying telemetry provider (e.g. after lazy init). */\n setProvider(provider: TelemetryProvider): void {\n this.provider = provider;\n }\n\n /** Open the underlying telemetry provider when enabled. */\n async open(): Promise<void> {\n if (!this.config.enabled) {\n return;\n }\n await this.provider.open();\n }\n\n /** Flush pending events and close the telemetry provider. */\n async close(): Promise<void> {\n await this.provider.flush();\n await this.provider.close();\n }\n\n /** Flush pending telemetry events without closing the provider. */\n async flush(): Promise<void> {\n await this.provider.flush();\n }\n\n /**\n * Begin tracing an operation.\n *\n * @param operation - Public telemetry operation name.\n * @param parent - Optional parent trace for nested spans.\n * @returns Handle — call `success()` or `failure()` when done.\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 (!self.config.enabled) {\n return;\n }\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 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 /** Emit a startup telemetry event. */\n emitStartup(provider: string): void {\n const trace = this.start(\"startup\");\n trace.success({ provider });\n }\n\n /** Emit a shutdown telemetry event. */\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 /**\n * @param options.url - Path to the telemetry SQLite file.\n * @param options.readonly - Open read-only (Studio / analytics).\n */\n constructor(options: SqliteEventDatabaseOptions) {\n this.url = options.url;\n this.readonly = options.readonly ?? false;\n }\n\n /** Open the telemetry database and run schema migrations. */\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 /** Close the telemetry database connection. */\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 /** Insert one normalized telemetry event row. */\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 /** Insert many events in a single transaction. */\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 /** Query telemetry events with filters, sort, and pagination. */\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 // Exact membership match (avoid substring false-positives).\n clauses.push(\n `EXISTS (SELECT 1 FROM json_each(memory_ids_json) WHERE json_each.value = ?)`,\n );\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 /** Fetch one event by primary key. */\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 /** Count events optionally filtered by time and operation. */\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\nconst MAX_QUEUE_SIZE = 10_000;\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 private warnedQueueDrop = false;\n private warnedFlushFailure = false;\n\n /**\n * @param options.url - Path to the independent telemetry SQLite database file.\n */\n constructor(options: SqliteTelemetryProviderOptions) {\n this.db = new SqliteEventDatabase({ url: options.url });\n }\n\n /** Open the telemetry EventDatabase (lazy — also invoked on first emit). */\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 /** Flush pending events and close the telemetry database. */\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 /**\n * Enqueue a telemetry event for async persistence (never throws).\n *\n * @param event - Partial or complete {@link TelemetryEventInput}.\n */\n emit(event: TelemetryEventInput): void {\n if (this.closed) {\n return;\n }\n if (this.queue.length >= MAX_QUEUE_SIZE) {\n // Drop oldest to keep memory bounded under sustained write failures.\n this.queue.shift();\n if (!this.warnedQueueDrop) {\n this.warnedQueueDrop = true;\n console.warn(\n `[wolbarg telemetry] event queue capped at ${MAX_QUEUE_SIZE}; dropping oldest events`,\n );\n }\n }\n this.queue.push(event);\n void this.scheduleFlush();\n }\n\n /** Block until all queued events are written (or dropped on failure). */\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 /** Query persisted telemetry events with filters and pagination. */\n async query(options: TelemetryQuery): Promise<TelemetryQueryResult> {\n await this.open();\n return this.db.query(options);\n }\n\n /** Fetch a single telemetry event by id. */\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 (error) {\n // Telemetry must never crash the host application.\n // Drop failed batch rather than re-queue forever.\n if (!this.warnedFlushFailure) {\n this.warnedFlushFailure = true;\n console.warn(\n `[wolbarg telemetry] flush failed; dropping batch: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\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\";\nimport { SDK_VERSION } from \"../../version.js\";\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 /**\n * @param options.directory - Folder for `.json` metadata and `.db` snapshot files.\n */\n constructor(options?: SqliteCheckpointProviderOptions) {\n this.directory =\n options?.directory ??\n path.resolve(process.cwd(), \".wolbarg\", \"checkpoints\");\n }\n\n /** Ensure the checkpoint directory exists. */\n async open(): Promise<void> {\n fs.mkdirSync(this.directory, { recursive: true });\n this.ready = true;\n }\n\n /** Mark the provider closed (does not delete snapshots). */\n async close(): Promise<void> {\n this.ready = false;\n }\n\n /**\n * Create an immutable SQLite backup of `sourcePath` under a unique name.\n *\n * @param name - Checkpoint label (must not already exist).\n * @param sourcePath - Live memory database path to snapshot.\n * @param options.description - Optional human-readable description stored in metadata.\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 const tmpSnapshotPath = `${snapshotPath}.tmp-${Date.now()}`;\n try {\n await safeSqliteBackup(resolvedSource, tmpSnapshotPath);\n } catch (error) {\n if (fs.existsSync(tmpSnapshotPath)) {\n fs.rmSync(tmpSnapshotPath, { force: true });\n }\n throw error;\n }\n\n const stats = fs.statSync(tmpSnapshotPath);\n if (fs.existsSync(snapshotPath)) {\n fs.rmSync(snapshotPath, { force: true });\n }\n fs.renameSync(tmpSnapshotPath, 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\n const tmpMetaPath = `${metaPath}.tmp-${Date.now()}`;\n fs.writeFileSync(tmpMetaPath, JSON.stringify(meta, null, 2), \"utf8\");\n fs.renameSync(tmpMetaPath, metaPath);\n return meta;\n }\n\n /**\n * Restore a named checkpoint over `targetPath` (replaces WAL/SHM side files).\n *\n * @param name - Existing checkpoint name.\n * @param targetPath - Live memory database path to overwrite.\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 /** Delete checkpoint metadata and snapshot files for `name`. */\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 /** List all checkpoints sorted by creation time. */\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 /** Load checkpoint metadata by name, or `null` if missing / corrupt. */\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 /**\n * Consistent SQLite file backup (WAL checkpoint + backup API / copy).\n * Used for memory snapshots and for secondary files such as the graph DB.\n */\n async backupSqliteFile(sourcePath: string, destPath: string): Promise<void> {\n this.requireReady();\n const resolved = resolveDbPath(sourcePath);\n if (resolved === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot backup an in-memory database. Use a file-backed SQLite database.\",\n );\n }\n if (!fs.existsSync(resolved)) {\n throw new DatabaseError(\n `SQLite file not found at ${resolved}`,\n {\n suggestion: \"Ensure the source database exists before backing up.\",\n },\n );\n }\n await safeSqliteBackup(resolved, destPath);\n }\n\n /**\n * Snapshot a secondary SQLite file (typically the graph DB) next to a named\n * memory checkpoint as `{name}.graph.db`.\n */\n async checkpointGraph(\n name: string,\n graphSourcePath: string,\n ): Promise<string> {\n this.requireReady();\n assertCheckpointName(name);\n const dest = this.graphSnapshotPath(name);\n await this.backupSqliteFile(graphSourcePath, dest);\n return dest;\n }\n\n /**\n * Restore a previously snapshotted graph SQLite file into `targetPath`.\n */\n async rollbackGraph(name: string, targetPath: string): Promise<void> {\n this.requireReady();\n const snapshot = this.graphSnapshotPath(name);\n if (!fs.existsSync(snapshot)) {\n return;\n }\n const resolvedTarget = resolveDbPath(targetPath);\n if (resolvedTarget === \":memory:\") {\n throw new ConfigurationError(\n \"Cannot rollback graph into an in-memory database.\",\n );\n }\n fs.mkdirSync(path.dirname(resolvedTarget), { recursive: true });\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(snapshot, resolvedTarget);\n }\n\n /** Absolute path of the graph snapshot for a named checkpoint, if present. */\n graphSnapshotPath(name: string): string {\n return path.join(this.directory, `${sanitize(name)}.graph.db`);\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 * In-process EventEmitter backend for SQLite subscribe().\n *\n * Limitation: only delivers events within the same Node.js process.\n */\n\nimport { EventEmitter } from \"node:events\";\nimport type {\n MemoryChangeCallback,\n MemoryChangeEvent,\n SubscribeBackend,\n SubscribeFilter,\n SubscribableEvent,\n Unsubscribe,\n} from \"./types.js\";\n\ninterface Subscription {\n filter: SubscribeFilter;\n callback: MemoryChangeCallback;\n}\n\nfunction matchesFilter(\n filter: SubscribeFilter,\n event: MemoryChangeEvent,\n): boolean {\n if (filter.organization !== event.organization) {\n return false;\n }\n if (filter.agent !== undefined && filter.agent !== event.agent) {\n return false;\n }\n if (filter.event === undefined) {\n return true;\n }\n const events = Array.isArray(filter.event) ? filter.event : [filter.event];\n return events.some(\n (e: SubscribableEvent) => e === \"*\" || e === event.event,\n );\n}\n\n/** In-process {@link SubscribeBackend} for SQLite (same Node.js process only). */\nexport class SqliteSubscribeEmitter implements SubscribeBackend {\n private readonly emitter = new EventEmitter();\n private readonly subscriptions = new Map<number, Subscription>();\n private nextId = 1;\n private closed = false;\n\n constructor() {\n this.emitter.setMaxListeners(0);\n this.emitter.on(\"change\", (event: MemoryChangeEvent) => {\n for (const sub of this.subscriptions.values()) {\n if (!matchesFilter(sub.filter, event)) {\n continue;\n }\n try {\n sub.callback(event);\n } catch (error) {\n // Never crash the write path.\n console.error(\n \"[wolbarg] subscribe callback error:\",\n error instanceof Error ? error.message : error,\n );\n }\n }\n });\n }\n\n /**\n * Register a filtered callback for in-process memory change events.\n *\n * @param filter - Organization / agent / event-type filter.\n * @param callback - Invoked synchronously on each matching emit.\n * @returns Unsubscribe function.\n */\n subscribe(\n filter: SubscribeFilter,\n callback: MemoryChangeCallback,\n ): Unsubscribe {\n if (this.closed) {\n throw new Error(\"Subscribe backend is closed\");\n }\n const id = this.nextId++;\n this.subscriptions.set(id, { filter, callback });\n return () => {\n this.subscriptions.delete(id);\n };\n }\n\n /** Emit a memory change event to registered subscribers. */\n emit(event: MemoryChangeEvent): void {\n if (this.closed) {\n return;\n }\n this.emitter.emit(\"change\", event);\n }\n\n /** Remove all listeners and mark the emitter closed. */\n async close(): Promise<void> {\n this.closed = true;\n this.subscriptions.clear();\n this.emitter.removeAllListeners();\n }\n}\n","/**\n * Wolbarg — modular semantic memory SDK for AI agents (v0.5.5).\n *\n * Construct with {@link wolbarg} or `new Wolbarg(options)`. Pass provider\n * **instances** (custom implementations) or **configs / factory helpers**\n * for embedding, LLM, storage, graph, and optional plugins.\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 * // Optional — required for compress() and rememberFromMessages({ mode: \"extract\" })\n * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\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 fs from \"node:fs\";\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 {\n resolveEmbeddingCacheConfig,\n withEmbeddingCache,\n type ResolvedEmbeddingCacheConfig,\n} from \"../embedding/cache.js\";\nimport {\n MemoryEmbeddingCacheStore,\n PostgresEmbeddingCacheStore,\n SqliteEmbeddingCacheStore,\n} from \"../embedding/cache-store.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 hashMemoryContent,\n mergeMemoryMetadata,\n resolveMemoryDedupeConfig,\n type ResolvedMemoryDedupeConfig,\n} from \"../memory/dedupe.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 GraphCheckpointNotSupportedError,\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 MemoryMetadata,\n MemoryRecord,\n RecallExplainResponse,\n RecallExplanationHit,\n RecallOptions,\n RecallResult,\n RememberOptions,\n RememberResult,\n ConversationMessage,\n RememberFromMessagesOptions,\n RetrievalConfig,\n StatsResult,\n} from \"../types/index.js\";\nimport {\n normalizeConversationMessages,\n resolveRememberFromMessagesOptions,\n selectRawUserTexts,\n buildExtractMessages,\n parseExtractedFacts,\n} from \"../memory/from-messages.js\";\nimport type { GraphProvider, GetRelatedOptions } from \"../graph/types.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 WolbargLogger,\n} from \"../telemetry/index.js\";\nimport type { PersistedRecallExplainPayload } from \"../telemetry/index.js\";\nimport type { OperationTraceHandle } from \"../telemetry/emitter.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\";\nimport { PostgresStorageProvider } from \"../storage/providers/postgres.js\";\nimport {\n SqliteSubscribeEmitter,\n createPostgresListenerFromPool,\n type MemoryChangeEvent,\n type SubscribeBackend,\n type SubscribeFilter,\n type Unsubscribe,\n} from \"../subscribe/index.js\";\n\ntype ReadyState = {\n storage: StorageProvider;\n embedding: EmbeddingProvider;\n organization: string;\n};\n\nconst warnLogger = new WolbargLogger(\"warn\");\nlet warnedHybridNoKeyword = false;\nlet warnedRerankNoProvider = false;\n\n/**\n * Main Wolbarg facade: remember / recall / ingest / graph / checkpoints.\n *\n * @typeParam HasLlm - `true` when constructed with an `llm` (enables\n * {@link Wolbarg.compress} at the type level).\n */\nexport class Wolbarg<HasLlm extends boolean = false> {\n /** Compile-time marker: `true` when an LLM was configured at construction. */\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 graph: GraphProvider | 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 private subscribeBackend: SubscribeBackend | null = null;\n private pgListenBackend: SubscribeBackend | null = null;\n private memoryDedupe: ResolvedMemoryDedupeConfig = resolveMemoryDedupeConfig();\n private embeddingCacheConfig: ResolvedEmbeddingCacheConfig =\n resolveEmbeddingCacheConfig();\n private rawEmbedding: EmbeddingProvider | null = null;\n\n /**\n * Create a Wolbarg instance with an LLM (enables {@link Wolbarg.compress}).\n *\n * @param options - See {@link WolbargOptionsWithLlm}. `llm` may be a custom\n * {@link LlmProvider} (`{ model, complete, validate }`) or a config /\n * factory result such as {@link openaiLlm}.\n */\n constructor(options: WolbargOptionsWithLlm);\n /**\n * Create a Wolbarg instance without an LLM (compress / extract mode unavailable).\n *\n * @param options - See {@link WolbargOptionsWithoutLlm}.\n */\n constructor(options: WolbargOptionsWithoutLlm);\n /**\n * Empty constructor for the legacy {@link Wolbarg.init} flow.\n * Prefer passing options to the constructor or {@link wolbarg}.\n */\n constructor();\n /**\n * @param options - Full {@link WolbargOptions}. Key fields:\n * - `organization` — namespace isolating memories in a shared DB\n * - `database` / `storage` — SQLite/Postgres config **or** a custom\n * {@link StorageProvider} instance\n * - `embedding` — {@link EmbeddingProvider} instance **or**\n * {@link EmbeddingConfig} / {@link openaiEmbedding} (etc.)\n * - `llm` — optional {@link LlmProvider} or {@link LlmConfig} / {@link openaiLlm};\n * required for {@link Wolbarg.compress} and extract-mode\n * {@link Wolbarg.rememberFromMessages}\n * - `graph`, `telemetry`, `reranker`, `keywordSearch`, `ocr`, `vision`,\n * `compression`, `chunking`, `retrieval`, `concurrency`, `embeddingCache`,\n * `memory.dedupe` — optional plugins / tuning\n */\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 this.memoryDedupe = resolveMemoryDedupeConfig(validated.memory?.dedupe);\n this.embeddingCacheConfig = resolveEmbeddingCacheConfig(\n validated.embeddingCache,\n );\n\n const storageInput = validated.storage!;\n this.storage = isStorageProvider(storageInput)\n ? storageInput\n : createStorageProvider(storageInput, {\n concurrency: validated.concurrency,\n });\n\n if (!isStorageProvider(storageInput)) {\n this.memoryDbPath = resolveDatabaseUrl(storageInput);\n } else if (storageInput instanceof SqliteStorageProvider) {\n this.memoryDbPath = storageInput.path;\n }\n\n const embedding = isEmbeddingProvider(validated.embedding)\n ? validated.embedding\n : createEmbeddingProvider(validated.embedding);\n this.rawEmbedding = embedding;\n this.embedding = 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 if (validated.graph) {\n this.graph = validated.graph as GraphProvider;\n }\n this.chunking = validated.chunking ?? null;\n this.retrievalConfig = validated.retrieval ?? {};\n\n // In-process subscribe backend (SQLite limitation: same process only).\n this.subscribeBackend = new SqliteSubscribeEmitter();\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 * Prefer constructing with options + {@link Wolbarg.ready} instead.\n *\n * @param options - Organization, database, embedding, and optional LLM config.\n * @returns Resolves when storage is open and the vector schema is ready.\n * @throws {InitializationError} If already initialized.\n * @throws {ConfigurationError} | {ValidationError} On invalid options.\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 // v0.1 init() path: default-on embedding cache wrapper expects\n // `rawEmbedding` to be set (constructor sets it already).\n this.rawEmbedding = this.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 /**\n * Open storage, optional telemetry / checkpoint / graph providers, wrap the\n * embedding cache, and probe embedding dimensions. Safe to call multiple times;\n * concurrent callers share one boot promise.\n *\n * @returns Resolves when the instance is ready for remember/recall.\n * @throws {InitializationError} If neither constructor options nor {@link init} were used.\n */\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 /** Internal boot sequence invoked by {@link Wolbarg.ready}. */\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 await this.graph?.open();\n\n // Wrap embedding with transparent cache after storage is open.\n if (this.rawEmbedding && this.embeddingCacheConfig.enabled) {\n if (this.storage instanceof SqliteStorageProvider) {\n const sqlite = this.storage;\n const store = new SqliteEmbeddingCacheStore(() => sqlite.getDatabase(), {\n ttlMs: this.embeddingCacheConfig.ttlMs,\n });\n this.embedding = withEmbeddingCache(\n this.rawEmbedding,\n store,\n this.embeddingCacheConfig,\n );\n } else if (this.storage instanceof PostgresStorageProvider) {\n // L1-only by default — durable cache must not share the insert pool\n // (that caused cache speedup <1x under concurrent unique writes).\n this.embedding = withEmbeddingCache(\n this.rawEmbedding,\n new PostgresEmbeddingCacheStore(() => null, {\n ttlMs: this.embeddingCacheConfig.ttlMs,\n durable: false,\n }),\n this.embeddingCacheConfig,\n );\n } else {\n this.embedding = withEmbeddingCache(\n this.rawEmbedding,\n new MemoryEmbeddingCacheStore({\n ttlMs: this.embeddingCacheConfig.ttlMs,\n }),\n this.embeddingCacheConfig,\n );\n }\n }\n\n // Postgres LISTEN is deferred until the first subscribe() — opening a\n // dedicated connection on every ready() dominated cold start (~50-100ms).\n if (this.storage instanceof PostgresStorageProvider) {\n // Listener is created lazily in subscribe().\n }\n\n if (this.storage instanceof SqliteStorageProvider) {\n this.storage.setRetryLogger((msg) => {\n // debug-level retry visibility\n if (typeof console !== \"undefined\" && console.debug) {\n console.debug(`[wolbarg] ${msg}`);\n }\n });\n }\n\n // Prefer stored dimensions — skip embedding round-trip on warm reopen.\n const storedDims = await this.storage.getEmbeddingDimensions();\n if (storedDims !== null && storedDims > 0) {\n await this.storage.ensureVectorSchema(storedDims);\n this.embeddingDimensions = storedDims;\n } else {\n const probe = await this.embedding.validate();\n await this.storage.ensureVectorSchema(probe.dimensions);\n this.embeddingDimensions = probe.dimensions;\n }\n this.initialized = true;\n this.telemetry.emitStartup(this.storage.name);\n } catch (error) {\n await this.graph?.close().catch(() => undefined);\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 /**\n * Store a semantic memory for an agent. Embeds `content.text`, writes the row,\n * and may **upsert** an existing active memory when dedupe is enabled\n * (constructor `memory.dedupe` or per-call `options.dedupe`).\n *\n * @param options - Agent id, text content, optional metadata / dedupe overrides.\n * See {@link RememberOptions}.\n * @returns The stored record plus `action` (`\"created\"` | `\"updated\"`).\n * @throws {ValidationError} On empty agent/content.\n * @throws {InitializationError} If not configured / ready.\n */\n async remember(options: RememberOptions): Promise<RememberResult> {\n const trace = this.telemetry.start(\"remember\");\n try {\n const result = await this.rememberOne(options, trace);\n trace.success({\n provider: this.storage?.name,\n memoryIds: [result.id],\n returnedCount: 1,\n embeddingProvider: this.embedding?.model,\n model: this.embedding?.model,\n metadata: result.metadata,\n agentId: result.agent,\n tags: telemetryTags(result.metadata),\n extra: { upsertAction: result.action, action: result.action },\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"remember\", error);\n }\n }\n\n /**\n * Remember many memories in one call. Runs sequentially when any item (or the\n * global config) enables dedupe; otherwise embeds in batch and inserts in one\n * transaction for throughput.\n *\n * @param items - Non-empty list of {@link RememberOptions}.\n * @returns One {@link RememberResult} per input, same order.\n * @throws {ValidationError} If `items` is empty or an entry is invalid.\n */\n async rememberBatch(items: RememberOptions[]): Promise<RememberResult[]> {\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\n const anyDedupe = items.some((item) => {\n const cfg = resolveMemoryDedupeConfig(\n item.dedupe ?? this.memoryDedupe,\n );\n return cfg.enabled;\n }) || this.memoryDedupe.enabled;\n\n if (anyDedupe) {\n const out: RememberResult[] = [];\n for (const item of items) {\n const child = parent.child(\"remember\");\n const result = await this.rememberOne(item, child);\n child.success({\n provider: this.storage?.name,\n memoryIds: [result.id],\n returnedCount: 1,\n metadata: result.metadata,\n agentId: result.agent,\n tags: telemetryTags(result.metadata),\n extra: { upsertAction: result.action },\n });\n out.push(result);\n }\n parent.success({\n provider: this.storage?.name,\n memoryIds: out.map((r) => r.id),\n returnedCount: out.length,\n embeddingProvider: this.embedding?.model,\n model: this.embedding?.model,\n agentId: commonAgent(items.map((item) => item.agent.trim())),\n });\n this.emitChange({\n event: \"remember\",\n organization: this.organization!,\n agent: commonAgent(items.map((i) => i.agent.trim())) ?? items[0]!.agent,\n memoryId: out.map((r) => r.id),\n timestamp: nowIso(),\n traceId: parent.context.traceId,\n sessionId: this.telemetry.sessionId,\n });\n return out;\n }\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 contentHash: null, // batch path is append-only; dedupe uses sequential rememberOne\n }));\n\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: RememberResult[] = rows.map((row) => ({\n ...toMemoryRecord(row),\n action: \"created\" as const,\n }));\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 this.emitChange({\n event: \"remember\",\n organization,\n agent: commonAgent(items.map((i) => i.agent.trim())) ?? items[0]!.agent,\n memoryId: records.map((r) => r.id),\n timestamp,\n traceId: parent.context.traceId,\n sessionId: this.telemetry.sessionId,\n });\n return records;\n } catch (error) {\n parent.failure(error);\n throw wrapOperationError(\"rememberBatch\", error);\n }\n }\n\n /**\n * Store memories from a chat transcript.\n *\n * **Experimental** until 1.0 — API shape may change.\n *\n * - `mode: \"raw\"` (default) — remember user message text (no LLM).\n * - `mode: \"extract\"` — requires configured `llm`; extracts atomic facts then\n * remembers each. Pass a custom {@link LlmProvider} or {@link openaiLlm}\n * in the constructor.\n *\n * @param messages - Conversation turns (`role` + `content`).\n * @param options - Agent, mode, optional metadata/dedupe. See\n * {@link RememberFromMessagesOptions}.\n * @returns One {@link RememberResult} per remembered fact/message.\n * @throws {ProviderNotConfiguredError} When `mode: \"extract\"` but no `llm` was configured.\n */\n async rememberFromMessages(\n messages: ConversationMessage[],\n options: RememberFromMessagesOptions,\n ): Promise<RememberResult[]> {\n const parent = this.telemetry.start(\"rememberFromMessages\");\n try {\n const normalized = normalizeConversationMessages(messages);\n const resolved = resolveRememberFromMessagesOptions(options);\n\n let texts: string[];\n if (resolved.mode === \"extract\") {\n if (!this.llm) {\n throw new ProviderNotConfiguredError(\n \"llm\",\n \"rememberFromMessages\",\n 'pass llm: openaiLlm(...) in the constructor when mode is \"extract\"',\n );\n }\n const llmOutput = await this.llm.complete(\n buildExtractMessages(normalized),\n );\n texts = parseExtractedFacts(llmOutput);\n if (texts.length === 0) {\n parent.success({\n returnedCount: 0,\n agentId: resolved.agent,\n extra: { mode: \"extract\", factCount: 0 },\n });\n return [];\n }\n } else {\n texts = selectRawUserTexts(normalized, resolved.rawStrategy);\n }\n\n const out: RememberResult[] = [];\n for (const text of texts) {\n const child = parent.child(\"remember\");\n const result = await this.rememberOne(\n {\n agent: resolved.agent,\n content: { text },\n ...(resolved.metadata !== undefined\n ? { metadata: resolved.metadata }\n : {}),\n ...(resolved.dedupe !== undefined ? { dedupe: resolved.dedupe } : {}),\n },\n child,\n );\n child.success({\n provider: this.storage?.name,\n memoryIds: [result.id],\n returnedCount: 1,\n metadata: result.metadata,\n agentId: result.agent,\n tags: telemetryTags(result.metadata),\n extra: { upsertAction: result.action, mode: resolved.mode },\n });\n out.push(result);\n }\n\n parent.success({\n provider: this.storage?.name,\n memoryIds: out.map((r) => r.id),\n returnedCount: out.length,\n embeddingProvider: this.embedding?.model,\n model: this.embedding?.model,\n agentId: resolved.agent,\n extra: { mode: resolved.mode },\n });\n return out;\n } catch (error) {\n parent.failure(error, { agentId: options?.agent });\n throw wrapOperationError(\"rememberFromMessages\", error);\n }\n }\n\n /**\n * Update an existing memory by id. Re-embeds when `content` changes; merges\n * metadata when provided.\n *\n * @param options.id - Memory id to update.\n * @param options.content - Optional new `{ text }` (triggers re-embed + content hash).\n * @param options.metadata - Optional metadata merged onto the existing record.\n * @returns Updated record with `action: \"updated\"`.\n * @throws {MemoryNotFoundError} If the id is unknown in this organization.\n */\n async update(options: {\n id: string;\n content?: { text: string };\n metadata?: MemoryMetadata;\n }): Promise<RememberResult> {\n const trace = this.telemetry.start(\"update\");\n try {\n const { storage, embedding, organization } = await this.requireReady();\n assertNonEmptyString(options.id, \"id\");\n const existing = await storage.getMemoryById(options.id.trim(), organization);\n if (!existing) {\n throw new MemoryNotFoundError(`Memory not found: ${options.id}`);\n }\n\n const contentText = options.content?.text ?? existing.content_text;\n if (options.content) {\n assertNonEmptyString(options.content.text, \"content.text\");\n }\n const existingMeta = deserializeMetadata(existing.metadata_json);\n const metadata =\n options.metadata !== undefined\n ? mergeMemoryMetadata(existingMeta, options.metadata)\n : existingMeta;\n\n let vector: Float32Array | undefined;\n if (options.content !== undefined) {\n const tEmbed = performance.now();\n vector = await embedding.embed(contentText);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n }\n\n const timestamp = nowIso();\n const row = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const updated = await storage.updateMemory({\n id: existing.id,\n organization,\n contentText: options.content !== undefined ? contentText : undefined,\n metadata,\n embedding: vector,\n updatedAt: timestamp,\n contentHash:\n options.content !== undefined\n ? hashMemoryContent(contentText)\n : undefined,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return updated;\n });\n if (!row) {\n throw new MemoryNotFoundError(`Memory not found: ${options.id}`);\n }\n const result: RememberResult = {\n ...toMemoryRecord(row),\n action: \"updated\",\n };\n this.emitChange({\n event: \"update\",\n organization,\n agent: result.agent,\n memoryId: result.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"updated\",\n });\n trace.success({\n provider: storage.name,\n memoryIds: [result.id],\n returnedCount: 1,\n agentId: result.agent,\n extra: { upsertAction: \"updated\" },\n });\n return result;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"update\", error);\n }\n }\n\n /**\n * Subscribe to memory change events (remember / update / forget / compress / clear).\n *\n * **SQLite:** delivers events only within this Node.js process.\n * A second process writing the same `memory.db` will not notify subscribers here.\n *\n * **Postgres:** uses LISTEN/NOTIFY across processes (lazy connection on first subscribe).\n *\n * @param filter - Scope by `organization` (defaults to this instance’s org),\n * optional `agent`, and optional `events` allow-list. See {@link SubscribeFilter}.\n * @param callback - Invoked with each {@link MemoryChangeEvent}.\n * @returns {@link Unsubscribe} function — call to stop receiving events.\n * @throws {ValidationError} If organization cannot be resolved.\n */\n subscribe(\n filter: SubscribeFilter,\n callback: (event: MemoryChangeEvent) => void,\n ): Unsubscribe {\n const org = filter.organization || this.organization;\n if (!org) {\n throw new ValidationError(\n \"subscribe requires organization (set on Wolbarg or in filter)\",\n );\n }\n const normalized: SubscribeFilter = {\n ...filter,\n organization: org,\n };\n\n // Postgres: lazy LISTEN — only open the dedicated connection on first subscribe.\n if (this.storage instanceof PostgresStorageProvider) {\n if (!this.pgListenBackend) {\n const pool = this.storage.getPool?.();\n if (pool) {\n this.pgListenBackend = createPostgresListenerFromPool(pool as never);\n }\n }\n if (this.pgListenBackend) {\n // subscribe() itself kicks ensureListening — do not also void start()\n // (that raced and leaked a second LISTEN client → duplicate events).\n return this.pgListenBackend.subscribe(normalized, callback);\n }\n }\n\n if (!this.subscribeBackend) {\n this.subscribeBackend = new SqliteSubscribeEmitter();\n }\n return this.subscribeBackend.subscribe(normalized, callback);\n }\n\n /** Broadcast a memory change event to in-process or Postgres NOTIFY subscribers. */\n private emitChange(event: MemoryChangeEvent): void {\n try {\n if (this.storage instanceof PostgresStorageProvider) {\n // Avoid an extra pool round-trip when nobody is listening.\n const listener = this.pgListenBackend as\n | { hasSubscribers?: () => boolean }\n | null;\n if (listener?.hasSubscribers?.()) {\n void this.storage.notifyChange(event).catch((error) => {\n console.error(\n \"[wolbarg] NOTIFY failed:\",\n error instanceof Error ? error.message : error,\n );\n });\n }\n return;\n }\n this.subscribeBackend?.emit(event);\n } catch (error) {\n console.error(\n \"[wolbarg] emitChange error:\",\n error instanceof Error ? error.message : error,\n );\n }\n }\n\n /** Internal remember with optional upsert/dedupe. */\n private async rememberOne(\n options: RememberOptions,\n trace: OperationTraceHandle,\n ): Promise<RememberResult> {\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 agent = options.agent.trim();\n const text = options.content.text;\n const dedupe = resolveMemoryDedupeConfig(\n options.dedupe !== undefined ? options.dedupe : this.memoryDedupe,\n );\n\n const tEmbed = performance.now();\n const vector = await embedding.embed(text);\n trace.mark(\"embeddingMs\", performance.now() - tEmbed);\n this.assertEmbeddingDimensions(vector.length);\n\n const timestamp = nowIso();\n const contentHash = hashMemoryContent(text);\n\n if (!dedupe.enabled) {\n const id = createId();\n const record = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const row = await storage.insertMemory({\n id,\n organization,\n agent,\n contentText: text,\n metadata,\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n // Null hash when dedupe is off — unique index allows duplicate text.\n contentHash: null,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return toMemoryRecord(row);\n });\n this.emitChange({\n event: \"remember\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"created\",\n });\n return { ...record, action: \"created\" };\n }\n\n // Exact match\n let existing: MemoryRow | null = null;\n if (\n dedupe.strategy === \"exact\" ||\n dedupe.strategy === \"exact-or-near\"\n ) {\n if (typeof storage.findActiveByContentHash === \"function\") {\n existing = await storage.findActiveByContentHash(\n organization,\n agent,\n contentHash,\n );\n }\n }\n\n if (existing) {\n const merged = mergeMemoryMetadata(\n deserializeMetadata(existing.metadata_json),\n metadata,\n );\n const row = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const updated = await storage.updateMemory({\n id: existing!.id,\n organization,\n metadata: merged,\n updatedAt: timestamp,\n contentHash,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return updated;\n }, { exclusive: true });\n const record = toMemoryRecord(row!);\n this.emitChange({\n event: \"update\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"updated\",\n });\n return { ...record, action: \"updated\" };\n }\n\n // Near-dup\n if (\n dedupe.strategy === \"near\" ||\n dedupe.strategy === \"exact-or-near\"\n ) {\n const near = await this.findNearDuplicate(\n storage,\n organization,\n agent,\n vector,\n dedupe.nearThreshold,\n dedupe.nearCandidateLimit,\n );\n if (near) {\n const merged = mergeMemoryMetadata(\n deserializeMetadata(near.metadata_json),\n metadata,\n );\n const row = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const updated = await storage.updateMemory({\n id: near.id,\n organization,\n contentText: text,\n metadata: merged,\n embedding: vector,\n updatedAt: timestamp,\n contentHash,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return updated;\n }, { exclusive: true });\n const record = toMemoryRecord(row!);\n this.emitChange({\n event: \"update\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"updated\",\n });\n return { ...record, action: \"updated\" };\n }\n }\n\n // Insert new\n const id = createId();\n try {\n const record = await this.withWriteLock(async () => {\n const tStore = performance.now();\n const row = await storage.insertMemory({\n id,\n organization,\n agent,\n contentText: text,\n metadata,\n embedding: vector,\n createdAt: timestamp,\n updatedAt: timestamp,\n contentHash,\n });\n trace.mark(\"databaseWriteMs\", performance.now() - tStore);\n return toMemoryRecord(row);\n }, { exclusive: true });\n this.emitChange({\n event: \"remember\",\n organization,\n agent,\n memoryId: record.id,\n timestamp,\n traceId: trace.context.traceId,\n sessionId: this.telemetry.sessionId,\n upsertAction: \"created\",\n });\n return { ...record, action: \"created\" };\n } catch (error) {\n // Unique hash race: retry as update\n const msg = error instanceof Error ? error.message : String(error);\n if (\n msg.toLowerCase().includes(\"unique\") &&\n typeof storage.findActiveByContentHash === \"function\"\n ) {\n const raced = await storage.findActiveByContentHash(\n organization,\n agent,\n contentHash,\n );\n if (raced) {\n const merged = mergeMemoryMetadata(\n deserializeMetadata(raced.metadata_json),\n metadata,\n );\n const row = await this.withWriteLock(\n async () =>\n storage.updateMemory({\n id: raced.id,\n organization,\n metadata: merged,\n updatedAt: nowIso(),\n contentHash,\n }),\n { exclusive: true },\n );\n const record = toMemoryRecord(row!);\n this.emitChange({\n event: \"update\",\n organization,\n agent,\n memoryId: record.id,\n timestamp: nowIso(),\n upsertAction: \"updated\",\n });\n return { ...record, action: \"updated\" };\n }\n }\n throw error;\n }\n }\n\n /**\n * Find the best active near-duplicate memory for upsert (cosine similarity ≥ threshold).\n *\n * @param storage - Open storage provider.\n * @param organization - Org namespace.\n * @param agent - Agent scope for the search.\n * @param vector - Embedding of the candidate text.\n * @param threshold - Minimum similarity (0–1) to treat as a duplicate.\n * @param limit - Max vector candidates to inspect.\n * @returns Matching memory row, or `null` if none qualify.\n */\n private async findNearDuplicate(\n storage: StorageProvider,\n organization: string,\n agent: string,\n vector: Float32Array,\n threshold: number,\n limit: number,\n ): Promise<MemoryRow | null> {\n if (typeof storage.searchVectorsWithMemories === \"function\") {\n const hits = await storage.searchVectorsWithMemories(\n vector,\n limit,\n organization,\n { agent, includeArchived: false },\n );\n let best: { row: MemoryRow; sim: number } | null = null;\n for (const { row, distance } of hits) {\n if (row.archived === 1) continue;\n const sim = distanceToSimilarity(distance);\n if (sim >= threshold && (!best || sim > best.sim)) {\n best = { row, sim };\n }\n }\n return best?.row ?? null;\n }\n\n const hits = await storage.searchVectors(vector, limit);\n let best: { row: MemoryRow; sim: number } | null = null;\n for (const hit of hits) {\n const row = await storage.getMemoryByRowid(hit.memoryRowid, organization);\n if (!row || row.archived === 1 || row.agent !== agent) continue;\n const sim = distanceToSimilarity(hit.distance);\n if (sim >= threshold && (!best || sim > best.sim)) {\n best = { row, sim };\n }\n }\n return best?.row ?? null;\n }\n\n /**\n * Semantic (and optional hybrid / MMR / rerank / graph) search over stored memories.\n * Pass `{ explain: true }` for enriched ranking diagnostics.\n *\n * @param options - Query text plus optional `topK` (default 5), `threshold`,\n * `filter`, `hybrid`, `mmr`, `rerank`, `includeGraph`, `explain`.\n * See {@link RecallOptions}.\n * @returns Ranked {@link RecallResult}[] normally, or {@link RecallExplainResponse}\n * when `explain: true`.\n */\n async recall(options: RecallOptions & { explain: true }): Promise<RecallExplainResponse>;\n /**\n * @param options - Recall options with `explain` omitted or `false`.\n * @returns Ranked memory hits.\n */\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 if (\n hybridWeights &&\n keywordSignal === \"disabled\" &&\n !warnedHybridNoKeyword\n ) {\n warnedHybridNoKeyword = true;\n warnLogger.warn(\n \"hybrid search requested but no keyword channel is available; using semantic-only results.\",\n );\n }\n\n const tRank = performance.now();\n let results = [...byId.values()].sort((a, b) => {\n const diff = b.similarity - a.similarity;\n if (diff !== 0) return diff;\n // Deterministic tie-breaker for equal similarity scores.\n return a.id.localeCompare(b.id);\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 let mmrApplied = false;\n if (mmrLambda !== null) {\n // Select exactly `topK` diversified results from the over-fetched\n // candidate pool. (Previously we selected `topK * 2`, which could\n // no-op diversification when candidates were <= topK*2.)\n mmrApplied = results.length > topK;\n if (mmrApplied) {\n results = applyMmr(results, topK, mmrLambda);\n rankingReason = `MMR(lambda=${mmrLambda})`;\n } else {\n rankingReason = `MMR(lambda=${mmrLambda})(skipped:insufficient_candidates)`;\n }\n }\n\n if (options.rerank === true && !this.reranker && !warnedRerankNoProvider) {\n warnedRerankNoProvider = true;\n warnLogger.warn(\n \"rerank is enabled but no reranker provider is configured; using identity order.\",\n );\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 (options.includeGraph === true && this.graph) {\n const tGraph = performance.now();\n // Batch hydration for lower end-to-end latency.\n await Promise.all(\n serialized.map(async (hit) => {\n hit.related = await this.hydrateRelated(hit.id);\n }),\n );\n trace.mark(\"databaseReadMs\", performance.now() - tGraph);\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\" : mmrApplied ? \"enabled\" : \"disabled\",\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 /**\n * Run multiple recalls sequentially under one parent telemetry span.\n *\n * @param queries - Non-empty list of recall options (`explain` is forced off).\n * @returns One hit array per query, same order.\n * @throws {ValidationError} If `queries` is empty.\n */\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 /**\n * Compress the newest active memories for an agent into one summary memory\n * and archive the sources. Requires an `llm` (or custom `compression`) at\n * construction — typed only on `Wolbarg<true>`.\n *\n * @param options - `agent` required; optional `limit` (default 50, min 2).\n * See {@link CompressOptions}.\n * @returns Summary record plus archived source ids. See {@link CompressResult}.\n * @throws {ProviderNotConfiguredError} If no LLM/compression provider is set.\n * @throws {ValidationError} If fewer than 2 active memories exist for the agent.\n */\n async compress(\n this: Wolbarg<true>,\n options: CompressOptions,\n ): Promise<CompressResult> {\n return this.runCompress(options);\n }\n\n /** @internal Runs compress for both typed and untyped call sites. */\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 txResult = await storage.withTransaction(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 sourceIds = [...records.map((r) => r.id)].sort();\n const archivedIds = await storage.archiveMemories(\n sourceIds,\n organization,\n summaryId,\n timestamp,\n );\n\n if (archivedIds.length < 2) {\n throw new ValidationError(\n \"compress lost a concurrency race: fewer than 2 source memories remained active\",\n );\n }\n\n return {\n summary: toMemoryRecord(summaryRow),\n archivedIds,\n };\n });\n\n trace.mark(\"databaseWriteMs\", performance.now() - tWrite);\n return txResult;\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 this.emitChange({\n event: \"compress\",\n organization,\n agent: options.agent.trim(),\n memoryId: [result.summary.id, ...result.archivedIds],\n timestamp,\n sessionId: this.telemetry.sessionId,\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"compress\", error);\n }\n }\n\n /**\n * Ingest a document (path, URL, Buffer, or text), chunk it, embed chunks, and\n * store each as a memory. Images use optional `ocr` / `vision` providers from\n * the constructor.\n *\n * @param options - `agent`, `source`, optional chunking overrides / metadata.\n * See {@link IngestOptions}.\n * @returns Counts and created memory ids. See {@link IngestResult}.\n * @throws {ValidationError} If no text can be extracted or chunking yields zero chunks.\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 contentHash: this.memoryDedupe.enabled\n ? hashMemoryContent(chunk.text)\n : null,\n }));\n\n let rows;\n if (this.memoryDedupe.enabled) {\n const memories: RememberResult[] = [];\n for (let i = 0; i < chunks.length; i += 1) {\n const result = await this.rememberOne(\n {\n agent: options.agent.trim(),\n content: { text: chunks[i]!.text },\n metadata: {\n ...baseMeta,\n ingest: true,\n chunkIndex: chunks[i]!.index,\n chunkCount: chunks.length,\n sourceFilename: loaded.filename ?? null,\n },\n },\n trace,\n );\n memories.push(result);\n }\n const result = {\n memories,\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 this.emitChange({\n event: \"ingest\",\n organization,\n agent: options.agent.trim(),\n memoryId: result.memories.map((m) => m.id),\n timestamp,\n sessionId: this.telemetry.sessionId,\n });\n return result;\n }\n\n 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 this.emitChange({\n event: \"ingest\",\n organization,\n agent: options.agent.trim(),\n memoryId: result.memories.map((m) => m.id),\n timestamp,\n sessionId: this.telemetry.sessionId,\n });\n return result;\n } catch (error) {\n trace.failure(error, { agentId: options.agent });\n throw wrapOperationError(\"ingest\", error);\n }\n }\n\n /**\n * Link two memories in the optional graph layer with a typed relation edge.\n *\n * @param fromId - Source memory id.\n * @param toId - Target memory id.\n * @param relation - Edge label (e.g. `\"supports\"`, `\"caused_by\"`).\n * @param metadata - Optional edge properties stored on the graph provider.\n * @throws {ProviderNotConfiguredError} When no `graph` was configured.\n * @throws {ValidationError} On empty ids/relation.\n */\n async linkMemories(\n fromId: string,\n toId: string,\n relation: string,\n metadata?: Record<string, unknown>,\n ): Promise<void> {\n const trace = this.telemetry.start(\"linkMemories\");\n try {\n await this.requireReady();\n const graph = this.requireGraph(\"linkMemories\");\n assertNonEmptyString(fromId, \"fromId\");\n assertNonEmptyString(toId, \"toId\");\n assertNonEmptyString(relation, \"relation\");\n const tGraph = performance.now();\n await graph.linkMemories(\n fromId.trim(),\n toId.trim(),\n relation.trim(),\n metadata,\n );\n trace.mark(\"databaseWriteMs\", performance.now() - tGraph);\n trace.success({\n provider: graph.name,\n memoryIds: [fromId.trim(), toId.trim()],\n extra: { relation: relation.trim() },\n });\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"linkMemories\", error);\n }\n }\n\n /**\n * Traverse related memories via the optional graph layer.\n * Neighbor stubs from the graph are re-hydrated from SQL storage when available.\n *\n * @param memoryId - Seed memory id.\n * @param options - Optional `relation`, `direction`, `depth`, `limit`.\n * See {@link GetRelatedOptions}.\n * @returns Related {@link MemoryRecord} list (may be empty).\n * @throws {ProviderNotConfiguredError} When no `graph` was configured.\n */\n async getRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const trace = this.telemetry.start(\"getRelated\");\n try {\n await this.requireReady();\n const graph = this.requireGraph(\"getRelated\");\n assertNonEmptyString(memoryId, \"memoryId\");\n\n let validatedOptions = options;\n if (options?.depth !== undefined) {\n if (!Number.isFinite(options.depth)) {\n throw new ConfigurationError(\"graph.depth must be a finite number\");\n }\n if (options.depth < 1) {\n throw new ConfigurationError(\"graph.depth must be >= 1\");\n }\n if (options.depth > 16) {\n validatedOptions = { ...options, depth: 16 };\n }\n }\n const tGraph = performance.now();\n const related = await this.hydrateRelated(\n memoryId.trim(),\n validatedOptions,\n );\n trace.mark(\"databaseReadMs\", performance.now() - tGraph);\n trace.success({\n provider: graph.name,\n memoryIds: [memoryId.trim(), ...related.map((r) => r.id)],\n returnedCount: related.length,\n });\n return related;\n } catch (error) {\n trace.failure(error);\n throw wrapOperationError(\"getRelated\", error);\n }\n }\n\n /**\n * Delete memories by id or by agent filter. Cascades graph nodes/edges when\n * a graph provider is configured.\n *\n * @param options - Either `{ id }` or `{ filter: { agent } }`. See {@link ForgetOptions}.\n * @returns Number of memories deleted.\n * @throws {ValidationError} If neither `id` nor `filter.agent` is provided.\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 deletedIds: string[] = [];\n const deleted = await this.withWriteLock(async () => {\n if (\"id\" in options && options.id !== undefined) {\n assertNonEmptyString(options.id, \"id\");\n const id = options.id.trim();\n const ok = await storage.deleteMemoryById(id, organization);\n if (ok) deletedIds.push(id);\n return ok ? 1 : 0;\n }\n\n if (\"filter\" in options && options.filter?.agent) {\n assertNonEmptyString(options.filter.agent, \"filter.agent\");\n const rows = await storage.listMemories({\n organization,\n agent: options.filter.agent.trim(),\n includeArchived: true,\n });\n for (const row of rows) deletedIds.push(row.id);\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 if (deleted > 0 && this.graph && deletedIds.length > 0) {\n const tGraph = performance.now();\n for (const id of deletedIds) {\n await this.graph.deleteMemory(id);\n }\n trace.mark(\"databaseWriteMs\", performance.now() - tGraph);\n }\n\n trace.success({\n provider: storage.name,\n returnedCount: deleted,\n memoryIds: deletedIds.length > 0 ? deletedIds : null,\n filters: \"filter\" in options ? options.filter : null,\n agentId:\n \"filter\" in options ? options.filter?.agent?.trim() ?? null : null,\n extra: this.graph\n ? { graphCascade: deletedIds.length }\n : undefined,\n });\n if (deleted > 0) {\n this.emitChange({\n event: \"forget\",\n organization,\n agent:\n (\"filter\" in options && options.filter?.agent?.trim()) ||\n (\"id\" in options ? \"*\" : \"*\"),\n memoryId:\n \"id\" in options && options.id ? options.id.trim() : [],\n timestamp: nowIso(),\n sessionId: this.telemetry.sessionId,\n });\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 /**\n * Return the audit/history timeline for a single memory.\n *\n * @param options - `{ id }` of the memory. See {@link HistoryOptions}.\n * @returns Memory record plus ordered {@link HistoryEvent} list.\n * @throws {MemoryNotFoundError} If the id is unknown.\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 /**\n * Aggregate counts for this organization (active / archived / agents / etc.).\n *\n * @returns {@link StatsResult} snapshot.\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 /**\n * Delete all memories for this organization (optionally scoped by agent).\n * Cascades graph cleanup when a graph provider is configured.\n *\n * @param options - Optional `{ agent }` scope. See {@link ClearOptions}.\n * @returns Number of memories deleted.\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 if (this.graph) {\n const rows = await storage.listMemories({\n organization,\n includeArchived: true,\n });\n for (const row of rows) {\n await this.graph.deleteMemory(row.id);\n }\n }\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 /**\n * Create an immutable named checkpoint of the file-backed SQLite memory DB\n * (and SQLite graph snapshot when applicable).\n *\n * @param name - Checkpoint name (unique).\n * @param options - Optional metadata. See {@link CheckpointOptions}.\n * @returns {@link CheckpointInfo} for the new checkpoint.\n * @throws {ProviderNotConfiguredError} Without a checkpoint provider / file DB.\n * @throws {GraphCheckpointNotSupportedError} For Neo4j graph backends.\n */\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 this.assertGraphCheckpointSupported(\"checkpoint\");\n const tCheckpoint = performance.now();\n const meta = await provider.checkpoint(name, source, options);\n try {\n await this.snapshotGraphAlongside(meta.snapshotPath, \"checkpoint\");\n } catch (error) {\n // Avoid leaving a partially-written graph sidecar directory behind.\n const sidecar = this.graphSnapshotDir(meta.snapshotPath);\n if (fs.existsSync(sidecar)) {\n fs.rmSync(sidecar, { recursive: true, force: true });\n }\n throw error;\n }\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 /**\n * Restore the memory database from a named checkpoint (replaces the live DB file).\n *\n * @param name - Checkpoint name previously created with {@link Wolbarg.checkpoint}.\n * @returns {@link CheckpointInfo} of the restored checkpoint.\n */\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 graphClosed = await this.closeGraphForSnapshot();\n const tRollback = performance.now();\n const meta = await provider.rollback(name, target);\n await this.restoreGraphAlongside(meta.snapshotPath, \"rollback\");\n if (graphClosed) {\n await this.graph?.open();\n }\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 /**\n * Delete a named checkpoint from disk / the checkpoint store.\n *\n * @param name - Checkpoint name.\n * @returns `true` if a checkpoint was removed.\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 existing = await provider.getCheckpoint(name);\n const tDelete = performance.now();\n const removed = await provider.deleteCheckpoint(name);\n if (removed && existing) {\n const sidecar = this.graphSnapshotDir(existing.snapshotPath);\n if (fs.existsSync(sidecar)) {\n fs.rmSync(sidecar, { recursive: true, force: true });\n }\n }\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 /**\n * List all known checkpoints for this instance.\n *\n * @returns Array of {@link CheckpointInfo} (may be empty).\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 /**\n * Look up a single checkpoint by name.\n *\n * @param name - Checkpoint name.\n * @returns {@link CheckpointInfo} or `null` if missing.\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 /**\n * Export the memory database to a portable SQLite + manifest bundle\n * (includes SQLite graph sidecar when applicable).\n *\n * @param exportPath - Destination file path for the export bundle.\n * @returns {@link ExportResult} with path, size, and timestamp.\n */\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 this.assertGraphCheckpointSupported(\"export\");\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 this.embedding?.model,\n this.embeddingDimensions ?? undefined,\n );\n await this.snapshotGraphAlongside(result.path, \"export\");\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 /**\n * Import a previously exported memory database, replacing the current file.\n * Closes and reopens storage around the swap.\n *\n * @param exportPath - Path to a bundle produced by {@link Wolbarg.export}.\n * @returns {@link ImportResult} with restored path and timestamp.\n */\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 // Fail fast before closing storage/graph for snapshots.\n this.assertGraphCheckpointSupported(\"import\");\n const target = this.requireMemoryDbPath();\n if (this.storage) {\n await this.storage.close();\n storageClosed = true;\n }\n const graphClosed = await this.closeGraphForSnapshot();\n const result: MemoryImportResult = await this.transfer.importFrom(\n exportPath,\n target,\n {\n organization: this.organization ?? undefined,\n embeddingModel: this.embedding?.model,\n embeddingDimensions: this.embeddingDimensions ?? undefined,\n },\n );\n await this.restoreGraphAlongside(result.path, \"import\");\n if (graphClosed) {\n await this.graph?.open();\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 /**\n * Flush pending telemetry writes (useful in tests / before process exit).\n *\n * @returns Resolves when the telemetry provider has flushed.\n */\n async flushTelemetry(): Promise<void> {\n await this.telemetry.flush();\n }\n\n /**\n * Session id for this SDK instance (attached to telemetry traces and change events).\n */\n get sessionId(): string {\n return this.telemetry.sessionId;\n }\n\n /**\n * Optional process-wide lock for SQLite read-modify-write (dedupe upsert).\n * Plain inserts must NOT take this lock — the provider coalesces concurrent\n * insertMemory calls under a single BEGIN IMMEDIATE for multi-writer throughput.\n */\n private withWriteLock<T>(\n fn: () => Promise<T>,\n options?: { exclusive?: boolean },\n ): Promise<T> {\n if (\n options?.exclusive &&\n this.storage?.name === \"sqlite\"\n ) {\n return this.writeMutex.runExclusive(fn);\n }\n return fn();\n }\n\n /**\n * Close storage, graph, telemetry, checkpoints, and subscribe backends.\n * The instance can be discarded afterward; construct a new one to reopen.\n *\n * @returns Resolves when all providers have closed (errors are swallowed per-provider).\n */\n async close(): Promise<void> {\n if (this.storage) {\n this.telemetry.emitShutdown(this.storage.name);\n }\n await this.subscribeBackend?.close().catch(() => undefined);\n await this.pgListenBackend?.close().catch(() => undefined);\n this.subscribeBackend = null;\n this.pgListenBackend = null;\n await this.telemetry.close().catch(() => undefined);\n await this.checkpointProvider?.close().catch(() => undefined);\n await this.graph?.close().catch(() => undefined);\n this.graph = null;\n if (this.storage) {\n await this.storage.close();\n }\n this.storage = null;\n this.embedding = null;\n this.rawEmbedding = 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 {@link Wolbarg.ready} / {@link Wolbarg.init} has completed successfully. */\n get isInitialized(): boolean {\n return this.initialized;\n }\n\n /** Ensure {@link Wolbarg.ready} completed and core providers are available. */\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 /** Reject embeddings whose dimensionality differs from the initialized model. */\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 /** Return the configured checkpoint provider or throw {@link ProviderNotConfiguredError}. */\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 /** Return the configured graph provider or throw with a setup hint for `method`. */\n private requireGraph(method: string): GraphProvider {\n if (!this.graph) {\n throw new ProviderNotConfiguredError(\n \"graph\",\n method,\n \"pass graph: sqliteGraph({ path }) or graph: neo4jGraph({ url, username, password })\",\n );\n }\n return this.graph;\n }\n\n /** Throw when graph checkpoint pairing is requested on a non-file-backed graph backend. */\n private assertGraphCheckpointSupported(operation: string): void {\n if (!this.graph) return;\n if (!this.graph.supportsFileSnapshot()) {\n throw new GraphCheckpointNotSupportedError(this.graph.name, operation);\n }\n }\n\n /** Directory path where a graph file snapshot is stored alongside a memory checkpoint. */\n private graphSnapshotDir(alongsidePath: string): string {\n return `${alongsidePath}.graph`;\n }\n\n /** Close the graph provider before copying files; returns whether a close occurred. */\n private async closeGraphForSnapshot(): Promise<boolean> {\n if (!this.graph || !this.graph.supportsFileSnapshot()) return false;\n await this.graph.close();\n return true;\n }\n\n /** Copy the SQLite graph database next to a memory checkpoint directory. */\n private async snapshotGraphAlongside(\n alongsidePath: string,\n operation: string,\n ): Promise<void> {\n if (!this.graph) return;\n if (!this.graph.supportsFileSnapshot()) {\n throw new GraphCheckpointNotSupportedError(this.graph.name, operation);\n }\n const dataPath = this.graph.getDataPath();\n if (!dataPath) return;\n const dest = this.graphSnapshotDir(alongsidePath);\n // Close briefly so files are consistent on Windows.\n await this.graph.close();\n try {\n if (fs.existsSync(dest)) {\n fs.rmSync(dest, { recursive: true, force: true });\n }\n if (fs.existsSync(dataPath)) {\n const stat = fs.statSync(dataPath);\n if (stat.isDirectory()) {\n fs.cpSync(dataPath, dest, { recursive: true });\n } else {\n fs.mkdirSync(dest, { recursive: true });\n fs.cpSync(dataPath, path.join(dest, path.basename(dataPath)));\n // Copy sibling WAL/SHM files if present (SQLite graph file).\n const parent = path.dirname(dataPath);\n const base = path.basename(dataPath);\n for (const entry of fs.readdirSync(parent)) {\n if (entry === base) continue;\n if (entry.startsWith(base)) {\n fs.cpSync(\n path.join(parent, entry),\n path.join(dest, entry),\n { recursive: true },\n );\n }\n }\n }\n }\n } finally {\n await this.graph.open();\n }\n }\n\n /** Restore a graph file snapshot written by {@link snapshotGraphAlongside}. */\n private async restoreGraphAlongside(\n alongsidePath: string,\n operation: string,\n ): Promise<void> {\n if (!this.graph) return;\n if (!this.graph.supportsFileSnapshot()) {\n throw new GraphCheckpointNotSupportedError(this.graph.name, operation);\n }\n const dataPath = this.graph.getDataPath();\n if (!dataPath) return;\n const src = this.graphSnapshotDir(alongsidePath);\n if (!fs.existsSync(src)) {\n // Older checkpoints without graph snapshot — leave graph empty/as-is.\n return;\n }\n if (fs.existsSync(dataPath)) {\n fs.rmSync(dataPath, { recursive: true, force: true });\n }\n const entries = fs.readdirSync(src);\n if (entries.length === 1 && entries[0] === path.basename(dataPath)) {\n fs.mkdirSync(path.dirname(dataPath), { recursive: true });\n fs.cpSync(path.join(src, entries[0]!), dataPath, { recursive: true });\n } else {\n fs.mkdirSync(path.dirname(dataPath), { recursive: true });\n fs.cpSync(src, dataPath, { recursive: true });\n }\n }\n\n /** Run graph traversal then re-hydrate stub records from storage when rows exist. */\n private async hydrateRelated(\n memoryId: string,\n options?: GetRelatedOptions,\n ): Promise<MemoryRecord[]> {\n const graph = this.requireGraph(\"getRelated\");\n const related = await graph.getRelated(memoryId, options);\n const { storage, organization } = await this.requireReady();\n const rows = await Promise.all(\n related.map((stub) => storage.getMemoryById(stub.id, organization)),\n );\n const out: MemoryRecord[] = [];\n for (let i = 0; i < related.length; i += 1) {\n const stub = related[i]!;\n const row = rows[i]!;\n out.push(row ? toMemoryRecord(row) : stub);\n }\n return out;\n }\n\n /** Resolve the on-disk SQLite memory database path (throws for Postgres / `:memory:`). */\n private requireMemoryDbPath(): string {\n if (this.storage && !(this.storage instanceof SqliteStorageProvider)) {\n throw new ConfigurationError(\n \"This operation requires a file-backed SQLite database (checkpoints / export-import are not supported for PostgreSQL).\",\n {\n suggestion:\n 'Use database: { provider: \"sqlite\", url: \"./memory.db\" }',\n },\n );\n }\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/**\n * Preferred factory — equivalent to `new Wolbarg(options)`.\n *\n * @param options - Full {@link WolbargOptions}. Pass custom provider instances\n * (`embedding`, `llm`, `storage`, `graph`, …) or factory helpers\n * (`openaiEmbedding`, `openaiLlm`, `sqliteGraph`, …). See constructor docs\n * on {@link Wolbarg} for every option field.\n * @returns A configured {@link Wolbarg} instance (call {@link Wolbarg.ready} before use).\n *\n * @example\n * ```ts\n * const memory = wolbarg({\n * organization: \"acme\",\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 * llm: openaiLlm({\n * apiKey: process.env.OPENAI_API_KEY!,\n * model: \"gpt-4o-mini\",\n * }),\n * });\n * await memory.ready();\n * ```\n */\nexport function wolbarg(options: WolbargOptions): Wolbarg {\n return new Wolbarg(options as never);\n}\n\n/**\n * Extract string tags from memory metadata for telemetry (`tags` string or string[]).\n * @param metadata - Arbitrary metadata object.\n * @returns Normalized tag list or `null`.\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\n/**\n * @param agents - Agent ids from a result set.\n * @returns The shared agent id if every entry matches, otherwise `null`.\n */\nfunction commonAgent(agents: string[]): string | null {\n const first = agents[0];\n return first && agents.every((agent) => agent === first) ? first : null;\n}\n\n/**\n * @param metadata - Metadata objects from recalled memories.\n * @returns Union of all tags, or `null` if none.\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 * Build filters with the {@link meta} helper or compose `{ field, op }` nodes directly.\n * Filters compile to SQL JSON predicates when possible ({@link compileMetadataFilterToSql}).\n *\n * @example\n * ```ts\n * import { meta } from \"wolbarg/filters\";\n *\n * const filter = meta.and(\n * meta.eq(\"category\", \"billing\"),\n * meta.gte(\"priority\", 2),\n * );\n * ```\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/** Fluent builders for {@link MetadataFilter} AST nodes. */\nexport const meta = {\n /** Field equals value (strict equality). */\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, telemetry, checkpoints, and graph providers (v0.5.5).\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 { SqliteGraphProvider } from \"../graph/providers/sqlite-graph.js\";\nimport { Neo4jGraphProvider } from \"../graph/providers/neo4j.js\";\nimport type { GraphProvider } from \"../graph/types.js\";\nimport { ConfigurationError } from \"../errors/index.js\";\nimport type { WolbargOptions } from \"../core/options.js\";\nimport { Wolbarg } from \"../core/wolbarg.js\";\n\n/**\n * Create a SQLite {@link StorageProvider} from a filesystem path or `:memory:`.\n *\n * @param connectionString - Absolute/relative `.db` path, or `\":memory:\"` for ephemeral.\n * @returns Ready-to-pass storage provider (Wolbarg still calls `open()` via `ready()`).\n *\n * @example\n * ```ts\n * wolbarg({ organization: \"acme\", storage: sqlite(\"./memory.db\"), embedding: ... })\n * ```\n */\nexport function sqlite(\n connectionString: string,\n options?: { concurrency?: import(\"../types/index.js\").ConcurrencyConfig },\n): StorageProvider {\n return new SqliteStorageProvider({\n connectionString,\n concurrency: options?.concurrency,\n });\n}\n\n/**\n * Create a SQLite storage **config object** (for `database` / `init` options).\n *\n * @param connectionString - Path or `:memory:`.\n * @returns `{ provider: \"sqlite\", connectionString, url }`.\n */\nexport function sqliteConfig(\n connectionString: string,\n): SqliteDatabaseConfig {\n return {\n provider: \"sqlite\",\n connectionString,\n url: connectionString,\n };\n}\n\n/**\n * Create a PostgreSQL {@link StorageProvider}. Requires optional peer `pg`.\n *\n * @param options - Connection string, or an object with:\n * - `connectionString` — Postgres URL\n * - `maxPoolSize` — optional pool size\n * - `durableWrites` — default `true`; set `false` for higher write throughput (async commit)\n * @returns Postgres storage provider instance.\n *\n * @example\n * ```ts\n * postgres(process.env.DATABASE_URL!)\n * postgres({ connectionString: process.env.DATABASE_URL!, maxPoolSize: 10 })\n * ```\n */\nexport function postgres(\n options:\n | string\n | {\n connectionString: string;\n maxPoolSize?: number;\n /** Default true. Set false for higher write throughput (async commit). */\n durableWrites?: boolean;\n },\n): StorageProvider {\n const opts =\n typeof options === \"string\"\n ? { connectionString: options }\n : options;\n return new PostgresStorageProvider(opts);\n}\n\n/**\n * Create a PostgreSQL storage **config object**.\n *\n * @param connectionString - Postgres connection URL.\n * @param options.maxPoolSize - Optional pool size.\n * @param options.durableWrites - Optional durability flag (default true).\n * @returns `{ provider: \"postgres\", connectionString, url, ... }`.\n */\nexport function postgresConfig(\n connectionString: string,\n options?: { maxPoolSize?: number; durableWrites?: boolean },\n): PostgresDatabaseConfig {\n return {\n provider: \"postgres\",\n connectionString,\n url: connectionString,\n ...options,\n };\n}\n\n/**\n * Create a SQLite {@link TelemetryProvider} for an independent event database.\n *\n * @param url - Path to the telemetry SQLite file (separate from memory DB).\n * @returns Telemetry provider for `telemetry:` constructor option.\n */\nexport function sqliteTelemetry(url: string): TelemetryProvider {\n return new SqliteTelemetryProvider({ url });\n}\n\n/**\n * Create a SQLite {@link CheckpointProvider}.\n *\n * @param directory - Optional directory for checkpoint files (default under cwd).\n * @returns Checkpoint provider for `checkpoint:` constructor option.\n */\nexport function sqliteCheckpoint(directory?: string): CheckpointProvider {\n return new SqliteCheckpointProvider({ directory });\n}\n\n/**\n * Create an embedded SQLite {@link GraphProvider} (file-backed, local/dev).\n *\n * @param options.path - Filesystem path for the graph SQLite database\n * (separate from the memory DB).\n * @returns Graph provider for `graph:` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * graph: sqliteGraph({ path: \"./graph.db\" })\n * ```\n */\nexport function sqliteGraph(options: { path: string }): GraphProvider {\n return new SqliteGraphProvider(options);\n}\n\n/**\n * Create a Neo4j {@link GraphProvider} (networked). Requires optional peer `neo4j-driver`.\n *\n * @param options.url - Bolt URL, e.g. `neo4j://localhost:7687` or `bolt://…`.\n * @param options.username - Neo4j username.\n * @param options.password - Neo4j password.\n * @param options.database - Optional database name (Neo4j 4+ multi-DB).\n * @returns Graph provider for `graph:` in {@link WolbargOptions}.\n *\n * @example\n * ```ts\n * graph: neo4jGraph({\n * url: \"neo4j://localhost:7687\",\n * username: \"neo4j\",\n * password: process.env.NEO4J_PASSWORD!,\n * })\n * ```\n */\nexport function neo4jGraph(options: {\n url: string;\n username: string;\n password: string;\n database?: string;\n}): GraphProvider {\n return new Neo4jGraphProvider(options);\n}\n\n/**\n * Create a {@link TelemetryProvider} from {@link TelemetryConfig}.\n * Currently only SQLite telemetry databases are implemented.\n *\n * @param config - Telemetry config with `database.provider` and `database.url`.\n * @returns SQLite telemetry provider instance.\n * @throws {ConfigurationError} If provider is not `\"sqlite\"` or url is missing.\n */\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. Telemetry supports sqlite or postgres only — not kuzu/neo4j.`,\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 factory. Equivalent to `new Wolbarg(options)`.\n *\n * @param options - Full {@link WolbargOptions} (providers, database, embedding, optional llm).\n * @returns Configured {@link Wolbarg} instance — call `ready()` before use.\n *\n * @example\n * ```ts\n * const ctx = wolbarg({\n * organization: \"acme\",\n * database: sqliteConfig(\"./memory.db\"),\n * embedding: openaiEmbedding({ apiKey: \"...\", model: \"text-embedding-3-small\" }),\n * });\n * await ctx.ready();\n * ```\n */\nexport function wolbarg(options: WolbargOptions): Wolbarg {\n return new Wolbarg(options as never);\n}\n\n/** @deprecated Alias of {@link wolbarg}. */\nexport const createWolbarg = wolbarg;\n","/**\n * Keyword / BM25 search providers for hybrid recall.\n *\n * Use these when you want lexical (BM25) scoring alongside semantic vector search.\n * Pass a {@link KeywordSearchProvider} to Wolbarg retrieval config, or rely on\n * native FTS when the storage backend supports it.\n *\n * @example\n * ```ts\n * import { bm25 } from \"wolbarg/keyword\";\n *\n * const keyword = bm25({ k1: 1.2, b: 0.75 });\n * const hits = await keyword.search(\"billing issue\", documents, 10);\n * ```\n */\n\n/** A single keyword search hit with memory id and BM25 score. */\nexport interface KeywordSearchHit {\n /** Memory UUID that matched the query. */\n memoryId: string;\n /** BM25 relevance score (higher is better). */\n score: number;\n}\n\n/** Document passed to keyword search — typically memory id + text body. */\nexport interface KeywordDocument {\n /** Memory UUID. */\n id: string;\n /** Searchable text content. */\n text: string;\n}\n\n/**\n * Contract for keyword / lexical search backends.\n *\n * Implement this interface to plug in a custom BM25, Elasticsearch, or FTS adapter.\n * Wolbarg calls {@link KeywordSearchProvider.search} during hybrid recall when no\n * native storage keyword index is available.\n *\n * @example Custom provider\n * ```ts\n * const myKeyword: KeywordSearchProvider = {\n * name: \"my-fts\",\n * async search(query, documents, topK) {\n * // score documents and return topK hits\n * return [{ memoryId: documents[0]!.id, score: 1.0 }];\n * },\n * };\n * ```\n */\nexport interface KeywordSearchProvider {\n /** Provider identifier (e.g. `\"bm25\"`, `\"fts5\"`). */\n readonly name: string;\n /**\n * Rank documents by lexical relevance to `query`.\n * @param query - User search string.\n * @param documents - Candidate memories to score.\n * @param topK - Maximum hits to return.\n * @returns Hits sorted by score descending.\n */\n search(\n query: string,\n documents: KeywordDocument[],\n topK: number,\n ): Promise<KeywordSearchHit[]>;\n}\n\n/**\n * In-memory Okapi BM25 keyword search.\n *\n * Suitable for small corpora or when storage has no native FTS. Tunable via\n * {@link https://en.wikipedia.org/wiki/Okapi_BM25 | BM25} parameters `k1` and `b`.\n */\nexport class Bm25KeywordSearchProvider implements KeywordSearchProvider {\n readonly name = \"bm25\";\n private readonly k1: number;\n private readonly b: number;\n\n /**\n * @param options - BM25 tuning parameters.\n * @param options.k1 - Term frequency saturation (default `1.2`).\n * @param options.b - Length normalization (default `0.75`).\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 /** @inheritdoc */\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\n/** Tokenize text for BM25 (Unicode letters/numbers, min length 2). */\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/**\n * Factory for the default in-memory BM25 keyword provider.\n *\n * @param options - Optional BM25 tuning (`k1`, `b`).\n * @returns A {@link KeywordSearchProvider} ready for hybrid recall.\n *\n * @example\n * ```ts\n * const keyword = bm25();\n * ```\n */\nexport function bm25(options?: { k1?: number; b?: number }): KeywordSearchProvider {\n return new Bm25KeywordSearchProvider(options);\n}\n","/**\n * Reranker provider abstractions for second-stage recall ranking.\n *\n * Rerankers reorder vector/keyword candidates using cross-encoders or LLM scoring.\n * Pass a {@link RerankerProvider} to Wolbarg retrieval config or call factories\n * directly in custom pipelines.\n *\n * @example\n * ```ts\n * import { cohereReranker } from \"wolbarg/rerank\";\n *\n * const reranker = cohereReranker({ apiKey: process.env.COHERE_API_KEY! });\n * const hits = await reranker.rerank(query, documents, 5);\n * ```\n */\n\n/** Document passed to a reranker — memory id + searchable text. */\nexport interface RerankDocument {\n /** Memory UUID. */\n id: string;\n /** Text body used for relevance scoring. */\n text: string;\n}\n\n/** A reranked hit with relevance score. */\nexport interface RerankHit {\n /** Memory UUID. */\n id: string;\n /** Relevance score (higher is better; provider-specific scale). */\n score: number;\n}\n\n/**\n * Contract for cross-encoder and API rerankers.\n *\n * Implement this interface to plug in Cohere, Jina, local cross-encoders, or\n * custom scoring. On failure, built-in HTTP adapters fall back to identity order\n * so recall never returns zero hits.\n *\n * @example Custom provider\n * ```ts\n * const myReranker: RerankerProvider = {\n * name: \"local-ce\",\n * async rerank(query, documents, topK) {\n * return documents.slice(0, topK).map((d, i) => ({ id: d.id, score: 1 - i * 0.1 }));\n * },\n * };\n * ```\n */\nexport interface RerankerProvider {\n /** Provider identifier (e.g. `\"cohere\"`, `\"openai\"`). */\n readonly name: string;\n /**\n * Reorder documents by query relevance.\n * @param query - User search string.\n * @param documents - Candidate memories to rerank.\n * @param topK - Maximum hits to return.\n * @returns Hits sorted by score descending.\n */\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 const hits = parsed.slice(0, topK);\n // Some providers return 200 with an unexpected shape; in that case\n // `parseResults` can legitimately return `[]`. Fallback to identity\n // order so recall never collapses to zero hits.\n if (hits.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 hits;\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 * Generic cross-encoder reranker for OpenAI-compatible `/rerank` endpoints.\n *\n * Falls back to identity order when the HTTP call fails or returns an unexpected shape.\n *\n * @param options - Remote endpoint configuration.\n * @param options.baseUrl - API base URL (appends `/rerank`).\n * @param options.apiKey - Bearer token for authorization.\n * @param options.model - Optional model name sent in the request body.\n * @param options.timeoutMs - Request timeout (default `30000`).\n */\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\n/**\n * Jina AI reranker (`jina-reranker-v2-base-multilingual` by default).\n *\n * @param options.apiKey - Jina API key.\n * @param options.model - Model id override.\n * @param options.timeoutMs - Request timeout (default `30000`).\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\n/**\n * Cohere Rerank v3.5 API adapter.\n *\n * @param options.apiKey - Cohere API key.\n * @param options.model - Model id (default `\"rerank-v3.5\"`).\n * @param options.timeoutMs - Request timeout (default `30000`).\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/**\n * BGE-style remote reranker for self-hosted endpoints with Jina/Cohere response shape.\n *\n * @param options.apiKey - Bearer token for the remote service.\n * @param options.baseUrl - Service base URL (appends `/rerank`).\n * @param options.model - Optional model name.\n * @param options.timeoutMs - Request timeout (default `30000`).\n */\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 dedicated rerank API key required).\n *\n * Scores query–document relevance via JSON-mode chat completions and reorders hits.\n * Falls back to identity order on parse or network errors.\n *\n * @param options.apiKey - OpenAI API key.\n * @param options.model - Chat model (default `\"gpt-4.1-mini\"`).\n * @param options.baseUrl - API base (default `\"https://api.openai.com/v1\"`).\n * @param options.timeoutMs - Request timeout (default `60000`).\n *\n * @example\n * ```ts\n * const reranker = openaiReranker({ apiKey: process.env.OPENAI_API_KEY! });\n * ```\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 providers — extract text from images during ingest.\n *\n * OCR is used when ingesting image files without accompanying text. Install the\n * optional peer `tesseract.js` before calling {@link tesseract}.\n *\n * @example\n * ```ts\n * import { tesseract } from \"wolbarg/ocr\";\n *\n * const ocr = tesseract();\n * const { text } = await ocr.recognize(imageBuffer, \"image/png\");\n * ```\n */\n\nimport { ConfigurationError } from \"../errors/index.js\";\n\n/** Result of optical character recognition on an image. */\nexport interface OcrResult {\n /** Extracted plain text (may be empty if OCR finds nothing). */\n text: string;\n}\n\n/**\n * Contract for OCR backends.\n *\n * Implement this interface to plug in Google Vision, Azure OCR, or another engine.\n * Wolbarg calls {@link OCRProvider.recognize} during ingest when a document parser\n * marks the source as an image.\n *\n * @example Custom provider\n * ```ts\n * const myOcr: OCRProvider = {\n * name: \"cloud-ocr\",\n * async recognize(image, mimeType) {\n * const text = await callMyApi(image, mimeType);\n * return { text };\n * },\n * };\n * ```\n */\nexport interface OCRProvider {\n /** Provider identifier (e.g. `\"tesseract\"`, `\"cloud-ocr\"`). */\n readonly name: string;\n /**\n * Extract text from a raster image buffer.\n * @param image - Raw image bytes.\n * @param mimeType - Optional MIME hint (e.g. `\"image/png\"`).\n * @returns Recognized text.\n */\n recognize(image: Buffer, mimeType?: string): Promise<OcrResult>;\n}\n\n/**\n * Tesseract.js OCR adapter.\n *\n * Requires the optional peer package `tesseract.js`. Throws\n * {@link ConfigurationError} with install instructions when the peer is missing.\n *\n * @returns An {@link OCRProvider} using English (`\"eng\"`) by default.\n *\n * @example\n * ```ts\n * // npm install tesseract.js\n * const ocr = tesseract();\n * const result = await ocr.recognize(buffer);\n * ```\n */\nexport function tesseract(): OCRProvider {\n return {\n name: \"tesseract\",\n async recognize(image: Buffer): Promise<OcrResult> {\n let mod: unknown;\n try {\n mod = await import(\"tesseract.js\" as string);\n } catch (error) {\n throw new ConfigurationError(\n 'OCR provider \"tesseract\" requires the optional peer package \"tesseract.js\". Install it with: npm install tesseract.js',\n {\n cause: error instanceof Error ? error : undefined,\n suggestion: 'npm install tesseract.js',\n operation: \"recognize\",\n },\n );\n }\n\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\n if (!createWorker) {\n throw new ConfigurationError(\n 'OCR provider \"tesseract\" could not find tesseract.js.createWorker. Ensure your tesseract.js version is compatible.',\n );\n }\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 },\n };\n}\n","/**\n * Optional vision providers — captions, descriptions, and entities from images.\n *\n * Vision analysis enriches image ingest when OCR alone is insufficient. Both\n * {@link openaiVision} and {@link geminiVision} use OpenAI-compatible chat\n * endpoints with multimodal messages.\n *\n * @example\n * ```ts\n * import { openaiVision } from \"wolbarg/vision\";\n *\n * const vision = openaiVision({ apiKey: process.env.OPENAI_API_KEY! });\n * const result = await vision.analyze(imageBuffer, \"image/jpeg\");\n * console.log(result.caption, result.entities);\n * ```\n */\n\n/** Structured output from a vision analysis call. */\nexport interface VisionResult {\n /** Short one-line caption. */\n caption: string;\n /** Longer natural-language description. */\n description: string;\n /** Named entities or objects detected in the image. */\n entities: string[];\n}\n\n/**\n * Contract for vision / multimodal analysis backends.\n *\n * Implement this interface to plug in Claude, local VLMs, or custom APIs.\n * Wolbarg merges vision output into ingest metadata when processing images.\n *\n * @example Custom provider\n * ```ts\n * const myVision: VisionProvider = {\n * name: \"my-vlm\",\n * async analyze(image, mimeType) {\n * return { caption: \"...\", description: \"...\", entities: [\"cat\"] };\n * },\n * };\n * ```\n */\nexport interface VisionProvider {\n /** Provider identifier (e.g. `\"openai-vision\"`, `\"gemini\"`). */\n readonly name: string;\n /**\n * Analyze an image and return structured caption data.\n * @param image - Raw image bytes.\n * @param mimeType - MIME type for the data URL (default `\"image/png\"`).\n */\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\n/** Internal OpenAI-compatible multimodal chat vision adapter. */\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\n/** Parse JSON (or plain text fallback) from model output into {@link VisionResult}. */\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\n/**\n * Google Gemini vision via the OpenAI-compatible Generative Language API.\n *\n * @param options - API credentials and model selection.\n * @param options.apiKey - Gemini API key.\n * @param options.model - Model id (default `\"gemini-2.0-flash\"`).\n * @param options.baseUrl - Override API base (default Google OpenAI-compat endpoint).\n * @param options.timeoutMs - Request timeout in milliseconds (default `60000`).\n * @returns A {@link VisionProvider} instance.\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\n/**\n * OpenAI vision via `/chat/completions` with image_url content parts.\n *\n * @param options - API credentials and model selection.\n * @param options.apiKey - OpenAI API key.\n * @param options.model - Vision-capable model (default `\"gpt-4o-mini\"`).\n * @param options.baseUrl - Override API base (default `\"https://api.openai.com/v1\"`).\n * @param options.timeoutMs - Request timeout in milliseconds (default `60000`).\n * @returns A {@link VisionProvider} instance.\n *\n * @example\n * ```ts\n * const vision = openaiVision({ apiKey: process.env.OPENAI_API_KEY! });\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 and Studio performance tooling.\n *\n * @internal Exported for harness scripts — not part of the stable public API surface.\n */\n\n/** Single timed iteration result. */\nexport interface BenchmarkSample {\n /** Benchmark scenario name. */\n name: string;\n /** Wall-clock duration in milliseconds. */\n durationMs: number;\n /** Whether the iteration completed without throwing. */\n ok: boolean;\n /** Error message when `ok` is false. */\n error?: string;\n}\n\n/** Aggregated benchmark report with percentile summary. */\nexport interface BenchmarkReport {\n /** ISO-8601 start timestamp. */\n startedAt: string;\n /** ISO-8601 end timestamp. */\n finishedAt: string;\n /** Raw per-iteration samples. */\n samples: BenchmarkSample[];\n /** Rollup statistics across successful iterations. */\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\n/**\n * Run a benchmark function for a fixed number of iterations.\n *\n * @param name - Scenario label attached to each sample.\n * @param iterations - Number of times to invoke `fn`.\n * @param fn - Async or sync work to measure.\n * @returns One {@link BenchmarkSample} per iteration (failures captured, not thrown).\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\n/**\n * Summarize benchmark samples into a report with avg / p50 / p95 / p99 latencies.\n *\n * @param samples - Output from {@link runBenchmark}.\n * @param startedAt - ISO start time for the run.\n * @param finishedAt - ISO end time for the run.\n * @returns {@link BenchmarkReport} suitable for JSON export.\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\n/** Compute percentile from a pre-sorted duration array. */\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","/**\n * Embedding provider presets for `wolbarg init` and project config.\n *\n * Base URLs are defaults the user must see and may edit — never silently applied\n * without showing the field.\n */\n\nexport type EmbeddingProviderId =\n | \"openai\"\n | \"ollama\"\n | \"openrouter\"\n | \"lmstudio\"\n | \"gemini\"\n | \"together\"\n | \"vllm\"\n | \"custom\";\n\nexport interface EmbeddingProviderPreset {\n id: EmbeddingProviderId;\n label: string;\n /** Default OpenAI-compatible embeddings base URL (shown to the user). */\n defaultBaseUrl: string;\n /** Suggested default model id (shown to the user). */\n defaultModel: string;\n /** Env var name written into config / `.env`. */\n apiKeyEnv: string;\n /** Hint shown next to the API key prompt. */\n apiKeyHint?: string;\n}\n\nexport const EMBEDDING_PROVIDER_PRESETS: readonly EmbeddingProviderPreset[] = [\n {\n id: \"openai\",\n label: \"OpenAI\",\n defaultBaseUrl: \"https://api.openai.com/v1\",\n defaultModel: \"text-embedding-3-small\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n {\n id: \"ollama\",\n label: \"Ollama (local)\",\n defaultBaseUrl: \"http://127.0.0.1:11434/v1\",\n defaultModel: \"nomic-embed-text\",\n apiKeyEnv: \"OLLAMA_API_KEY\",\n apiKeyHint: \"Any non-empty value works locally (e.g. ollama)\",\n },\n {\n id: \"openrouter\",\n label: \"OpenRouter\",\n defaultBaseUrl: \"https://openrouter.ai/api/v1\",\n defaultModel: \"openai/text-embedding-3-small\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n {\n id: \"lmstudio\",\n label: \"LM Studio (local)\",\n defaultBaseUrl: \"http://127.0.0.1:1234/v1\",\n defaultModel: \"text-embedding-nomic-embed-text-v1.5\",\n apiKeyEnv: \"LM_STUDIO_API_KEY\",\n apiKeyHint: \"Often unused locally — any non-empty value is fine\",\n },\n {\n id: \"gemini\",\n label: \"Google Gemini\",\n defaultBaseUrl:\n \"https://generativelanguage.googleapis.com/v1beta/openai\",\n defaultModel: \"text-embedding-004\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n {\n id: \"together\",\n label: \"Together AI\",\n defaultBaseUrl: \"https://api.together.xyz/v1\",\n defaultModel: \"togethercomputer/m2-bert-80M-8k-retrieval\",\n apiKeyEnv: \"TOGETHER_API_KEY\",\n },\n {\n id: \"vllm\",\n label: \"vLLM (local/server)\",\n defaultBaseUrl: \"http://127.0.0.1:8000/v1\",\n defaultModel: \"text-embedding-ada-002\",\n apiKeyEnv: \"VLLM_API_KEY\",\n apiKeyHint: \"Only if your server requires auth\",\n },\n {\n id: \"custom\",\n label: \"Custom OpenAI-compatible\",\n defaultBaseUrl: \"https://api.openai.com/v1\",\n defaultModel: \"text-embedding-3-small\",\n apiKeyEnv: \"WOLBARG_EMBEDDING_API_KEY\",\n },\n] as const;\n\nexport function getEmbeddingProviderPreset(\n id: string,\n): EmbeddingProviderPreset | undefined {\n return EMBEDDING_PROVIDER_PRESETS.find((p) => p.id === id);\n}\n\nexport const DEFAULT_SQLITE_DB_PATH = \".wolbarg/shared-memory/memory.db\";\nexport const DEFAULT_ORGANIZATION = \"default\";\nexport const DEFAULT_CONFIG_PATH = \".wolbarg/config.json\";\nexport const DEFAULT_ENV_PATH = \".wolbarg/.env\";\n","/**\n * Project-level Wolbarg configuration written by `wolbarg init`.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport {\n DEFAULT_CONFIG_PATH,\n DEFAULT_ENV_PATH,\n DEFAULT_ORGANIZATION,\n DEFAULT_SQLITE_DB_PATH,\n getEmbeddingProviderPreset,\n type EmbeddingProviderId,\n} from \"./providers.js\";\n\nexport interface WolbargProjectDatabaseConfig {\n provider: \"sqlite\" | \"postgres\";\n /** SQLite file path or Postgres connection URL. */\n url: string;\n}\n\nexport interface WolbargProjectEmbeddingConfig {\n /** Named provider preset id (or `custom`). */\n provider: EmbeddingProviderId;\n /** OpenAI-compatible embeddings base URL (always stored explicitly). */\n baseUrl: string;\n /** Embedding model id. */\n model: string;\n /** Env var that holds the API key (preferred over storing secrets). */\n apiKeyEnv: string;\n}\n\nexport interface WolbargProjectConfig {\n version: 1;\n organization: string;\n database: WolbargProjectDatabaseConfig;\n embedding?: WolbargProjectEmbeddingConfig;\n /** Relative paths written by init (informational). */\n paths?: {\n config: string;\n env?: string;\n };\n}\n\nexport interface SaveProjectConfigOptions {\n cwd?: string;\n configPath?: string;\n /** Absolute or cwd-relative path for `.env` (optional). */\n envPath?: string;\n /** Raw API key to write into the env file (optional). */\n apiKey?: string;\n /** When true, overwrite an existing config without merging. */\n overwrite?: boolean;\n}\n\nexport function defaultProjectConfig(): WolbargProjectConfig {\n return {\n version: 1,\n organization: DEFAULT_ORGANIZATION,\n database: {\n provider: \"sqlite\",\n url: DEFAULT_SQLITE_DB_PATH,\n },\n paths: {\n config: DEFAULT_CONFIG_PATH,\n },\n };\n}\n\nexport function resolveConfigPath(cwd = process.cwd(), configPath?: string): string {\n const rel = configPath ?? DEFAULT_CONFIG_PATH;\n return isAbsolute(rel) ? rel : resolve(cwd, rel);\n}\n\nexport function resolveEnvPath(cwd = process.cwd(), envPath?: string): string {\n const rel = envPath ?? DEFAULT_ENV_PATH;\n return isAbsolute(rel) ? rel : resolve(cwd, rel);\n}\n\nexport function loadProjectConfig(\n cwd = process.cwd(),\n configPath?: string,\n): WolbargProjectConfig | null {\n const full = resolveConfigPath(cwd, configPath);\n if (!existsSync(full)) return null;\n const raw = JSON.parse(readFileSync(full, \"utf8\")) as WolbargProjectConfig;\n if (!raw || raw.version !== 1 || !raw.database?.url) {\n throw new Error(`Invalid Wolbarg config at ${full}`);\n }\n return raw;\n}\n\nexport function saveProjectConfig(\n config: WolbargProjectConfig,\n options: SaveProjectConfigOptions = {},\n): { configPath: string; envPath?: string } {\n const cwd = options.cwd ?? process.cwd();\n const configPath = resolveConfigPath(cwd, options.configPath);\n const dir = dirname(configPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n if (existsSync(configPath) && options.overwrite === false) {\n throw new Error(`Config already exists: ${configPath} (pass --force to overwrite)`);\n }\n\n const toWrite: WolbargProjectConfig = {\n ...config,\n paths: {\n config: options.configPath ?? DEFAULT_CONFIG_PATH,\n ...(options.envPath || options.apiKey\n ? { env: options.envPath ?? DEFAULT_ENV_PATH }\n : config.paths?.env\n ? { env: config.paths.env }\n : {}),\n },\n };\n\n writeFileSync(configPath, `${JSON.stringify(toWrite, null, 2)}\\n`, \"utf8\");\n\n let envPath: string | undefined;\n if (options.apiKey && config.embedding?.apiKeyEnv) {\n envPath = resolveEnvPath(cwd, options.envPath);\n ensureParent(envPath);\n upsertEnvVar(envPath, config.embedding.apiKeyEnv, options.apiKey);\n ensureGitignore(cwd, [DEFAULT_ENV_PATH, \".env\"]);\n }\n\n // Ensure sqlite parent dir exists for the default layout\n if (config.database.provider === \"sqlite\" && !config.database.url.includes(\"://\")) {\n const dbPath = isAbsolute(config.database.url)\n ? config.database.url\n : resolve(cwd, config.database.url);\n ensureParent(dbPath);\n }\n\n return { configPath, envPath };\n}\n\nfunction ensureParent(filePath: string): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nexport function upsertEnvVar(\n envPath: string,\n key: string,\n value: string,\n): void {\n ensureParent(envPath);\n let text = existsSync(envPath) ? readFileSync(envPath, \"utf8\") : \"\";\n const line = `${key}=${shellQuoteEnv(value)}`;\n const re = new RegExp(`^${escapeRegExp(key)}=.*$`, \"m\");\n if (re.test(text)) {\n text = text.replace(re, line);\n } else {\n if (text && !text.endsWith(\"\\n\")) text += \"\\n\";\n text += `${line}\\n`;\n }\n writeFileSync(envPath, text, \"utf8\");\n}\n\nfunction shellQuoteEnv(value: string): string {\n if (/[\\s#\"']/.test(value)) {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction ensureGitignore(cwd: string, entries: string[]): void {\n const gi = join(cwd, \".gitignore\");\n let text = existsSync(gi) ? readFileSync(gi, \"utf8\") : \"\";\n let changed = false;\n for (const entry of entries) {\n if (text.split(/\\r?\\n/).some((l) => l.trim() === entry)) continue;\n if (text && !text.endsWith(\"\\n\")) text += \"\\n\";\n text += `${entry}\\n`;\n changed = true;\n }\n if (changed) writeFileSync(gi, text, \"utf8\");\n}\n\n/**\n * Resolve the API key for a project config from process.env (and optional `.env` load).\n * Does not invent keys — returns empty string if unset.\n */\nexport function resolveEmbeddingApiKey(\n config: WolbargProjectConfig,\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const name = config.embedding?.apiKeyEnv;\n if (!name) return \"\";\n return env[name] ?? \"\";\n}\n\nexport function assertEmbeddingPreset(\n provider: string,\n): EmbeddingProviderId {\n const preset = getEmbeddingProviderPreset(provider);\n if (!preset) {\n throw new Error(\n `Unknown embedding provider \"${provider}\". Choose one of: ${[\n \"openai\",\n \"ollama\",\n \"openrouter\",\n \"lmstudio\",\n \"gemini\",\n \"together\",\n \"vllm\",\n \"custom\",\n ].join(\", \")}`,\n );\n }\n return preset.id;\n}\n","/**\n * Build a Wolbarg instance from `.wolbarg/config.json` (+ env).\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { wolbarg, type Wolbarg } from \"../core/wolbarg.js\";\nimport type { WolbargOptions } from \"../core/options.js\";\nimport {\n loadProjectConfig,\n resolveEmbeddingApiKey,\n resolveEnvPath,\n type WolbargProjectConfig,\n} from \"./project-config.js\";\nimport { DEFAULT_ENV_PATH } from \"./providers.js\";\n\nexport interface CreateFromProjectConfigOptions {\n cwd?: string;\n configPath?: string;\n /** Extra env overlay (defaults to process.env after optional .env load). */\n env?: NodeJS.ProcessEnv;\n /** Load `.wolbarg/.env` into the env overlay when present (default true). */\n loadEnvFile?: boolean;\n /** Override organization. */\n organization?: string;\n}\n\n/**\n * Load key=value pairs from a dotenv-style file into a shallow copy of `base`.\n * Does not mutate `process.env` unless `base` is `process.env`.\n */\nexport function applyEnvFile(\n envPath: string,\n base: NodeJS.ProcessEnv = {},\n): NodeJS.ProcessEnv {\n const out: NodeJS.ProcessEnv = { ...base };\n if (!existsSync(envPath)) return out;\n const text = readFileSync(envPath, \"utf8\");\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const eq = line.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = line.slice(0, eq).trim();\n let value = line.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (out[key] === undefined) out[key] = value;\n }\n return out;\n}\n\nexport function projectConfigToWolbargOptions(\n config: WolbargProjectConfig,\n env: NodeJS.ProcessEnv = process.env,\n): WolbargOptions {\n if (!config.embedding) {\n throw new Error(\n \"Project config has no embedding section. Re-run `wolbarg init` and configure an embedding provider, or pass embedding explicitly to wolbarg().\",\n );\n }\n\n const apiKey = resolveEmbeddingApiKey(config, env);\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${config.embedding.apiKeyEnv} in the environment or in .wolbarg/.env (from wolbarg init).`,\n );\n }\n\n const dbUrl = config.database.url;\n return {\n organization: config.organization,\n database: {\n provider: config.database.provider,\n url: dbUrl,\n connectionString: dbUrl,\n },\n embedding: {\n baseUrl: config.embedding.baseUrl,\n apiKey,\n model: config.embedding.model,\n },\n };\n}\n\n/**\n * Create a {@link Wolbarg} context from project config written by `wolbarg init`.\n */\nexport function createWolbargFromProjectConfig(\n options: CreateFromProjectConfigOptions = {},\n): Wolbarg {\n const cwd = options.cwd ?? process.cwd();\n const config = loadProjectConfig(cwd, options.configPath);\n if (!config) {\n throw new Error(\n `No Wolbarg config found. Run \\`wolbarg init\\` in ${cwd} (expected .wolbarg/config.json).`,\n );\n }\n\n let env = options.env ?? { ...process.env };\n if (options.loadEnvFile !== false) {\n const envFile = resolveEnvPath(\n cwd,\n config.paths?.env ?? DEFAULT_ENV_PATH,\n );\n env = applyEnvFile(envFile, env);\n }\n\n if (options.organization) {\n config.organization = options.organization;\n }\n\n // Resolve relative sqlite paths against cwd for the running process\n if (\n config.database.provider === \"sqlite\" &&\n !config.database.url.includes(\"://\") &&\n !isAbsolute(config.database.url)\n ) {\n config.database = {\n ...config.database,\n url: resolve(cwd, config.database.url),\n };\n }\n\n return wolbarg(projectConfigToWolbargOptions(config, env));\n}\n"]}