{"version":3,"sources":["../src/errors.ts","../src/storage/pglite-disk.ts","../src/storage/pglite.ts","../src/storage/sqlite-vec.ts","../src/storage/upstash-vector.ts","../src/storage/pinecone.ts","../src/types.ts","../src/memory.ts","../src/embeddings/openai.ts","../src/utils/chunking.ts","../src/embeddings/transformers.ts","../src/embeddings/voyage.ts","../src/embeddings/google.ts","../src/extraction/extractor.ts","../src/deduplication/merger.ts","../src/deduplication/resolve-config.ts","../src/deduplication/specificity.ts","../src/deduplication/upsert-fact.ts","../src/index.ts","../src/storage/index.ts","../src/utils/cosine.ts"],"names":["TurboMemError","NotInitialisedError","EmbeddingError","StorageError","ExtractionError","DimensionMismatchError","ConfigError","existsSync","mkdirSync","PGliteStorageAdapter","vector","PGlite","SqliteVecStorageAdapter","parseMetadata","parseEmbedding","rowToMemory","join","dirname","randomUUID","UpstashVectorStorageAdapter","PEER_DEPS_MESSAGE","PineconeStorageAdapter","matchesScope","metadataToMemory","z","OpenAI","MODEL_DIMENSIONS","DEFAULT_MODEL","MAX_BATCH"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Stable, machine-readable error codes thrown by turbomem.\n */\nexport type TurboMemErrorCode =\n  | \"NOT_INITIALISED\"\n  | \"EMBEDDING_FAILED\"\n  | \"STORAGE_FAILED\"\n  | \"EXTRACTION_FAILED\"\n  | \"DIMENSION_MISMATCH\"\n  | \"INVALID_CONFIG\"\n  | \"INVALID_INPUT\";\n\n/**\n * Base error class for all turbomem errors. Carries a stable {@link code} so\n * callers can branch on error type without matching on message strings.\n */\nexport class TurboMemError extends Error {\n  readonly code: TurboMemErrorCode;\n  override readonly cause?: unknown;\n\n  constructor(code: TurboMemErrorCode, message: string, options?: { cause?: unknown }) {\n    super(message);\n    this.name = \"TurboMemError\";\n    this.code = code;\n    this.cause = options?.cause;\n    Object.setPrototypeOf(this, TurboMemError.prototype);\n  }\n}\n\nexport class NotInitialisedError extends TurboMemError {\n  constructor(message = \"TurboMemory not initialised. Call await memory.init() first.\") {\n    super(\"NOT_INITIALISED\", message);\n    this.name = \"NotInitialisedError\";\n    Object.setPrototypeOf(this, NotInitialisedError.prototype);\n  }\n}\n\nexport class EmbeddingError extends TurboMemError {\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(\"EMBEDDING_FAILED\", message, options);\n    this.name = \"EmbeddingError\";\n    Object.setPrototypeOf(this, EmbeddingError.prototype);\n  }\n}\n\nexport class StorageError extends TurboMemError {\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(\"STORAGE_FAILED\", message, options);\n    this.name = \"StorageError\";\n    Object.setPrototypeOf(this, StorageError.prototype);\n  }\n}\n\nexport class ExtractionError extends TurboMemError {\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(\"EXTRACTION_FAILED\", message, options);\n    this.name = \"ExtractionError\";\n    Object.setPrototypeOf(this, ExtractionError.prototype);\n  }\n}\n\nexport class DimensionMismatchError extends TurboMemError {\n  constructor(message: string) {\n    super(\"DIMENSION_MISMATCH\", message);\n    this.name = \"DimensionMismatchError\";\n    Object.setPrototypeOf(this, DimensionMismatchError.prototype);\n  }\n}\n\nexport class ConfigError extends TurboMemError {\n  constructor(message: string) {\n    super(\"INVALID_CONFIG\", message);\n    this.name = \"ConfigError\";\n    Object.setPrototypeOf(this, ConfigError.prototype);\n  }\n}\n","export async function ensureDiskDirectory(dataDir: string): Promise<void> {\n  const { existsSync, mkdirSync } = await import(\"node:fs\");\n  if (!existsSync(dataDir)) {\n    mkdirSync(dataDir, { recursive: true });\n  }\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport { vector } from \"@electric-sql/pglite/vector\";\nimport type { Memory, MemoryScope, MemorySearchResult, StorageAdapter } from \"../types.js\";\nimport { DimensionMismatchError, StorageError } from \"../errors.js\";\nimport { ensureDiskDirectory } from \"./pglite-disk.js\";\n\nexport interface PGliteStorageOptions {\n  /**\n   * Directory to persist the database. Defaults to `.turbomem` in\n   * `process.cwd()` on Node, or `idb://turbomem` in the browser.\n   *\n   * Prefix with `idb://` for IndexedDB persistence in the browser.\n   * Pass `\"memory://\"` (or set `inMemory`) for an ephemeral database.\n   */\n  dataDir?: string;\n  /** Use an in-memory database (ignores `dataDir`). Handy for tests. */\n  inMemory?: boolean;\n  /**\n   * When true, PGlite returns query results before IndexedDB flushes complete.\n   * Defaults to `true` for `idb://` paths; otherwise `false`.\n   */\n  relaxedDurability?: boolean;\n}\n\ninterface MemoryRow {\n  id: string;\n  content: string;\n  embedding: string | number[];\n  user_id: string | null;\n  agent_id: string | null;\n  session_id: string | null;\n  metadata: Record<string, unknown> | string | null;\n  created_at: string | Date;\n  updated_at: string | Date;\n  score?: number;\n}\n\nfunction isIndexedDbPath(dataDir: string): boolean {\n  return dataDir.startsWith(\"idb://\");\n}\n\nfunction defaultDataDir(): string {\n  if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n    return `${process.cwd()}/.turbomem`;\n  }\n  return \"idb://turbomem\";\n}\n\nfunction resolveRelaxedDurability(\n  dataDir: string | undefined,\n  explicit: boolean | undefined,\n): boolean | undefined {\n  if (explicit !== undefined) return explicit;\n  if (dataDir && isIndexedDbPath(dataDir)) return true;\n  return undefined;\n}\n\nfunction parseEmbedding(value: string | number[]): number[] {\n  if (Array.isArray(value)) return value;\n  // pgvector serialises as e.g. \"[0.1,0.2,0.3]\"\n  return JSON.parse(value) as number[];\n}\n\nfunction parseMetadata(value: MemoryRow[\"metadata\"]): Record<string, unknown> {\n  if (value == null) return {};\n  if (typeof value === \"string\") {\n    try {\n      return JSON.parse(value) as Record<string, unknown>;\n    } catch {\n      return {};\n    }\n  }\n  return value;\n}\n\nfunction rowToMemory(row: MemoryRow): Memory {\n  return {\n    id: row.id,\n    content: row.content,\n    embedding: parseEmbedding(row.embedding),\n    userId: row.user_id ?? undefined,\n    agentId: row.agent_id ?? undefined,\n    sessionId: row.session_id ?? undefined,\n    metadata: parseMetadata(row.metadata),\n    createdAt: new Date(row.created_at),\n    updatedAt: new Date(row.updated_at),\n  };\n}\n\nfunction toVectorLiteral(embedding: number[]): string {\n  return `[${embedding.join(\",\")}]`;\n}\n\nexport class PGliteStorageAdapter implements StorageAdapter {\n  private db: PGlite | null = null;\n  private dimensions = 0;\n  private readonly dataDir: string | undefined;\n  private readonly inMemory: boolean;\n  private readonly relaxedDurability: boolean | undefined;\n\n  constructor(options: PGliteStorageOptions = {}) {\n    this.inMemory = options.inMemory ?? options.dataDir === \"memory://\";\n    this.dataDir = this.inMemory ? undefined : (options.dataDir ?? defaultDataDir());\n    this.relaxedDurability = resolveRelaxedDurability(this.dataDir, options.relaxedDurability);\n  }\n\n  async init(dimensions: number): Promise<void> {\n    if (!Number.isInteger(dimensions) || dimensions <= 0) {\n      throw new StorageError(`Invalid embedding dimensions: ${dimensions}`);\n    }\n    this.dimensions = dimensions;\n\n    try {\n      if (this.dataDir && !isIndexedDbPath(this.dataDir)) {\n        await ensureDiskDirectory(this.dataDir);\n      }\n\n      const pgOptions = {\n        extensions: { vector },\n        ...(this.relaxedDurability !== undefined\n          ? { relaxedDurability: this.relaxedDurability }\n          : {}),\n      };\n\n      this.db = this.inMemory\n        ? new PGlite(pgOptions)\n        : new PGlite(this.dataDir!, pgOptions);\n\n      await this.db.exec(`CREATE EXTENSION IF NOT EXISTS vector;`);\n\n      // Track the dimension this store was created with so we can fail loudly\n      // if the embedding adapter later changes.\n      await this.db.exec(`\n        CREATE TABLE IF NOT EXISTS turbomem_meta (\n          key   TEXT PRIMARY KEY,\n          value TEXT NOT NULL\n        );\n      `);\n\n      const existing = await this.db.query<{ value: string }>(\n        `SELECT value FROM turbomem_meta WHERE key = 'dimensions'`,\n      );\n\n      if (existing.rows.length > 0) {\n        const storedDim = Number(existing.rows[0].value);\n        if (storedDim !== dimensions) {\n          throw new DimensionMismatchError(\n            `Existing turbomem store was created with ${storedDim}-dimensional vectors but the configured embedding adapter produces ${dimensions}-dimensional vectors. Use a matching embedding model or a fresh data directory.`,\n          );\n        }\n      }\n\n      await this.db.exec(`\n        CREATE TABLE IF NOT EXISTS memories (\n          id          TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,\n          content     TEXT NOT NULL,\n          embedding   vector(${dimensions}),\n          user_id     TEXT,\n          agent_id    TEXT,\n          session_id  TEXT,\n          metadata    JSONB DEFAULT '{}',\n          created_at  TIMESTAMPTZ DEFAULT now(),\n          updated_at  TIMESTAMPTZ DEFAULT now()\n        );\n\n        CREATE INDEX IF NOT EXISTS memories_embedding_idx\n          ON memories USING hnsw (embedding vector_cosine_ops);\n\n        CREATE INDEX IF NOT EXISTS memories_user_id_idx ON memories (user_id);\n        CREATE INDEX IF NOT EXISTS memories_agent_id_idx ON memories (agent_id);\n      `);\n\n      await this.db.query(\n        `INSERT INTO turbomem_meta (key, value) VALUES ('dimensions', $1)\n         ON CONFLICT (key) DO NOTHING`,\n        [String(dimensions)],\n      );\n    } catch (error) {\n      if (error instanceof DimensionMismatchError) throw error;\n      throw new StorageError(`Failed to initialise PGlite storage: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  private requireDb(): PGlite {\n    if (!this.db) {\n      throw new StorageError(\"PGlite storage not initialised. Call init() first.\");\n    }\n    return this.db;\n  }\n\n  async update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory> {\n    const db = this.requireDb();\n    if (patch.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${patch.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n    try {\n      const result = await db.query<MemoryRow>(\n        `UPDATE memories\n         SET content = $1,\n             embedding = $2::vector,\n             metadata = COALESCE($3::jsonb, metadata),\n             updated_at = now()\n         WHERE id = $4\n         RETURNING *`,\n        [\n          patch.content,\n          toVectorLiteral(patch.embedding),\n          patch.metadata != null ? JSON.stringify(patch.metadata) : null,\n          id,\n        ],\n      );\n      if (result.rows.length === 0) {\n        throw new StorageError(`Memory not found: ${id}`);\n      }\n      return rowToMemory(result.rows[0]);\n    } catch (error) {\n      if (error instanceof StorageError) throw error;\n      throw new StorageError(`Failed to update memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory> {\n    const db = this.requireDb();\n    if (memory.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${memory.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n    try {\n      const result = await db.query<MemoryRow>(\n        `INSERT INTO memories (content, embedding, user_id, agent_id, session_id, metadata)\n         VALUES ($1, $2::vector, $3, $4, $5, $6::jsonb)\n         RETURNING *`,\n        [\n          memory.content,\n          toVectorLiteral(memory.embedding),\n          memory.userId ?? null,\n          memory.agentId ?? null,\n          memory.sessionId ?? null,\n          JSON.stringify(memory.metadata ?? {}),\n        ],\n      );\n      return rowToMemory(result.rows[0]);\n    } catch (error) {\n      throw new StorageError(`Failed to insert memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async search(\n    embedding: number[],\n    scope: MemoryScope,\n    limit: number,\n  ): Promise<MemorySearchResult[]> {\n    const db = this.requireDb();\n    try {\n      const result = await db.query<MemoryRow>(\n        `SELECT *, 1 - (embedding <=> $1::vector) AS score\n         FROM memories\n         WHERE ($2::text IS NULL OR user_id = $2)\n           AND ($3::text IS NULL OR agent_id = $3)\n           AND ($4::text IS NULL OR session_id = $4)\n         ORDER BY embedding <=> $1::vector\n         LIMIT $5`,\n        [\n          toVectorLiteral(embedding),\n          scope.userId ?? null,\n          scope.agentId ?? null,\n          scope.sessionId ?? null,\n          limit,\n        ],\n      );\n\n      return result.rows.map((row) => ({\n        memory: rowToMemory(row),\n        score: typeof row.score === \"number\" ? row.score : Number(row.score),\n      }));\n    } catch (error) {\n      throw new StorageError(`Failed to search memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    const db = this.requireDb();\n    try {\n      const result = await db.query<MemoryRow>(\n        `SELECT * FROM memories\n         WHERE ($1::text IS NULL OR user_id = $1)\n           AND ($2::text IS NULL OR agent_id = $2)\n           AND ($3::text IS NULL OR session_id = $3)\n         ORDER BY created_at DESC`,\n        [scope.userId ?? null, scope.agentId ?? null, scope.sessionId ?? null],\n      );\n      return result.rows.map(rowToMemory);\n    } catch (error) {\n      throw new StorageError(`Failed to list memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    const db = this.requireDb();\n    try {\n      await db.query(`DELETE FROM memories WHERE id = $1`, [id]);\n    } catch (error) {\n      throw new StorageError(`Failed to delete memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    const db = this.requireDb();\n    if (!scope.userId && !scope.agentId && !scope.sessionId) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n    try {\n      await db.query(\n        `DELETE FROM memories\n         WHERE ($1::text IS NULL OR user_id = $1)\n           AND ($2::text IS NULL OR agent_id = $2)\n           AND ($3::text IS NULL OR session_id = $3)`,\n        [scope.userId ?? null, scope.agentId ?? null, scope.sessionId ?? null],\n      );\n    } catch (error) {\n      throw new StorageError(`Failed to delete memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.db) {\n      await this.db.close();\n      this.db = null;\n    }\n  }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Memory, MemoryScope, MemorySearchResult, StorageAdapter } from \"../types.js\";\nimport { ConfigError, DimensionMismatchError, StorageError } from \"../errors.js\";\n\nexport interface SqliteVecStorageOptions {\n  /**\n   * Path to the SQLite database file. Defaults to `.turbomem.sqlite` in\n   * `process.cwd()`.\n   */\n  dbPath?: string;\n  /** Use an in-memory database (ignores `dbPath`). Handy for tests. */\n  inMemory?: boolean;\n}\n\ninterface MemoryRow {\n  id: string;\n  content: string;\n  user_id: string | null;\n  agent_id: string | null;\n  session_id: string | null;\n  metadata: string | null;\n  created_at: string;\n  updated_at: string;\n  embedding?: unknown;\n  score?: number;\n}\n\ntype BetterSqliteDatabase = import(\"better-sqlite3\").Database;\n\nconst PEER_DEPS_MESSAGE =\n  'storage: \"sqlite-vec\" requires optional peer dependencies `better-sqlite3` and `sqlite-vec`. Install them with: npm install better-sqlite3 sqlite-vec';\n\nfunction parseMetadata(value: string | null): Record<string, unknown> {\n  if (value == null || value === \"\") return {};\n  try {\n    return JSON.parse(value) as Record<string, unknown>;\n  } catch {\n    return {};\n  }\n}\n\nfunction parseEmbedding(value: unknown): number[] {\n  if (Array.isArray(value)) return value as number[];\n  if (value instanceof Float32Array) return Array.from(value);\n  if (value instanceof Buffer) {\n    return Array.from(\n      new Float32Array(value.buffer, value.byteOffset, value.byteLength / 4),\n    );\n  }\n  if (typeof value === \"string\") {\n    return JSON.parse(value) as number[];\n  }\n  throw new StorageError(\"Unexpected embedding format from sqlite-vec store.\");\n}\n\nfunction toFloat32Array(embedding: number[]): Float32Array {\n  return new Float32Array(embedding);\n}\n\n/** vec0 TEXT metadata columns reject NULL — use empty string for unset scope. */\nfunction scopeText(value: string | undefined): string {\n  return value ?? \"\";\n}\n\nfunction rowToMemory(row: MemoryRow): Memory {\n  return {\n    id: row.id,\n    content: row.content,\n    embedding: row.embedding != null ? parseEmbedding(row.embedding) : [],\n    userId: row.user_id ?? undefined,\n    agentId: row.agent_id ?? undefined,\n    sessionId: row.session_id ?? undefined,\n    metadata: parseMetadata(row.metadata),\n    createdAt: new Date(row.created_at),\n    updatedAt: new Date(row.updated_at),\n  };\n}\n\nasync function loadSqliteDeps(): Promise<{\n  Database: new (path: string) => BetterSqliteDatabase;\n  sqliteVec: { load: (db: BetterSqliteDatabase) => void };\n}> {\n  try {\n    const [betterSqlite3, sqliteVec] = await Promise.all([\n      import(\"better-sqlite3\"),\n      import(\"sqlite-vec\"),\n    ]);\n    return {\n      Database: betterSqlite3.default,\n      sqliteVec,\n    };\n  } catch {\n    throw new ConfigError(PEER_DEPS_MESSAGE);\n  }\n}\n\nexport class SqliteVecStorageAdapter implements StorageAdapter {\n  private db: BetterSqliteDatabase | null = null;\n  private dimensions = 0;\n  private readonly dbPath: string;\n  private readonly inMemory: boolean;\n\n  constructor(options: SqliteVecStorageOptions = {}) {\n    this.inMemory = options.inMemory ?? false;\n    this.dbPath = this.inMemory\n      ? \":memory:\"\n      : (options.dbPath ?? join(process.cwd(), \".turbomem.sqlite\"));\n  }\n\n  async init(dimensions: number): Promise<void> {\n    if (!Number.isInteger(dimensions) || dimensions <= 0) {\n      throw new StorageError(`Invalid embedding dimensions: ${dimensions}`);\n    }\n    this.dimensions = dimensions;\n\n    try {\n      const { Database, sqliteVec } = await loadSqliteDeps();\n\n      if (!this.inMemory) {\n        const dir = dirname(this.dbPath);\n        if (dir !== \".\" && !existsSync(dir)) {\n          mkdirSync(dir, { recursive: true });\n        }\n      }\n\n      this.db = new Database(this.dbPath);\n      sqliteVec.load(this.db);\n\n      const db = this.requireDb();\n\n      db.exec(`\n        CREATE TABLE IF NOT EXISTS turbomem_meta (\n          key   TEXT PRIMARY KEY,\n          value TEXT NOT NULL\n        );\n      `);\n\n      const existing = db\n        .prepare(`SELECT value FROM turbomem_meta WHERE key = 'dimensions'`)\n        .get() as { value: string } | undefined;\n\n      if (existing != null) {\n        const storedDim = Number(existing.value);\n        if (storedDim !== dimensions) {\n          throw new DimensionMismatchError(\n            `Existing turbomem store was created with ${storedDim}-dimensional vectors but the configured embedding adapter produces ${dimensions}-dimensional vectors. Use a matching embedding model or a fresh database file.`,\n          );\n        }\n      }\n\n      db.exec(`\n        CREATE TABLE IF NOT EXISTS memories (\n          id          TEXT PRIMARY KEY,\n          content     TEXT NOT NULL,\n          user_id     TEXT,\n          agent_id    TEXT,\n          session_id  TEXT,\n          metadata    TEXT DEFAULT '{}',\n          created_at  TEXT NOT NULL,\n          updated_at  TEXT NOT NULL\n        );\n\n        CREATE INDEX IF NOT EXISTS memories_user_id_idx ON memories (user_id);\n        CREATE INDEX IF NOT EXISTS memories_agent_id_idx ON memories (agent_id);\n        CREATE INDEX IF NOT EXISTS memories_session_id_idx ON memories (session_id);\n      `);\n\n      db.exec(`\n        CREATE VIRTUAL TABLE IF NOT EXISTS memory_embeddings USING vec0(\n          embedding float[${dimensions}] distance_metric=cosine,\n          user_id TEXT,\n          agent_id TEXT,\n          session_id TEXT\n        );\n      `);\n\n      db.prepare(\n        `INSERT INTO turbomem_meta (key, value) VALUES ('dimensions', ?)\n         ON CONFLICT (key) DO NOTHING`,\n      ).run(String(dimensions));\n    } catch (error) {\n      if (error instanceof DimensionMismatchError || error instanceof ConfigError) {\n        throw error;\n      }\n      throw new StorageError(\n        `Failed to initialise sqlite-vec storage: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private requireDb(): BetterSqliteDatabase {\n    if (!this.db) {\n      throw new StorageError(\"sqlite-vec storage not initialised. Call init() first.\");\n    }\n    return this.db;\n  }\n\n  async insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory> {\n    const db = this.requireDb();\n    if (memory.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${memory.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n\n    try {\n      const id = randomUUID();\n      const now = new Date().toISOString();\n      const metadata = JSON.stringify(memory.metadata ?? {});\n\n      const insert = db.transaction(() => {\n        const result = db\n          .prepare(\n            `INSERT INTO memories (id, content, user_id, agent_id, session_id, metadata, created_at, updated_at)\n             VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n          )\n          .run(\n            id,\n            memory.content,\n            memory.userId ?? null,\n            memory.agentId ?? null,\n            memory.sessionId ?? null,\n            metadata,\n            now,\n            now,\n          );\n\n        db.prepare(\n          `INSERT INTO memory_embeddings (rowid, embedding, user_id, agent_id, session_id)\n           VALUES (?, ?, ?, ?, ?)`,\n        ).run(\n          BigInt(result.lastInsertRowid),\n          toFloat32Array(memory.embedding),\n          scopeText(memory.userId),\n          scopeText(memory.agentId),\n          scopeText(memory.sessionId),\n        );\n\n        return { id, now, metadata };\n      });\n      const inserted = insert();\n\n      return {\n        id: inserted.id,\n        content: memory.content,\n        embedding: memory.embedding,\n        userId: memory.userId,\n        agentId: memory.agentId,\n        sessionId: memory.sessionId,\n        metadata: memory.metadata ?? {},\n        createdAt: new Date(inserted.now),\n        updatedAt: new Date(inserted.now),\n      };\n    } catch (error) {\n      if (error instanceof DimensionMismatchError) throw error;\n      throw new StorageError(`Failed to insert memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory> {\n    const db = this.requireDb();\n    if (patch.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${patch.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n\n    try {\n      const now = new Date().toISOString();\n      const metadataJson =\n        patch.metadata != null ? JSON.stringify(patch.metadata) : undefined;\n\n      const runUpdate = db.transaction(() => {\n        const row = db.prepare(`SELECT rowid FROM memories WHERE id = ?`).get(id) as\n          | { rowid: number }\n          | undefined;\n        if (row == null) {\n          throw new StorageError(`Memory not found: ${id}`);\n        }\n\n        if (metadataJson != null) {\n          db.prepare(\n            `UPDATE memories SET content = ?, metadata = ?, updated_at = ? WHERE id = ?`,\n          ).run(patch.content, metadataJson, now, id);\n        } else {\n          db.prepare(`UPDATE memories SET content = ?, updated_at = ? WHERE id = ?`).run(\n            patch.content,\n            now,\n            id,\n          );\n        }\n\n        db.prepare(`UPDATE memory_embeddings SET embedding = ? WHERE rowid = ?`).run(\n          toFloat32Array(patch.embedding),\n          row.rowid,\n        );\n\n        const updated = db\n          .prepare(\n            `SELECT\n               m.id,\n               m.content,\n               m.user_id,\n               m.agent_id,\n               m.session_id,\n               m.metadata,\n               m.created_at,\n               m.updated_at,\n               v.embedding\n             FROM memories m\n             JOIN memory_embeddings v ON m.rowid = v.rowid\n             WHERE m.id = ?`,\n          )\n          .get(id) as MemoryRow | undefined;\n\n        if (updated == null) {\n          throw new StorageError(`Memory not found after update: ${id}`);\n        }\n        return updated;\n      });\n\n      return rowToMemory(runUpdate());\n    } catch (error) {\n      if (error instanceof DimensionMismatchError || error instanceof StorageError) throw error;\n      throw new StorageError(`Failed to update memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async search(\n    embedding: number[],\n    scope: MemoryScope,\n    limit: number,\n  ): Promise<MemorySearchResult[]> {\n    const db = this.requireDb();\n    const k = Math.max(1, Math.floor(limit));\n    try {\n      const rows = db\n        .prepare(\n          `SELECT\n             m.id,\n             m.content,\n             m.user_id,\n             m.agent_id,\n             m.session_id,\n             m.metadata,\n             m.created_at,\n             m.updated_at,\n             v.embedding,\n             1 - v.distance AS score\n           FROM memory_embeddings v\n           JOIN memories m ON m.rowid = v.rowid\n           WHERE v.embedding MATCH ?\n             AND k = ${k}\n             AND (? IS NULL OR v.user_id = ?)\n             AND (? IS NULL OR v.agent_id = ?)\n             AND (? IS NULL OR v.session_id = ?)\n           ORDER BY v.distance`,\n        )\n        .all(\n          toFloat32Array(embedding),\n          scope.userId ?? null,\n          scope.userId ?? null,\n          scope.agentId ?? null,\n          scope.agentId ?? null,\n          scope.sessionId ?? null,\n          scope.sessionId ?? null,\n        ) as MemoryRow[];\n\n      return rows.map((row) => ({\n        memory: rowToMemory(row),\n        score: typeof row.score === \"number\" ? row.score : Number(row.score),\n      }));\n    } catch (error) {\n      throw new StorageError(`Failed to search memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    const db = this.requireDb();\n    try {\n      const rows = db\n        .prepare(\n          `SELECT\n             m.id,\n             m.content,\n             m.user_id,\n             m.agent_id,\n             m.session_id,\n             m.metadata,\n             m.created_at,\n             m.updated_at,\n             v.embedding\n           FROM memories m\n           JOIN memory_embeddings v ON m.rowid = v.rowid\n           WHERE (? IS NULL OR m.user_id = ?)\n             AND (? IS NULL OR m.agent_id = ?)\n             AND (? IS NULL OR m.session_id = ?)\n           ORDER BY m.created_at DESC`,\n        )\n        .all(\n          scope.userId ?? null,\n          scope.userId ?? null,\n          scope.agentId ?? null,\n          scope.agentId ?? null,\n          scope.sessionId ?? null,\n          scope.sessionId ?? null,\n        ) as MemoryRow[];\n\n      return rows.map(rowToMemory);\n    } catch (error) {\n      throw new StorageError(`Failed to list memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    const db = this.requireDb();\n    try {\n      const runDelete = db.transaction(() => {\n        const row = db.prepare(`SELECT rowid FROM memories WHERE id = ?`).get(id) as\n          | { rowid: number }\n          | undefined;\n        if (row == null) return;\n        db.prepare(`DELETE FROM memory_embeddings WHERE rowid = ?`).run(row.rowid);\n        db.prepare(`DELETE FROM memories WHERE id = ?`).run(id);\n      });\n      runDelete();\n    } catch (error) {\n      throw new StorageError(`Failed to delete memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    const db = this.requireDb();\n    if (!scope.userId && !scope.agentId && !scope.sessionId) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n    try {\n      const runDeleteAll = db.transaction(() => {\n        db.prepare(\n          `DELETE FROM memory_embeddings\n           WHERE rowid IN (\n             SELECT rowid FROM memories\n             WHERE (? IS NULL OR user_id = ?)\n               AND (? IS NULL OR agent_id = ?)\n               AND (? IS NULL OR session_id = ?)\n           )`,\n        ).run(\n          scope.userId ?? null,\n          scope.userId ?? null,\n          scope.agentId ?? null,\n          scope.agentId ?? null,\n          scope.sessionId ?? null,\n          scope.sessionId ?? null,\n        );\n\n        db.prepare(\n          `DELETE FROM memories\n           WHERE (? IS NULL OR user_id = ?)\n             AND (? IS NULL OR agent_id = ?)\n             AND (? IS NULL OR session_id = ?)`,\n        ).run(\n          scope.userId ?? null,\n          scope.userId ?? null,\n          scope.agentId ?? null,\n          scope.agentId ?? null,\n          scope.sessionId ?? null,\n          scope.sessionId ?? null,\n        );\n      });\n      runDeleteAll();\n    } catch (error) {\n      throw new StorageError(`Failed to delete memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.db) {\n      this.db.close();\n      this.db = null;\n    }\n  }\n}\n","import type { Memory, MemoryScope, MemorySearchResult, StorageAdapter } from \"../types.js\";\nimport { ConfigError, DimensionMismatchError, StorageError } from \"../errors.js\";\n\nexport interface UpstashVectorStorageOptions {\n  /** Upstash Vector REST URL. Falls back to `UPSTASH_VECTOR_REST_URL`. */\n  url?: string;\n  /** Upstash Vector REST token. Falls back to `UPSTASH_VECTOR_REST_TOKEN`. */\n  token?: string;\n  /** Optional Upstash namespace. Omit for the default namespace. */\n  namespace?: string;\n  /**\n   * Inject a preconfigured Upstash `Index` client (for tests). When set,\n   * `url` and `token` are ignored.\n   */\n  index?: UpstashVectorIndex;\n}\n\n/** Minimal Upstash Vector client surface used by the adapter. */\nexport interface UpstashVectorIndex {\n  info(): Promise<{ dimension: number }>;\n  upsert(\n    args:\n      | {\n          id: string | number;\n          vector: number[];\n          metadata?: UpstashMemoryMetadata;\n        }\n      | Array<{\n          id: string | number;\n          vector: number[];\n          metadata?: UpstashMemoryMetadata;\n        }>,\n    options?: { namespace?: string },\n  ): Promise<string>;\n  query(\n    args: {\n      vector: number[];\n      topK: number;\n      filter?: string;\n      includeMetadata?: boolean;\n      includeVectors?: boolean;\n    },\n    options?: { namespace?: string },\n  ): Promise<\n    Array<{\n      id: string | number;\n      score: number;\n      vector?: number[];\n      metadata?: UpstashMemoryMetadata;\n    }>\n  >;\n  range(\n    args: {\n      cursor: number | string;\n      limit: number;\n      includeMetadata?: boolean;\n      includeVectors?: boolean;\n    },\n    options?: { namespace?: string },\n  ): Promise<{\n    nextCursor: string;\n    vectors: Array<{\n      id: string | number;\n      vector?: number[];\n      metadata?: UpstashMemoryMetadata;\n    }>;\n  }>;\n  delete(\n    payload: string | number | Array<string | number> | { filter: string },\n    options?: { namespace?: string },\n  ): Promise<{ deleted: number }>;\n}\n\nexport type UpstashMemoryMetadata = {\n  content: string;\n  userId?: string;\n  agentId?: string;\n  sessionId?: string;\n  metadata: Record<string, unknown>;\n  createdAt: string;\n  updatedAt: string;\n};\n\nconst PEER_DEPS_MESSAGE =\n  'storage: \"upstash-vector\" requires optional peer dependency `@upstash/vector`. Install it with: npm install @upstash/vector';\n\nconst RANGE_PAGE_SIZE = 100;\n\nfunction escapeFilterString(value: string): string {\n  return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function buildScopeFilter(scope: MemoryScope): string | undefined {\n  const parts: string[] = [];\n  if (scope.userId) {\n    parts.push(`userId = \"${escapeFilterString(scope.userId)}\"`);\n  }\n  if (scope.agentId) {\n    parts.push(`agentId = \"${escapeFilterString(scope.agentId)}\"`);\n  }\n  if (scope.sessionId) {\n    parts.push(`sessionId = \"${escapeFilterString(scope.sessionId)}\"`);\n  }\n  return parts.length > 0 ? parts.join(\" AND \") : undefined;\n}\n\nfunction matchesScope(\n  scope: MemoryScope,\n  memory: Pick<Memory, \"userId\" | \"agentId\" | \"sessionId\">,\n): boolean {\n  if (scope.userId !== undefined && memory.userId !== scope.userId) return false;\n  if (scope.agentId !== undefined && memory.agentId !== scope.agentId) return false;\n  if (scope.sessionId !== undefined && memory.sessionId !== scope.sessionId) return false;\n  return true;\n}\n\nfunction metadataToMemory(id: string, vector: number[] | undefined, meta: UpstashMemoryMetadata): Memory {\n  return {\n    id,\n    content: meta.content,\n    embedding: vector ?? [],\n    userId: meta.userId,\n    agentId: meta.agentId,\n    sessionId: meta.sessionId,\n    metadata: meta.metadata ?? {},\n    createdAt: new Date(meta.createdAt),\n    updatedAt: new Date(meta.updatedAt),\n  };\n}\n\nasync function loadUpstashIndex(options: UpstashVectorStorageOptions): Promise<UpstashVectorIndex> {\n  if (options.index) return options.index;\n\n  const url = options.url ?? process.env.UPSTASH_VECTOR_REST_URL;\n  const token = options.token ?? process.env.UPSTASH_VECTOR_REST_TOKEN;\n\n  if (!url || !token) {\n    throw new ConfigError(\n      \"Upstash Vector credentials are required. Set upstashVector.url/token or UPSTASH_VECTOR_REST_URL and UPSTASH_VECTOR_REST_TOKEN.\",\n    );\n  }\n\n  try {\n    const { Index } = await import(\"@upstash/vector\");\n    return new Index({ url, token }) as UpstashVectorIndex;\n  } catch {\n    throw new ConfigError(PEER_DEPS_MESSAGE);\n  }\n}\n\nexport class UpstashVectorStorageAdapter implements StorageAdapter {\n  private index: UpstashVectorIndex | null = null;\n  private dimensions = 0;\n  private readonly options: UpstashVectorStorageOptions;\n\n  constructor(options: UpstashVectorStorageOptions = {}) {\n    this.options = options;\n  }\n\n  private namespaceOptions(): { namespace?: string } {\n    return this.options.namespace ? { namespace: this.options.namespace } : {};\n  }\n\n  private requireIndex(): UpstashVectorIndex {\n    if (!this.index) {\n      throw new StorageError(\"Upstash Vector storage not initialised. Call init() first.\");\n    }\n    return this.index;\n  }\n\n  async init(dimensions: number): Promise<void> {\n    if (!Number.isInteger(dimensions) || dimensions <= 0) {\n      throw new StorageError(`Invalid embedding dimensions: ${dimensions}`);\n    }\n    this.dimensions = dimensions;\n\n    try {\n      this.index = await loadUpstashIndex(this.options);\n      const info = await this.index.info();\n\n      if (info.dimension !== dimensions) {\n        throw new DimensionMismatchError(\n          `Upstash Vector index was created with ${info.dimension}-dimensional vectors but the configured embedding adapter produces ${dimensions}-dimensional vectors. Create a new index with matching dimensions or use a matching embedding model.`,\n        );\n      }\n    } catch (error) {\n      if (error instanceof DimensionMismatchError) throw error;\n      if (error instanceof ConfigError) throw error;\n      throw new StorageError(\n        `Failed to initialise Upstash Vector storage: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  async update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory> {\n    const index = this.requireIndex();\n    if (patch.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${patch.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n\n    const now = new Date().toISOString();\n    let existingMeta: UpstashMemoryMetadata | undefined;\n\n    try {\n      let cursor: number | string = 0;\n      for (;;) {\n        const page = await index.range(\n          { cursor, limit: RANGE_PAGE_SIZE, includeMetadata: true, includeVectors: true },\n          this.namespaceOptions(),\n        );\n        for (const row of page.vectors) {\n          if (String(row.id) === id && row.metadata) {\n            existingMeta = row.metadata;\n            break;\n          }\n        }\n        if (existingMeta || !page.nextCursor || page.vectors.length === 0) break;\n        cursor = page.nextCursor;\n      }\n\n      if (!existingMeta) {\n        throw new StorageError(`Memory not found: ${id}`);\n      }\n\n      const metadata: UpstashMemoryMetadata = {\n        content: patch.content,\n        userId: existingMeta.userId,\n        agentId: existingMeta.agentId,\n        sessionId: existingMeta.sessionId,\n        metadata: patch.metadata ?? existingMeta.metadata ?? {},\n        createdAt: existingMeta.createdAt,\n        updatedAt: now,\n      };\n\n      await index.upsert({ id, vector: patch.embedding, metadata }, this.namespaceOptions());\n      return metadataToMemory(id, patch.embedding, metadata);\n    } catch (error) {\n      if (error instanceof StorageError) throw error;\n      throw new StorageError(`Failed to update memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory> {\n    const index = this.requireIndex();\n    if (memory.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${memory.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n\n    const now = new Date().toISOString();\n    const id = globalThis.crypto.randomUUID();\n    const metadata: UpstashMemoryMetadata = {\n      content: memory.content,\n      userId: memory.userId,\n      agentId: memory.agentId,\n      sessionId: memory.sessionId,\n      metadata: memory.metadata ?? {},\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    try {\n      await index.upsert({ id, vector: memory.embedding, metadata }, this.namespaceOptions());\n      return metadataToMemory(id, memory.embedding, metadata);\n    } catch (error) {\n      throw new StorageError(`Failed to insert memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async search(\n    embedding: number[],\n    scope: MemoryScope,\n    limit: number,\n  ): Promise<MemorySearchResult[]> {\n    const index = this.requireIndex();\n    const filter = buildScopeFilter(scope);\n\n    try {\n      const results = await index.query(\n        {\n          vector: embedding,\n          topK: limit,\n          filter,\n          includeMetadata: true,\n          includeVectors: true,\n        },\n        this.namespaceOptions(),\n      );\n\n      return results.map((row) => {\n        const meta = row.metadata ?? {\n          content: \"\",\n          metadata: {},\n          createdAt: new Date(0).toISOString(),\n          updatedAt: new Date(0).toISOString(),\n        };\n        return {\n          memory: metadataToMemory(String(row.id), row.vector, meta),\n          score: row.score,\n        };\n      });\n    } catch (error) {\n      throw new StorageError(`Failed to search memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    const index = this.requireIndex();\n\n    try {\n      const memories: Memory[] = [];\n      let cursor: number | string = 0;\n\n      for (;;) {\n        const page = await index.range(\n          {\n            cursor,\n            limit: RANGE_PAGE_SIZE,\n            includeMetadata: true,\n            includeVectors: true,\n          },\n          this.namespaceOptions(),\n        );\n\n        for (const row of page.vectors) {\n          if (!row.metadata) continue;\n          const memory = metadataToMemory(String(row.id), row.vector, row.metadata);\n          if (matchesScope(scope, memory)) {\n            memories.push(memory);\n          }\n        }\n\n        if (!page.nextCursor || page.vectors.length === 0) break;\n        cursor = page.nextCursor;\n      }\n\n      return memories.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n    } catch (error) {\n      throw new StorageError(`Failed to list memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    const index = this.requireIndex();\n    try {\n      await index.delete(id, this.namespaceOptions());\n    } catch (error) {\n      throw new StorageError(`Failed to delete memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    const index = this.requireIndex();\n    if (!scope.userId && !scope.agentId && !scope.sessionId) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n\n    const filter = buildScopeFilter(scope);\n    if (!filter) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n\n    try {\n      await index.delete({ filter }, this.namespaceOptions());\n    } catch (error) {\n      throw new StorageError(`Failed to delete memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async close(): Promise<void> {\n    this.index = null;\n  }\n}\n","import type { Memory, MemoryScope, MemorySearchResult, StorageAdapter } from \"../types.js\";\nimport { ConfigError, DimensionMismatchError, StorageError } from \"../errors.js\";\n\nexport interface PineconeStorageOptions {\n  /** Pinecone API key. Falls back to `PINECONE_API_KEY`. */\n  apiKey?: string;\n  /** Pinecone index name (used with `describeIndex` to resolve host). Falls back to `PINECONE_INDEX`. */\n  index?: string;\n  /** Direct index host (skips `describeIndex` lookup). Falls back to `PINECONE_INDEX_HOST`. */\n  host?: string;\n  /** Optional Pinecone namespace. */\n  namespace?: string;\n  /**\n   * Inject a preconfigured Pinecone index client (for tests). When set,\n   * `apiKey`, `index`, and `host` are ignored.\n   */\n  indexClient?: PineconeIndexClient;\n}\n\n/** Minimal Pinecone index client surface used by the adapter. */\nexport interface PineconeIndexClient {\n  describeIndexStats(): Promise<{ dimension?: number }>;\n  upsert(args: {\n    records: Array<{ id: string; values: number[]; metadata?: PineconeMemoryMetadata }>;\n  }): Promise<void>;\n  fetch(args: { ids: string[] }): Promise<{\n    records: Record<string, { id: string; values?: number[]; metadata?: PineconeMemoryMetadata } | undefined>;\n  }>;\n  query(args: {\n    vector: number[];\n    topK: number;\n    filter?: Record<string, unknown>;\n    includeMetadata?: boolean;\n    includeValues?: boolean;\n  }): Promise<{\n    matches: Array<{\n      id: string;\n      score?: number;\n      values?: number[];\n      metadata?: PineconeMemoryMetadata;\n    }>;\n  }>;\n  fetchByMetadata(args: {\n    filter: Record<string, unknown>;\n    limit?: number;\n    paginationToken?: string;\n  }): Promise<{\n    /** Pinecone SDK v8 returns a record map; older mocks may use an array. */\n    records:\n      | Array<{ id: string; values?: number[]; metadata?: PineconeMemoryMetadata }>\n      | Record<string, { id?: string; values?: number[]; metadata?: PineconeMemoryMetadata }>;\n    pagination?: { next?: string };\n  }>;\n  deleteOne(args: { id: string }): Promise<void>;\n  deleteMany(args: { filter: Record<string, unknown> } | { ids: string[] }): Promise<void>;\n  listPaginated(args?: {\n    limit?: number;\n    paginationToken?: string;\n  }): Promise<{\n    vectors: Array<{ id: string }>;\n    pagination?: { next?: string };\n  }>;\n}\n\nexport type PineconeMemoryMetadata = {\n  content: string;\n  userId?: string;\n  agentId?: string;\n  sessionId?: string;\n  /** JSON-serialised user metadata (Pinecone supports flat metadata only). */\n  metadataJson: string;\n  createdAt: string;\n  updatedAt: string;\n};\n\nconst PEER_DEPS_MESSAGE =\n  'storage: \"pinecone\" requires optional peer dependency `@pinecone-database/pinecone`. Install it with: npm install @pinecone-database/pinecone';\n\nconst PAGE_SIZE = 100;\nconst FETCH_BATCH_SIZE = 100;\n\nexport function buildPineconeScopeFilter(scope: MemoryScope): Record<string, unknown> | undefined {\n  const parts: Record<string, unknown>[] = [];\n  if (scope.userId) {\n    parts.push({ userId: { $eq: scope.userId } });\n  }\n  if (scope.agentId) {\n    parts.push({ agentId: { $eq: scope.agentId } });\n  }\n  if (scope.sessionId) {\n    parts.push({ sessionId: { $eq: scope.sessionId } });\n  }\n  if (parts.length === 0) return undefined;\n  if (parts.length === 1) return parts[0];\n  return { $and: parts };\n}\n\nfunction matchesScope(\n  scope: MemoryScope,\n  memory: Pick<Memory, \"userId\" | \"agentId\" | \"sessionId\">,\n): boolean {\n  if (scope.userId !== undefined && memory.userId !== scope.userId) return false;\n  if (scope.agentId !== undefined && memory.agentId !== scope.agentId) return false;\n  if (scope.sessionId !== undefined && memory.sessionId !== scope.sessionId) return false;\n  return true;\n}\n\nfunction parseUserMetadata(metadataJson: string | undefined): Record<string, unknown> {\n  if (!metadataJson) return {};\n  try {\n    const parsed: unknown = JSON.parse(metadataJson);\n    if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n      return parsed as Record<string, unknown>;\n    }\n    return {};\n  } catch {\n    return {};\n  }\n}\n\nfunction memoryToMetadata(\n  memory: Pick<Memory, \"content\" | \"userId\" | \"agentId\" | \"sessionId\" | \"metadata\">,\n  createdAt: string,\n  updatedAt: string,\n): PineconeMemoryMetadata {\n  return {\n    content: memory.content,\n    userId: memory.userId,\n    agentId: memory.agentId,\n    sessionId: memory.sessionId,\n    metadataJson: JSON.stringify(memory.metadata ?? {}),\n    createdAt,\n    updatedAt,\n  };\n}\n\ntype FetchByMetadataRecord = {\n  id: string;\n  values?: number[];\n  metadata?: PineconeMemoryMetadata;\n};\n\nfunction normalizeFetchByMetadataRecords(\n  records:\n    | Array<{ id: string; values?: number[]; metadata?: PineconeMemoryMetadata }>\n    | Record<string, { id?: string; values?: number[]; metadata?: PineconeMemoryMetadata }>,\n): FetchByMetadataRecord[] {\n  if (Array.isArray(records)) {\n    return records;\n  }\n  return Object.entries(records).map(([key, record]) => ({\n    id: record.id ?? key,\n    values: record.values,\n    metadata: record.metadata,\n  }));\n}\n\nfunction metadataToMemory(\n  id: string,\n  vector: number[] | undefined,\n  meta: PineconeMemoryMetadata,\n): Memory {\n  return {\n    id,\n    content: meta.content,\n    embedding: vector ?? [],\n    userId: meta.userId,\n    agentId: meta.agentId,\n    sessionId: meta.sessionId,\n    metadata: parseUserMetadata(meta.metadataJson),\n    createdAt: new Date(meta.createdAt),\n    updatedAt: new Date(meta.updatedAt),\n  };\n}\n\nasync function loadPineconeIndex(options: PineconeStorageOptions): Promise<PineconeIndexClient> {\n  if (options.indexClient) return options.indexClient;\n\n  const apiKey = options.apiKey ?? process.env.PINECONE_API_KEY;\n  const indexName = options.index ?? process.env.PINECONE_INDEX;\n  const host = options.host ?? process.env.PINECONE_INDEX_HOST;\n\n  if (!apiKey) {\n    throw new ConfigError(\n      \"Pinecone API key is required. Set pinecone.apiKey or PINECONE_API_KEY.\",\n    );\n  }\n  if (!indexName && !host) {\n    throw new ConfigError(\n      \"Pinecone index name or host is required. Set pinecone.index/host or PINECONE_INDEX/PINECONE_INDEX_HOST.\",\n    );\n  }\n\n  try {\n    const { Pinecone } = await import(\"@pinecone-database/pinecone\");\n    const pc = new Pinecone({ apiKey });\n\n    let index: PineconeIndexClient;\n    if (indexName && host) {\n      index = pc.index(indexName, host) as unknown as PineconeIndexClient;\n    } else if (indexName) {\n      index = pc.index(indexName) as unknown as PineconeIndexClient;\n    } else {\n      throw new ConfigError(\n        \"PINECONE_INDEX is required when only PINECONE_INDEX_HOST is set.\",\n      );\n    }\n\n    if (options.namespace) {\n      index = (index as unknown as { namespace: (ns: string) => PineconeIndexClient }).namespace(\n        options.namespace,\n      );\n    }\n\n    return index;\n  } catch (error) {\n    if (error instanceof ConfigError) throw error;\n    const detail = error instanceof Error ? error.message : String(error);\n    throw new ConfigError(`${PEER_DEPS_MESSAGE} (${detail})`);\n  }\n}\n\nexport class PineconeStorageAdapter implements StorageAdapter {\n  private index: PineconeIndexClient | null = null;\n  private dimensions = 0;\n  private readonly options: PineconeStorageOptions;\n\n  constructor(options: PineconeStorageOptions = {}) {\n    this.options = options;\n  }\n\n  private requireIndex(): PineconeIndexClient {\n    if (!this.index) {\n      throw new StorageError(\"Pinecone storage not initialised. Call init() first.\");\n    }\n    return this.index;\n  }\n\n  async init(dimensions: number): Promise<void> {\n    if (!Number.isInteger(dimensions) || dimensions <= 0) {\n      throw new StorageError(`Invalid embedding dimensions: ${dimensions}`);\n    }\n    this.dimensions = dimensions;\n\n    try {\n      this.index = await loadPineconeIndex(this.options);\n      const stats = await this.index.describeIndexStats();\n      const indexDimension = stats.dimension;\n\n      if (indexDimension !== undefined && indexDimension !== dimensions) {\n        throw new DimensionMismatchError(\n          `Pinecone index was created with ${indexDimension}-dimensional vectors but the configured embedding adapter produces ${dimensions}-dimensional vectors. Create a new index with matching dimensions or use a matching embedding model.`,\n        );\n      }\n    } catch (error) {\n      if (error instanceof DimensionMismatchError) throw error;\n      if (error instanceof ConfigError) throw error;\n      throw new StorageError(\n        `Failed to initialise Pinecone storage: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  async update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory> {\n    const index = this.requireIndex();\n    if (patch.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${patch.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n\n    const now = new Date().toISOString();\n\n    try {\n      const fetched = await index.fetch({ ids: [id] });\n      const existing = fetched.records[id];\n      if (!existing?.metadata) {\n        throw new StorageError(`Memory not found: ${id}`);\n      }\n\n      const metadata = memoryToMetadata(\n        {\n          content: patch.content,\n          userId: existing.metadata.userId,\n          agentId: existing.metadata.agentId,\n          sessionId: existing.metadata.sessionId,\n          metadata: patch.metadata ?? parseUserMetadata(existing.metadata.metadataJson),\n        },\n        existing.metadata.createdAt,\n        now,\n      );\n\n      await index.upsert({ records: [{ id, values: patch.embedding, metadata }] });\n      return metadataToMemory(id, patch.embedding, metadata);\n    } catch (error) {\n      if (error instanceof StorageError) throw error;\n      throw new StorageError(`Failed to update memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory> {\n    const index = this.requireIndex();\n    if (memory.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${memory.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n\n    const now = new Date().toISOString();\n    const id = globalThis.crypto.randomUUID();\n    const metadata = memoryToMetadata(memory, now, now);\n\n    try {\n      await index.upsert({ records: [{ id, values: memory.embedding, metadata }] });\n      return metadataToMemory(id, memory.embedding, metadata);\n    } catch (error) {\n      throw new StorageError(`Failed to insert memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async search(\n    embedding: number[],\n    scope: MemoryScope,\n    limit: number,\n  ): Promise<MemorySearchResult[]> {\n    const index = this.requireIndex();\n    const filter = buildPineconeScopeFilter(scope);\n\n    try {\n      const response = await index.query({\n        vector: embedding,\n        topK: limit,\n        filter,\n        includeMetadata: true,\n        includeValues: true,\n      });\n\n      return response.matches.map((match) => {\n        const meta = match.metadata ?? {\n          content: \"\",\n          metadataJson: \"{}\",\n          createdAt: new Date(0).toISOString(),\n          updatedAt: new Date(0).toISOString(),\n        };\n        return {\n          memory: metadataToMemory(match.id, match.values, meta),\n          score: match.score ?? 0,\n        };\n      });\n    } catch (error) {\n      throw new StorageError(`Failed to search memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    const index = this.requireIndex();\n    const filter = buildPineconeScopeFilter(scope);\n\n    try {\n      const memories: Memory[] = [];\n\n      if (filter) {\n        let paginationToken: string | undefined;\n        for (;;) {\n          const page = await index.fetchByMetadata({\n            filter,\n            limit: PAGE_SIZE,\n            paginationToken,\n          });\n          for (const record of normalizeFetchByMetadataRecords(page.records)) {\n            if (!record.metadata) continue;\n            memories.push(metadataToMemory(record.id, record.values, record.metadata));\n          }\n          if (!page.pagination?.next) break;\n          paginationToken = page.pagination.next;\n        }\n      } else {\n        let paginationToken: string | undefined;\n        for (;;) {\n          const page = await index.listPaginated({ limit: PAGE_SIZE, paginationToken });\n          const ids = page.vectors.map((v) => v.id);\n\n          for (let i = 0; i < ids.length; i += FETCH_BATCH_SIZE) {\n            const batch = ids.slice(i, i + FETCH_BATCH_SIZE);\n            if (batch.length === 0) continue;\n            const fetched = await index.fetch({ ids: batch });\n            for (const id of batch) {\n              const record = fetched.records[id];\n              if (!record?.metadata) continue;\n              const memory = metadataToMemory(id, record.values, record.metadata);\n              if (matchesScope(scope, memory)) {\n                memories.push(memory);\n              }\n            }\n          }\n\n          if (!page.pagination?.next) break;\n          paginationToken = page.pagination.next;\n        }\n      }\n\n      return memories.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n    } catch (error) {\n      throw new StorageError(`Failed to list memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    const index = this.requireIndex();\n    try {\n      await index.deleteOne({ id });\n    } catch (error) {\n      throw new StorageError(`Failed to delete memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    const index = this.requireIndex();\n    if (!scope.userId && !scope.agentId && !scope.sessionId) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n\n    const filter = buildPineconeScopeFilter(scope);\n    if (!filter) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n\n    try {\n      await index.deleteMany({ filter });\n    } catch (error) {\n      throw new StorageError(`Failed to delete memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async close(): Promise<void> {\n    this.index = null;\n  }\n}\n","import { z } from \"zod\";\n\n/**\n * Input message format — matches the OpenAI/Anthropic message shape.\n */\nexport const MessageSchema = z.object({\n  role: z.enum([\"user\", \"assistant\", \"system\", \"tool\"]),\n  content: z.string(),\n});\nexport type Message = z.infer<typeof MessageSchema>;\n\nexport const MessagesSchema = z.array(MessageSchema);\n\n/**\n * A stored memory fact.\n */\nexport interface Memory {\n  id: string;\n  /** The extracted fact, in plain English. */\n  content: string;\n  /** Vector embedding of the content. */\n  embedding: number[];\n  userId?: string;\n  agentId?: string;\n  sessionId?: string;\n  metadata: Record<string, unknown>;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\n/**\n * Result from {@link TurboMemory.search}.\n */\nexport interface MemorySearchResult {\n  memory: Memory;\n  /** Cosine similarity score, 0–1. */\n  score: number;\n}\n\n/**\n * Scope for operations — provide at least one of userId or agentId.\n */\nexport interface MemoryScope {\n  userId?: string;\n  agentId?: string;\n  sessionId?: string;\n}\n\nexport const MemoryScopeSchema = z.object({\n  userId: z.string().optional(),\n  agentId: z.string().optional(),\n  sessionId: z.string().optional(),\n});\n\n/**\n * Pluggable embedding backend.\n */\nexport interface EmbeddingAdapter {\n  embed(text: string): Promise<number[]>;\n  embedBatch(texts: string[]): Promise<number[][]>;\n  readonly dimensions: number;\n}\n\n/**\n * Pluggable storage backend.\n */\nexport interface StorageAdapter {\n  /**\n   * Initialise the store. Receives the embedding dimensions so the underlying\n   * vector column can be created with a matching size.\n   */\n  init(dimensions: number): Promise<void>;\n  insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory>;\n  update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory>;\n  search(embedding: number[], scope: MemoryScope, limit: number): Promise<MemorySearchResult[]>;\n  getAll(scope: MemoryScope): Promise<Memory[]>;\n  delete(id: string): Promise<void>;\n  deleteAll(scope: MemoryScope): Promise<void>;\n  /** Release any held resources (file handles, db connections). */\n  close?(): Promise<void>;\n}\n\n/** Supported providers for LLM-based fact extraction. */\nexport type ExtractionProvider = \"openai\" | \"anthropic\" | \"google\";\n\nexport interface ExtractionConfig {\n  provider: ExtractionProvider;\n  model: string;\n  apiKey?: string;\n  baseURL?: string;\n}\n\nexport interface OpenAIConfig {\n  apiKey?: string;\n  baseURL?: string;\n}\n\n/** Options for the Voyage embedding adapter. */\nexport interface VoyageConfig {\n  apiKey?: string;\n  baseURL?: string;\n  model?: string;\n  dimensions?: number;\n}\n\n/** Options for the Google (Gemini) embedding adapter. */\nexport interface GoogleConfig {\n  apiKey?: string;\n  baseURL?: string;\n  model?: string;\n  dimensions?: number;\n}\n\n/** How overlapping memories are handled on write. */\nexport type DeduplicationStrategy = \"replace\" | \"skip\" | \"merge\";\n\n/** Controls semantic deduplication during {@link TurboMemory.add} / {@link TurboMemory.addFacts}. */\nexport interface DeduplicationConfig {\n  /** Default true. Set false to always insert new rows. */\n  enabled?: boolean;\n  /** Cosine similarity threshold (0–1). Default 0.92. */\n  threshold?: number;\n  /** Default \"merge\". */\n  strategy?: DeduplicationStrategy;\n  /** Max similar memories to retrieve for merge / consolidation. Default 5. */\n  mergeTopK?: number;\n}\n\n/**\n * Configuration for the {@link TurboMemory} class.\n */\nexport interface TurboMemoryConfig {\n  embeddings: \"openai\" | \"local\" | \"voyage\" | \"google\" | EmbeddingAdapter;\n  storage?: \"pglite\" | \"sqlite-vec\" | \"upstash-vector\" | \"pinecone\" | StorageAdapter;\n  extraction: ExtractionConfig;\n  openai?: OpenAIConfig;\n  /** Options forwarded to the Voyage embedding adapter. */\n  voyage?: VoyageConfig;\n  /** Options forwarded to the Google embedding adapter. */\n  google?: GoogleConfig;\n  pglite?: {\n    /**\n     * Persistence location. Defaults to `.turbomem` in `process.cwd()` on Node,\n     * or `idb://turbomem` in the browser. Prefix with `idb://` for IndexedDB.\n     */\n    dataDir?: string;\n    /** Use an in-memory database (ignores `dataDir`). Handy for tests. */\n    inMemory?: boolean;\n    /**\n     * When true, PGlite returns before IndexedDB flushes complete. Defaults to\n     * `true` for `idb://` paths.\n     */\n    relaxedDurability?: boolean;\n  };\n  sqliteVec?: {\n    /** Defaults to `.turbomem.sqlite` in `process.cwd()`. */\n    dbPath?: string;\n    /** Use an in-memory database. Handy for tests. */\n    inMemory?: boolean;\n  };\n  upstashVector?: {\n    /** Upstash Vector REST URL. Falls back to `UPSTASH_VECTOR_REST_URL`. */\n    url?: string;\n    /** Upstash Vector REST token. Falls back to `UPSTASH_VECTOR_REST_TOKEN`. */\n    token?: string;\n    /** Optional Upstash namespace. */\n    namespace?: string;\n  };\n  pinecone?: {\n    /** Pinecone API key. Falls back to `PINECONE_API_KEY`. */\n    apiKey?: string;\n    /** Pinecone index name. Falls back to `PINECONE_INDEX`. */\n    index?: string;\n    /** Direct index host (skips `describeIndex` lookup). Falls back to `PINECONE_INDEX_HOST`. */\n    host?: string;\n    /** Optional Pinecone namespace. */\n    namespace?: string;\n  };\n  /** Options forwarded to the local (transformers) embedding adapter. */\n  local?: {\n    model?: string;\n  };\n  /** Semantic deduplication on write. Enabled by default. */\n  deduplication?: DeduplicationConfig;\n}\n","import type {\n  EmbeddingAdapter,\n  Memory,\n  MemoryScope,\n  MemorySearchResult,\n  Message,\n  StorageAdapter,\n  TurboMemoryConfig,\n} from \"./types.js\";\nimport { MessagesSchema } from \"./types.js\";\nimport { ConfigError, NotInitialisedError } from \"./errors.js\";\nimport { OpenAIEmbeddingAdapter } from \"./embeddings/openai.js\";\nimport { TransformersEmbeddingAdapter } from \"./embeddings/transformers.js\";\nimport { VoyageEmbeddingAdapter } from \"./embeddings/voyage.js\";\nimport { GoogleEmbeddingAdapter } from \"./embeddings/google.js\";\nimport { Extractor } from \"./extraction/extractor.js\";\nimport { Merger } from \"./deduplication/merger.js\";\nimport { resolveDeduplicationConfig } from \"./deduplication/resolve-config.js\";\nimport { upsertFact } from \"./deduplication/upsert-fact.js\";\n\nconst DEFAULT_SEARCH_LIMIT = 10;\n\n/**\n * The single entry point for turbomem. Wires together an embedding adapter, a\n * storage adapter, and an LLM-based fact extractor.\n */\nexport class TurboMemory {\n  private readonly config: TurboMemoryConfig;\n  private readonly embeddingAdapter: EmbeddingAdapter;\n  private storageAdapter: StorageAdapter | null = null;\n  private readonly extractor: Extractor;\n  private readonly merger: Merger;\n  private readonly deduplicationConfig: ReturnType<typeof resolveDeduplicationConfig>;\n  private initialised = false;\n  private initPromise: Promise<void> | null = null;\n\n  constructor(config: TurboMemoryConfig) {\n    this.config = config;\n    this.embeddingAdapter = TurboMemory.resolveEmbeddingAdapter(config);\n    if (typeof config.storage === \"object\" && config.storage !== null) {\n      this.storageAdapter = config.storage;\n    }\n    this.extractor = new Extractor({\n      config: {\n        ...config.extraction,\n        apiKey: config.extraction.apiKey ?? TurboMemory.fallbackExtractionKey(config),\n        baseURL: config.extraction.baseURL ?? config.openai?.baseURL,\n      },\n    });\n    this.merger = new Merger({\n      config: {\n        ...config.extraction,\n        apiKey: config.extraction.apiKey ?? TurboMemory.fallbackExtractionKey(config),\n        baseURL: config.extraction.baseURL ?? config.openai?.baseURL,\n      },\n    });\n    this.deduplicationConfig = resolveDeduplicationConfig(config.deduplication);\n  }\n\n  private static fallbackExtractionKey(config: TurboMemoryConfig): string | undefined {\n    if (config.extraction.provider === \"openai\") return config.openai?.apiKey;\n    if (config.extraction.provider === \"google\") return config.google?.apiKey;\n    return undefined;\n  }\n\n  private static resolveEmbeddingAdapter(config: TurboMemoryConfig): EmbeddingAdapter {\n    const { embeddings } = config;\n    if (embeddings === \"openai\") {\n      return new OpenAIEmbeddingAdapter({\n        apiKey: config.openai?.apiKey,\n        baseURL: config.openai?.baseURL,\n      });\n    }\n    if (embeddings === \"local\") {\n      return new TransformersEmbeddingAdapter({ model: config.local?.model });\n    }\n    if (embeddings === \"voyage\") {\n      return new VoyageEmbeddingAdapter({\n        apiKey: config.voyage?.apiKey,\n        baseURL: config.voyage?.baseURL,\n        model: config.voyage?.model,\n        dimensions: config.voyage?.dimensions,\n      });\n    }\n    if (embeddings === \"google\") {\n      return new GoogleEmbeddingAdapter({\n        apiKey: config.google?.apiKey,\n        baseURL: config.google?.baseURL,\n        model: config.google?.model,\n        dimensions: config.google?.dimensions,\n      });\n    }\n    if (typeof embeddings === \"object\" && embeddings !== null) {\n      return embeddings;\n    }\n    throw new ConfigError(`Invalid embeddings config: ${String(embeddings)}`);\n  }\n\n  private async ensureStorageAdapter(): Promise<StorageAdapter> {\n    if (this.storageAdapter) return this.storageAdapter;\n\n    const storage = this.config.storage ?? \"pglite\";\n    if (storage === \"pglite\") {\n      const { PGliteStorageAdapter } = await import(\"./storage/pglite.js\");\n      this.storageAdapter = new PGliteStorageAdapter({\n        dataDir: this.config.pglite?.dataDir,\n        inMemory: this.config.pglite?.inMemory,\n        relaxedDurability: this.config.pglite?.relaxedDurability,\n      });\n      return this.storageAdapter;\n    }\n    if (storage === \"sqlite-vec\") {\n      const { SqliteVecStorageAdapter } = await import(\"./storage/sqlite-vec.js\");\n      this.storageAdapter = new SqliteVecStorageAdapter({\n        dbPath: this.config.sqliteVec?.dbPath,\n        inMemory: this.config.sqliteVec?.inMemory,\n      });\n      return this.storageAdapter;\n    }\n    if (storage === \"upstash-vector\") {\n      const { UpstashVectorStorageAdapter } = await import(\"./storage/upstash-vector.js\");\n      this.storageAdapter = new UpstashVectorStorageAdapter({\n        url: this.config.upstashVector?.url,\n        token: this.config.upstashVector?.token,\n        namespace: this.config.upstashVector?.namespace,\n      });\n      return this.storageAdapter;\n    }\n    if (storage === \"pinecone\") {\n      const { PineconeStorageAdapter } = await import(\"./storage/pinecone.js\");\n      this.storageAdapter = new PineconeStorageAdapter({\n        apiKey: this.config.pinecone?.apiKey,\n        index: this.config.pinecone?.index,\n        host: this.config.pinecone?.host,\n        namespace: this.config.pinecone?.namespace,\n      });\n      return this.storageAdapter;\n    }\n    throw new ConfigError(`Invalid storage config: ${String(storage)}`);\n  }\n\n  private requireStorageAdapter(): StorageAdapter {\n    if (!this.storageAdapter) {\n      throw new NotInitialisedError();\n    }\n    return this.storageAdapter;\n  }\n\n  /**\n   * Initialise storage (run migrations, set up the vector column with the right\n   * dimensions). Idempotent — calling twice is a no-op and concurrent calls\n   * share a single initialisation.\n   */\n  async init(): Promise<void> {\n    if (this.initialised) return;\n    if (this.initPromise) return this.initPromise;\n\n    this.initPromise = (async () => {\n      const adapter = await this.ensureStorageAdapter();\n      await adapter.init(this.embeddingAdapter.dimensions);\n      this.initialised = true;\n    })();\n\n    try {\n      await this.initPromise;\n    } finally {\n      this.initPromise = null;\n    }\n  }\n\n  /**\n   * Extract facts from `messages`, embed them, and persist them.\n   * Returns the created {@link Memory} objects (empty if nothing memorable).\n   */\n  async add(messages: Message[], scope: MemoryScope): Promise<Memory[]> {\n    this.assertInitialised();\n    const parsed = MessagesSchema.parse(messages);\n\n    const facts = await this.extractor.extract(parsed);\n    if (facts.length === 0) return [];\n\n    const embeddings = await this.embeddingAdapter.embedBatch(facts);\n\n    const storage = this.requireStorageAdapter();\n    const created: Memory[] = [];\n    for (let i = 0; i < facts.length; i++) {\n      created.push(\n        await upsertFact(\n          storage,\n          this.embeddingAdapter,\n          this.merger,\n          this.deduplicationConfig,\n          facts[i],\n          embeddings[i],\n          scope,\n        ),\n      );\n    }\n    return created;\n  }\n\n  /**\n   * Store one or more raw facts directly, bypassing LLM extraction. Useful when\n   * the caller already knows exactly what to remember.\n   */\n  async addFacts(facts: string[], scope: MemoryScope): Promise<Memory[]> {\n    this.assertInitialised();\n    const cleaned = facts.map((f) => f.trim()).filter((f) => f.length > 0);\n    if (cleaned.length === 0) return [];\n\n    const embeddings = await this.embeddingAdapter.embedBatch(cleaned);\n    const storage = this.requireStorageAdapter();\n    const created: Memory[] = [];\n    for (let i = 0; i < cleaned.length; i++) {\n      created.push(\n        await upsertFact(\n          storage,\n          this.embeddingAdapter,\n          this.merger,\n          this.deduplicationConfig,\n          cleaned[i],\n          embeddings[i],\n          scope,\n        ),\n      );\n    }\n    return created;\n  }\n\n  /**\n   * Semantic search over stored memories, ranked by cosine similarity (highest\n   * score first).\n   */\n  async search(\n    query: string,\n    scope: MemoryScope & { limit?: number },\n  ): Promise<MemorySearchResult[]> {\n    this.assertInitialised();\n    const { limit = DEFAULT_SEARCH_LIMIT, ...rest } = scope;\n    const embedding = await this.embeddingAdapter.embed(query);\n    return this.requireStorageAdapter().search(embedding, rest, limit);\n  }\n\n  /** Return every memory for the given scope (newest first). */\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    this.assertInitialised();\n    return this.requireStorageAdapter().getAll(scope);\n  }\n\n  /** Delete a single memory by id. */\n  async delete(id: string): Promise<void> {\n    this.assertInitialised();\n    return this.requireStorageAdapter().delete(id);\n  }\n\n  /** Delete every memory matching the given scope. */\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    this.assertInitialised();\n    return this.requireStorageAdapter().deleteAll(scope);\n  }\n\n  /** Release underlying resources (e.g. the database connection). */\n  async close(): Promise<void> {\n    if (this.storageAdapter?.close) {\n      await this.storageAdapter.close();\n    }\n    this.initialised = false;\n  }\n\n  /** Generate a fresh id (exposed for adapters/tests). */\n  static newId(): string {\n    return globalThis.crypto.randomUUID();\n  }\n\n  private assertInitialised(): void {\n    if (!this.initialised) {\n      throw new NotInitialisedError();\n    }\n  }\n}\n","import OpenAI from \"openai\";\nimport type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError, ConfigError } from \"../errors.js\";\nimport { chunkArray } from \"../utils/chunking.js\";\n\n/** OpenAI embedding models and their output dimensions. */\nconst MODEL_DIMENSIONS: Record<string, number> = {\n  \"text-embedding-3-small\": 1536,\n  \"text-embedding-3-large\": 3072,\n  \"text-embedding-ada-002\": 1536,\n};\n\nconst MAX_BATCH = 100;\n\nexport type OpenAIEmbeddingModel = keyof typeof MODEL_DIMENSIONS | (string & Record<never, never>);\n\nexport interface OpenAIEmbeddingOptions {\n  apiKey?: string;\n  baseURL?: string;\n  /** Defaults to `text-embedding-3-small`. */\n  model?: OpenAIEmbeddingModel;\n  /** Override the dimension count (required for unknown models). */\n  dimensions?: number;\n  /** Inject a pre-built client (used in tests). */\n  client?: OpenAI;\n}\n\nexport class OpenAIEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly client: OpenAI;\n  private readonly model: string;\n\n  constructor(options: OpenAIEmbeddingOptions = {}) {\n    this.model = options.model ?? \"text-embedding-3-small\";\n\n    const resolvedDimensions = options.dimensions ?? MODEL_DIMENSIONS[this.model];\n    if (!resolvedDimensions) {\n      throw new ConfigError(\n        `Unknown OpenAI embedding model \"${this.model}\". Pass an explicit \\`dimensions\\` value.`,\n      );\n    }\n    this.dimensions = resolvedDimensions;\n\n    if (options.client) {\n      this.client = options.client;\n    } else {\n      const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;\n      if (!apiKey) {\n        throw new ConfigError(\n          \"OpenAI API key missing. Set OPENAI_API_KEY or pass openai.apiKey in the config.\",\n        );\n      }\n      this.client = new OpenAI({ apiKey, baseURL: options.baseURL });\n    }\n  }\n\n  async embed(text: string): Promise<number[]> {\n    const [vector] = await this.embedBatch([text]);\n    return vector;\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) return [];\n\n    try {\n      // One request when under the limit; otherwise chunk into groups of 100.\n      if (texts.length <= MAX_BATCH) {\n        return await this.requestEmbeddings(texts);\n      }\n\n      const batches = chunkArray(texts, MAX_BATCH);\n      const results = await Promise.all(batches.map((batch) => this.requestEmbeddings(batch)));\n      return results.flat();\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `OpenAI embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private async requestEmbeddings(input: string[]): Promise<number[][]> {\n    const response = await this.client.embeddings.create({\n      model: this.model,\n      input,\n    });\n\n    // Preserve input ordering — the API may return out of order.\n    return response.data\n      .slice()\n      .sort((a, b) => a.index - b.index)\n      .map((item) => item.embedding as number[]);\n  }\n}\n","import type { Message } from \"../types.js\";\n\n/**\n * Split an array into fixed-size chunks. Useful for batching embedding requests\n * so we respect provider request limits.\n */\nexport function chunkArray<T>(items: T[], size: number): T[][] {\n  if (size <= 0) throw new Error(\"Chunk size must be a positive integer\");\n  const chunks: T[][] = [];\n  for (let i = 0; i < items.length; i += size) {\n    chunks.push(items.slice(i, i + size));\n  }\n  return chunks;\n}\n\n/**\n * Render a list of messages into a single plain-text transcript suitable for\n * feeding to an extraction LLM.\n */\nexport function formatTranscript(messages: Message[]): string {\n  return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n}\n","import type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError } from \"../errors.js\";\n\n/** Known local models and their output dimensions. */\nconst MODEL_DIMENSIONS: Record<string, number> = {\n  \"Xenova/all-MiniLM-L6-v2\": 384,\n  \"Xenova/bge-small-en-v1.5\": 384,\n};\n\nconst DEFAULT_MODEL = \"Xenova/all-MiniLM-L6-v2\";\n\n/**\n * Module-level cache of feature-extraction pipelines, keyed by model id, so the\n * (relatively expensive) WASM model is only initialised once per process.\n */\nconst pipelineCache = new Map<string, Promise<unknown>>();\nlet warnedAboutDownload = false;\n\n// Minimal structural type for the transformers pipeline output we rely on.\ntype FeatureExtractionPipeline = (\n  text: string,\n  options: { pooling: \"mean\"; normalize: boolean },\n) => Promise<{ data: Float32Array | number[] }>;\n\nasync function loadPipeline(model: string): Promise<FeatureExtractionPipeline> {\n  let cached = pipelineCache.get(model);\n  if (!cached) {\n    if (!warnedAboutDownload) {\n      warnedAboutDownload = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        `[turbomem] Downloading local embedding model \"${model}\" (~25MB) on first use. This is cached afterwards.`,\n      );\n    }\n    cached = (async () => {\n      let transformers: typeof import(\"@huggingface/transformers\");\n      try {\n        transformers = await import(\"@huggingface/transformers\");\n      } catch (error) {\n        throw new EmbeddingError(\n          'The \"@huggingface/transformers\" package is required for local embeddings. Install it with `npm install @huggingface/transformers`.',\n          { cause: error },\n        );\n      }\n      return transformers.pipeline(\"feature-extraction\", model);\n    })();\n    pipelineCache.set(model, cached);\n  }\n  return (await cached) as FeatureExtractionPipeline;\n}\n\nexport interface TransformersEmbeddingOptions {\n  /** Defaults to `Xenova/all-MiniLM-L6-v2`. */\n  model?: string;\n  /** Override dimensions for an unknown model. */\n  dimensions?: number;\n}\n\nexport class TransformersEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly model: string;\n\n  constructor(options: TransformersEmbeddingOptions = {}) {\n    this.model = options.model ?? DEFAULT_MODEL;\n    this.dimensions = options.dimensions ?? MODEL_DIMENSIONS[this.model] ?? 384;\n  }\n\n  async embed(text: string): Promise<number[]> {\n    try {\n      const pipe = await loadPipeline(this.model);\n      const output = await pipe(text, { pooling: \"mean\", normalize: true });\n      return Array.from(output.data as ArrayLike<number>);\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Local embedding failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    // WASM is single-threaded — process sequentially rather than in parallel.\n    const results: number[][] = [];\n    for (const text of texts) {\n      results.push(await this.embed(text));\n    }\n    return results;\n  }\n}\n","import type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError, ConfigError } from \"../errors.js\";\nimport { chunkArray } from \"../utils/chunking.js\";\n\n/** Voyage embedding models and their default output dimensions. */\nconst MODEL_DIMENSIONS: Record<string, number> = {\n  \"voyage-3.5\": 1024,\n  \"voyage-3.5-lite\": 1024,\n  \"voyage-3-large\": 1024,\n  \"voyage-4\": 1024,\n  \"voyage-4-large\": 1024,\n  \"voyage-4-lite\": 1024,\n  \"voyage-code-3\": 1024,\n};\n\nconst DEFAULT_MODEL = \"voyage-4\";\nconst DEFAULT_ENDPOINT = \"https://api.voyageai.com/v1/embeddings\";\nconst MAX_BATCH = 128;\n\n/** Minimal fetch signature so a stub can be injected in tests. */\nexport type FetchLike = (\n  input: string,\n  init: {\n    method: string;\n    headers: Record<string, string>;\n    body: string;\n  },\n) => Promise<{\n  ok: boolean;\n  status: number;\n  text: () => Promise<string>;\n  json: () => Promise<unknown>;\n}>;\n\ninterface VoyageResponse {\n  data: { index: number; embedding: number[] }[];\n}\n\nexport type VoyageEmbeddingModel = keyof typeof MODEL_DIMENSIONS | (string & Record<never, never>);\n\nexport interface VoyageEmbeddingOptions {\n  apiKey?: string;\n  /** Full endpoint URL. Defaults to the public Voyage embeddings endpoint. */\n  baseURL?: string;\n  /** Defaults to `voyage-4`. */\n  model?: VoyageEmbeddingModel;\n  /** Override the dimension count (sent as `output_dimension`; default 1024). */\n  dimensions?: number;\n  /** Optional retrieval hint forwarded as `input_type` (`query` | `document`). */\n  inputType?: \"query\" | \"document\";\n  /** Inject a custom fetch implementation (used in tests). */\n  fetchImpl?: FetchLike;\n}\n\nexport class VoyageEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly apiKey: string;\n  private readonly endpoint: string;\n  private readonly model: string;\n  private readonly inputType?: \"query\" | \"document\";\n  private readonly outputDimension?: number;\n  private readonly fetchImpl: FetchLike;\n\n  constructor(options: VoyageEmbeddingOptions = {}) {\n    this.model = options.model ?? DEFAULT_MODEL;\n    this.dimensions = options.dimensions ?? MODEL_DIMENSIONS[this.model] ?? 1024;\n    // Only send output_dimension when it differs from the model default.\n    this.outputDimension =\n      options.dimensions && options.dimensions !== MODEL_DIMENSIONS[this.model]\n        ? options.dimensions\n        : undefined;\n    this.endpoint = options.baseURL ?? DEFAULT_ENDPOINT;\n    this.inputType = options.inputType;\n    this.fetchImpl = options.fetchImpl ?? ((globalThis as { fetch: FetchLike }).fetch);\n\n    const apiKey = options.apiKey ?? process.env.VOYAGE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\n        \"Voyage API key missing. Set VOYAGE_API_KEY or pass voyage.apiKey in the config.\",\n      );\n    }\n    this.apiKey = apiKey;\n  }\n\n  async embed(text: string): Promise<number[]> {\n    const [vector] = await this.embedBatch([text]);\n    return vector;\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) return [];\n\n    try {\n      if (texts.length <= MAX_BATCH) {\n        return await this.requestEmbeddings(texts);\n      }\n\n      const batches = chunkArray(texts, MAX_BATCH);\n      const results = await Promise.all(batches.map((batch) => this.requestEmbeddings(batch)));\n      return results.flat();\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Voyage embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private async requestEmbeddings(input: string[]): Promise<number[][]> {\n    const body: Record<string, unknown> = { model: this.model, input };\n    if (this.outputDimension) body.output_dimension = this.outputDimension;\n    if (this.inputType) body.input_type = this.inputType;\n\n    const response = await this.fetchImpl(this.endpoint, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new EmbeddingError(\n        `Voyage embedding request failed with status ${response.status}: ${detail}`,\n      );\n    }\n\n    const json = (await response.json()) as VoyageResponse;\n    // Preserve input ordering — the API may return out of order.\n    return json.data\n      .slice()\n      .sort((a, b) => a.index - b.index)\n      .map((item) => item.embedding);\n  }\n}\n","import type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError, ConfigError } from \"../errors.js\";\nimport type { FetchLike } from \"./voyage.js\";\n\nconst DEFAULT_MODEL = \"gemini-embedding-001\";\nconst DEFAULT_DIMENSIONS = 3072;\nconst DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\";\n\ninterface SingleResponse {\n  embedding: { values: number[] };\n}\n\ninterface BatchResponse {\n  embeddings: { values: number[] }[];\n}\n\n/** L2-normalize a vector to unit length. A no-op for already-normalized inputs. */\nfunction normalize(vector: number[]): number[] {\n  let sumSquares = 0;\n  for (const value of vector) sumSquares += value * value;\n  const magnitude = Math.sqrt(sumSquares);\n  if (magnitude === 0) return vector;\n  return vector.map((value) => value / magnitude);\n}\n\nexport interface GoogleEmbeddingOptions {\n  apiKey?: string;\n  /** Base URL for the Generative Language API. */\n  baseURL?: string;\n  /** Defaults to `gemini-embedding-001`. */\n  model?: string;\n  /** Output dimensionality (128-3072). Defaults to 3072. */\n  dimensions?: number;\n  /** Optional task type hint (e.g. `RETRIEVAL_DOCUMENT`). */\n  taskType?: string;\n  /** Inject a custom fetch implementation (used in tests). */\n  fetchImpl?: FetchLike;\n}\n\nexport class GoogleEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly apiKey: string;\n  private readonly baseURL: string;\n  private readonly model: string;\n  private readonly taskType?: string;\n  private readonly fetchImpl: FetchLike;\n\n  constructor(options: GoogleEmbeddingOptions = {}) {\n    this.model = options.model ?? DEFAULT_MODEL;\n    this.dimensions = options.dimensions ?? DEFAULT_DIMENSIONS;\n    this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n    this.taskType = options.taskType;\n    this.fetchImpl = options.fetchImpl ?? ((globalThis as { fetch: FetchLike }).fetch);\n\n    const apiKey = options.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\n        \"Google API key missing. Set GEMINI_API_KEY or pass google.apiKey in the config.\",\n      );\n    }\n    this.apiKey = apiKey;\n  }\n\n  private get outputDimensionality(): number | undefined {\n    return this.dimensions === DEFAULT_DIMENSIONS ? undefined : this.dimensions;\n  }\n\n  async embed(text: string): Promise<number[]> {\n    try {\n      const url = `${this.baseURL}/models/${this.model}:embedContent`;\n      const body: Record<string, unknown> = {\n        content: { parts: [{ text }] },\n      };\n      if (this.outputDimensionality) body.outputDimensionality = this.outputDimensionality;\n      if (this.taskType) body.taskType = this.taskType;\n\n      const json = (await this.request(url, body)) as SingleResponse;\n      return normalize(json.embedding.values);\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Google embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) return [];\n\n    try {\n      const url = `${this.baseURL}/models/${this.model}:batchEmbedContents`;\n      const requests = texts.map((text) => {\n        const req: Record<string, unknown> = {\n          model: `models/${this.model}`,\n          content: { parts: [{ text }] },\n        };\n        if (this.outputDimensionality) req.outputDimensionality = this.outputDimensionality;\n        if (this.taskType) req.taskType = this.taskType;\n        return req;\n      });\n\n      const json = (await this.request(url, { requests })) as BatchResponse;\n      return json.embeddings.map((item) => normalize(item.values));\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Google embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private async request(url: string, body: Record<string, unknown>): Promise<unknown> {\n    const response = await this.fetchImpl(url, {\n      method: \"POST\",\n      headers: {\n        \"x-goog-api-key\": this.apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new EmbeddingError(\n        `Google embedding request failed with status ${response.status}: ${detail}`,\n      );\n    }\n\n    return response.json();\n  }\n}\n","import type { ExtractionConfig, Message } from \"../types.js\";\nimport { ConfigError } from \"../errors.js\";\nimport { formatTranscript } from \"../utils/chunking.js\";\n\nexport const EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction system for an AI agent. Your job is to extract discrete, reusable facts from a conversation that would be useful to remember in future conversations.\n\nRules:\n- Extract facts that are about the USER, not about the AI's responses\n- Each fact should be a single, standalone statement\n- Facts should be in third person (e.g. \"The user prefers...\" not \"I prefer...\")\n- Only extract facts that are likely to be relevant in future conversations\n- Do not extract facts that are specific to the current task and won't matter later\n- Do not extract opinions the AI expressed\n- If no memorable facts exist, return an empty array\n\nReturn ONLY a JSON array of strings. No explanation, no markdown, no wrapper object.\nExample output: [\"The user prefers concise responses\", \"The user works in TypeScript\"]`;\n\n/**\n * Best-effort parse of an LLM response into an array of fact strings.\n * Tolerates models that wrap the array in markdown fences or a JSON object.\n */\nexport function parseFacts(raw: string): string[] {\n  if (!raw) return [];\n  let text = raw.trim();\n\n  // Strip markdown code fences if present.\n  const fenceMatch = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n  if (fenceMatch) text = fenceMatch[1].trim();\n\n  try {\n    const parsed: unknown = JSON.parse(text);\n    if (Array.isArray(parsed)) {\n      return parsed.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n    }\n    // Tolerate { facts: [...] } / { memories: [...] } wrappers.\n    if (parsed && typeof parsed === \"object\") {\n      for (const value of Object.values(parsed as Record<string, unknown>)) {\n        if (Array.isArray(value)) {\n          return value.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n        }\n      }\n    }\n  } catch {\n    // Fall through — attempt to locate a bare array within the text.\n    const arrayMatch = text.match(/\\[[\\s\\S]*\\]/);\n    if (arrayMatch) {\n      try {\n        const parsed: unknown = JSON.parse(arrayMatch[0]);\n        if (Array.isArray(parsed)) {\n          return parsed.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n        }\n      } catch {\n        /* give up */\n      }\n    }\n  }\n\n  return [];\n}\n\nexport interface ExtractorOptions {\n  config: ExtractionConfig;\n  /** Inject a custom completion function (used in tests). */\n  completion?: (system: string, user: string) => Promise<string>;\n}\n\n/**\n * Extracts discrete, reusable facts from a conversation using an LLM.\n * Extraction is treated as non-fatal: on any failure it logs a warning and\n * returns an empty array rather than throwing.\n */\nexport class Extractor {\n  private readonly config: ExtractionConfig;\n  private readonly completion: (system: string, user: string) => Promise<string>;\n\n  constructor(options: ExtractorOptions) {\n    this.config = options.config;\n    this.completion = options.completion ?? this.defaultCompletion.bind(this);\n  }\n\n  async extract(messages: Message[]): Promise<string[]> {\n    if (messages.length === 0) return [];\n\n    const transcript = formatTranscript(messages);\n    const user = `Conversation:\\n${transcript}`;\n\n    try {\n      const raw = await this.completion(EXTRACTION_SYSTEM_PROMPT, user);\n      return parseFacts(raw);\n    } catch (error) {\n      // Non-fatal: never block the add() flow on extraction issues.\n      // eslint-disable-next-line no-console\n      console.warn(`[turbomem] Fact extraction failed, skipping: ${(error as Error).message}`);\n      return [];\n    }\n  }\n\n  private async defaultCompletion(system: string, user: string): Promise<string> {\n    if (this.config.provider === \"openai\") {\n      return this.openaiCompletion(system, user);\n    }\n    if (this.config.provider === \"anthropic\") {\n      return this.anthropicCompletion(system, user);\n    }\n    if (this.config.provider === \"google\") {\n      return this.googleCompletion(system, user);\n    }\n    throw new ConfigError(`Unsupported extraction provider: ${this.config.provider as string}`);\n  }\n\n  private async openaiCompletion(system: string, user: string): Promise<string> {\n    const { default: OpenAI } = await import(\"openai\");\n    const apiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"OpenAI API key missing for extraction provider.\");\n    }\n    const client = new OpenAI({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.chat.completions.create({\n      model: this.config.model,\n      temperature: 0,\n      messages: [\n        { role: \"system\", content: system },\n        { role: \"user\", content: user },\n      ],\n    });\n    return response.choices[0]?.message?.content ?? \"\";\n  }\n\n  private async anthropicCompletion(system: string, user: string): Promise<string> {\n    let Anthropic: typeof import(\"@anthropic-ai/sdk\").default;\n    try {\n      Anthropic = (await import(\"@anthropic-ai/sdk\")).default;\n    } catch {\n      throw new ConfigError(\n        'The \"@anthropic-ai/sdk\" package is required for the anthropic extraction provider. Install it with `npm install @anthropic-ai/sdk`.',\n      );\n    }\n    const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Anthropic API key missing for extraction provider.\");\n    }\n    const client = new Anthropic({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.messages.create({\n      model: this.config.model,\n      max_tokens: 1024,\n      temperature: 0,\n      system,\n      messages: [{ role: \"user\", content: user }],\n    });\n    const block = response.content[0];\n    if (block && block.type === \"text\") return block.text;\n    return \"\";\n  }\n\n  private async googleCompletion(system: string, user: string): Promise<string> {\n    const apiKey =\n      this.config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Google API key missing for extraction provider.\");\n    }\n    const baseURL = (\n      this.config.baseURL ?? \"https://generativelanguage.googleapis.com/v1beta\"\n    ).replace(/\\/$/, \"\");\n    const url = `${baseURL}/models/${this.config.model}:generateContent`;\n\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"x-goog-api-key\": apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        system_instruction: { parts: [{ text: system }] },\n        contents: [{ role: \"user\", parts: [{ text: user }] }],\n        generationConfig: { temperature: 0 },\n      }),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new Error(`Google extraction request failed with status ${response.status}: ${detail}`);\n    }\n\n    const json = (await response.json()) as {\n      candidates?: { content?: { parts?: { text?: string }[] } }[];\n    };\n    return json.candidates?.[0]?.content?.parts?.[0]?.text ?? \"\";\n  }\n}\n","import type { ExtractionConfig } from \"../types.js\";\nimport { ConfigError } from \"../errors.js\";\n\nexport const MERGE_SYSTEM_PROMPT = `You are a memory consolidation system for an AI agent. You will receive one or more existing memory facts and one new fact that overlaps with them.\n\nYour job is to return a single consolidated fact that:\n- Is in third person (e.g. \"The user prefers...\" not \"I prefer...\")\n- Combines all unique details from the existing facts and the new fact\n- Prefers the new fact's information when there is a direct conflict\n- Is concise and standalone\n\nReturn ONLY the merged fact as plain text. No explanation, no markdown, no JSON wrapper.`;\n\nexport interface MergerOptions {\n  config: ExtractionConfig;\n  /** Inject a custom completion function (used in tests). */\n  completion?: (system: string, user: string) => Promise<string>;\n}\n\n/**\n * Consolidates overlapping memory facts using an LLM (Mem0-style multi-way merge).\n */\nexport class Merger {\n  private readonly config: ExtractionConfig;\n  private readonly completion: (system: string, user: string) => Promise<string>;\n\n  constructor(options: MergerOptions) {\n    this.config = options.config;\n    this.completion = options.completion ?? this.defaultCompletion.bind(this);\n  }\n\n  async mergeMany(existingFacts: string[], newFact: string): Promise<string> {\n    if (existingFacts.length === 0) return newFact.trim();\n\n    const lines = [\n      \"Existing facts:\",\n      ...existingFacts.map((f, i) => `${i + 1}. ${f}`),\n      \"\",\n      `New fact: ${newFact}`,\n    ];\n\n    const raw = await this.completion(MERGE_SYSTEM_PROMPT, lines.join(\"\\n\"));\n    const merged = raw.trim();\n    if (!merged) {\n      throw new Error(\"Merger returned empty content\");\n    }\n    return merged;\n  }\n\n  private async defaultCompletion(system: string, user: string): Promise<string> {\n    if (this.config.provider === \"openai\") {\n      return this.openaiCompletion(system, user);\n    }\n    if (this.config.provider === \"anthropic\") {\n      return this.anthropicCompletion(system, user);\n    }\n    if (this.config.provider === \"google\") {\n      return this.googleCompletion(system, user);\n    }\n    throw new ConfigError(`Unsupported extraction provider: ${this.config.provider as string}`);\n  }\n\n  private async openaiCompletion(system: string, user: string): Promise<string> {\n    const { default: OpenAI } = await import(\"openai\");\n    const apiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"OpenAI API key missing for merge provider.\");\n    }\n    const client = new OpenAI({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.chat.completions.create({\n      model: this.config.model,\n      temperature: 0,\n      messages: [\n        { role: \"system\", content: system },\n        { role: \"user\", content: user },\n      ],\n    });\n    return response.choices[0]?.message?.content ?? \"\";\n  }\n\n  private async anthropicCompletion(system: string, user: string): Promise<string> {\n    let Anthropic: typeof import(\"@anthropic-ai/sdk\").default;\n    try {\n      Anthropic = (await import(\"@anthropic-ai/sdk\")).default;\n    } catch {\n      throw new ConfigError(\n        'The \"@anthropic-ai/sdk\" package is required for the anthropic merge provider. Install it with `npm install @anthropic-ai/sdk`.',\n      );\n    }\n    const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Anthropic API key missing for merge provider.\");\n    }\n    const client = new Anthropic({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.messages.create({\n      model: this.config.model,\n      max_tokens: 1024,\n      temperature: 0,\n      system,\n      messages: [{ role: \"user\", content: user }],\n    });\n    const block = response.content[0];\n    if (block && block.type === \"text\") return block.text;\n    return \"\";\n  }\n\n  private async googleCompletion(system: string, user: string): Promise<string> {\n    const apiKey =\n      this.config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Google API key missing for merge provider.\");\n    }\n    const baseURL = (\n      this.config.baseURL ?? \"https://generativelanguage.googleapis.com/v1beta\"\n    ).replace(/\\/$/, \"\");\n    const url = `${baseURL}/models/${this.config.model}:generateContent`;\n\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"x-goog-api-key\": apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        system_instruction: { parts: [{ text: system }] },\n        contents: [{ role: \"user\", parts: [{ text: user }] }],\n        generationConfig: { temperature: 0 },\n      }),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new Error(`Google merge request failed with status ${response.status}: ${detail}`);\n    }\n\n    const json = (await response.json()) as {\n      candidates?: { content?: { parts?: { text?: string }[] } }[];\n    };\n    return json.candidates?.[0]?.content?.parts?.[0]?.text ?? \"\";\n  }\n}\n","import type { DeduplicationConfig } from \"../types.js\";\n\nexport interface ResolvedDeduplicationConfig {\n  enabled: boolean;\n  threshold: number;\n  strategy: \"replace\" | \"skip\" | \"merge\";\n  mergeTopK: number;\n}\n\nconst DEFAULT_THRESHOLD = 0.92;\nconst DEFAULT_MERGE_TOP_K = 5;\n\nexport function resolveDeduplicationConfig(\n  config?: DeduplicationConfig,\n): ResolvedDeduplicationConfig {\n  return {\n    enabled: config?.enabled ?? true,\n    threshold: config?.threshold ?? DEFAULT_THRESHOLD,\n    strategy: config?.strategy ?? \"merge\",\n    mergeTopK: config?.mergeTopK ?? DEFAULT_MERGE_TOP_K,\n  };\n}\n","function tokenize(text: string): string[] {\n  return text\n    .trim()\n    .split(/\\s+/)\n    .filter((t) => t.length > 0);\n}\n\nfunction uniqueTokenSet(text: string): Set<string> {\n  return new Set(\n    tokenize(text)\n      .map((t) => t.toLowerCase().replace(/[^\\w]/g, \"\"))\n      .filter(Boolean),\n  );\n}\n\n/** Higher score = more specific / information-dense. */\nexport function specificityScore(text: string): number {\n  const trimmed = text.trim();\n  if (trimmed.length === 0) return 0;\n\n  const tokens = tokenize(trimmed);\n  if (tokens.length === 0) return 0;\n\n  const unique = new Set(tokens.map((t) => t.toLowerCase()));\n  const density = unique.size / tokens.length;\n  const concisenessBonus = 1 / Math.sqrt(trimmed.length);\n\n  return density * concisenessBonus;\n}\n\n/** True when `incoming` is more specific than `existing`. */\nexport function isMoreSpecific(incoming: string, existing: string): boolean {\n  const incomingTokens = uniqueTokenSet(incoming);\n  const existingTokens = uniqueTokenSet(existing);\n\n  if (incomingTokens.size === 0) return false;\n  if (existingTokens.size === 0) return true;\n\n  const incomingAddsInfo = [...incomingTokens].some((t) => !existingTokens.has(t));\n  const existingIsSubset = [...existingTokens].every((t) => incomingTokens.has(t));\n  const incomingIsSubset = [...incomingTokens].every((t) => existingTokens.has(t));\n\n  // Refinement: incoming preserves existing details and adds new ones.\n  if (incomingAddsInfo && existingIsSubset) {\n    return true;\n  }\n\n  // Generalization: incoming drops detail present in existing.\n  if (incomingIsSubset && !existingIsSubset) {\n    return false;\n  }\n\n  // More unique tokens generally means more specific when neither is a subset.\n  if (incomingTokens.size !== existingTokens.size) {\n    return incomingTokens.size > existingTokens.size;\n  }\n\n  const incomingScore = specificityScore(incoming);\n  const existingScore = specificityScore(existing);\n  if (incomingScore !== existingScore) {\n    return incomingScore > existingScore;\n  }\n\n  return incoming.trim().length < existing.trim().length;\n}\n","import type {\n  EmbeddingAdapter,\n  Memory,\n  MemoryScope,\n  MemorySearchResult,\n  StorageAdapter,\n} from \"../types.js\";\nimport { isMoreSpecific } from \"./specificity.js\";\nimport type { Merger } from \"./merger.js\";\nimport type { ResolvedDeduplicationConfig } from \"./resolve-config.js\";\n\nasync function insertFact(\n  storage: StorageAdapter,\n  fact: string,\n  embedding: number[],\n  scope: MemoryScope,\n): Promise<Memory> {\n  return storage.insert({\n    content: fact,\n    embedding,\n    userId: scope.userId,\n    agentId: scope.agentId,\n    sessionId: scope.sessionId,\n    metadata: {},\n  });\n}\n\nasync function smartReplace(\n  storage: StorageAdapter,\n  primary: MemorySearchResult,\n  fact: string,\n  embedding: number[],\n): Promise<Memory> {\n  if (isMoreSpecific(fact, primary.memory.content)) {\n    return storage.update(primary.memory.id, { content: fact, embedding });\n  }\n  return primary.memory;\n}\n\nexport async function upsertFact(\n  storage: StorageAdapter,\n  embeddingAdapter: EmbeddingAdapter,\n  merger: Merger,\n  config: ResolvedDeduplicationConfig,\n  fact: string,\n  embedding: number[],\n  scope: MemoryScope,\n): Promise<Memory> {\n  if (!config.enabled) {\n    return insertFact(storage, fact, embedding, scope);\n  }\n\n  const results = await storage.search(embedding, scope, config.mergeTopK);\n  const matches = results.filter((r) => r.score >= config.threshold);\n\n  if (matches.length === 0) {\n    return insertFact(storage, fact, embedding, scope);\n  }\n\n  const primary = matches[0];\n  const extras = matches.slice(1);\n\n  if (config.strategy === \"skip\") {\n    return primary.memory;\n  }\n\n  if (config.strategy === \"replace\") {\n    return smartReplace(storage, primary, fact, embedding);\n  }\n\n  // merge strategy\n  try {\n    const existingFacts = matches.map((m) => m.memory.content);\n    const merged = await merger.mergeMany(existingFacts, fact);\n    const mergedEmbedding = await embeddingAdapter.embed(merged);\n    const updated = await storage.update(primary.memory.id, {\n      content: merged,\n      embedding: mergedEmbedding,\n    });\n\n    for (const extra of extras) {\n      await storage.delete(extra.memory.id);\n    }\n\n    return updated;\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      `[turbomem] Memory merge failed, falling back to smart replace: ${(error as Error).message}`,\n    );\n    return smartReplace(storage, primary, fact, embedding);\n  }\n}\n","export { TurboMemory } from \"./memory.js\";\n\nexport type {\n  Message,\n  Memory,\n  MemorySearchResult,\n  MemoryScope,\n  EmbeddingAdapter,\n  StorageAdapter,\n  TurboMemoryConfig,\n  ExtractionConfig,\n  ExtractionProvider,\n  OpenAIConfig,\n  VoyageConfig,\n  GoogleConfig,\n  DeduplicationConfig,\n  DeduplicationStrategy,\n} from \"./types.js\";\nexport { MessageSchema, MessagesSchema, MemoryScopeSchema } from \"./types.js\";\n\nexport {\n  TurboMemError,\n  NotInitialisedError,\n  EmbeddingError,\n  StorageError,\n  ExtractionError,\n  DimensionMismatchError,\n  ConfigError,\n} from \"./errors.js\";\nexport type { TurboMemErrorCode } from \"./errors.js\";\n\nexport {\n  OpenAIEmbeddingAdapter,\n  TransformersEmbeddingAdapter,\n  VoyageEmbeddingAdapter,\n  GoogleEmbeddingAdapter,\n} from \"./embeddings/index.js\";\nexport type {\n  OpenAIEmbeddingOptions,\n  OpenAIEmbeddingModel,\n  TransformersEmbeddingOptions,\n  VoyageEmbeddingOptions,\n  VoyageEmbeddingModel,\n  GoogleEmbeddingOptions,\n} from \"./embeddings/index.js\";\n\nexport { PGliteStorageAdapter } from \"./storage/index.js\";\nexport type { PGliteStorageOptions } from \"./storage/index.js\";\nexport { SqliteVecStorageAdapter } from \"./storage/index.js\";\nexport type { SqliteVecStorageOptions } from \"./storage/index.js\";\nexport { UpstashVectorStorageAdapter, buildScopeFilter } from \"./storage/index.js\";\nexport type {\n  UpstashVectorStorageOptions,\n  UpstashMemoryMetadata,\n  UpstashVectorIndex,\n} from \"./storage/index.js\";\nexport { PineconeStorageAdapter, buildPineconeScopeFilter } from \"./storage/index.js\";\nexport type {\n  PineconeStorageOptions,\n  PineconeMemoryMetadata,\n  PineconeIndexClient,\n} from \"./storage/index.js\";\n\nexport { Extractor, EXTRACTION_SYSTEM_PROMPT, parseFacts } from \"./extraction/index.js\";\nexport type { ExtractorOptions } from \"./extraction/index.js\";\n\nexport {\n  Merger,\n  MERGE_SYSTEM_PROMPT,\n  isMoreSpecific,\n  specificityScore,\n  resolveDeduplicationConfig,\n  upsertFact,\n} from \"./deduplication/index.js\";\nexport type { MergerOptions, ResolvedDeduplicationConfig } from \"./deduplication/index.js\";\n\nexport { cosineSimilarity } from \"./utils/cosine.js\";\nexport { chunkArray, formatTranscript } from \"./utils/chunking.js\";\n","export type { StorageAdapter } from \"./base.js\";\nexport { PGliteStorageAdapter } from \"./pglite.js\";\nexport type { PGliteStorageOptions } from \"./pglite.js\";\nexport { SqliteVecStorageAdapter } from \"./sqlite-vec.js\";\nexport type { SqliteVecStorageOptions } from \"./sqlite-vec.js\";\nexport { UpstashVectorStorageAdapter, buildScopeFilter } from \"./upstash-vector.js\";\nexport type {\n  UpstashVectorStorageOptions,\n  UpstashMemoryMetadata,\n  UpstashVectorIndex,\n} from \"./upstash-vector.js\";\nexport { PineconeStorageAdapter, buildPineconeScopeFilter } from \"./pinecone.js\";\nexport type {\n  PineconeStorageOptions,\n  PineconeMemoryMetadata,\n  PineconeIndexClient,\n} from \"./pinecone.js\";\n","/**\n * Compute the cosine similarity between two equal-length vectors.\n * Returns a value in the range [-1, 1]; for normalised embeddings this is\n * effectively [0, 1].\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n  if (a.length !== b.length) {\n    throw new Error(\n      `Cannot compute cosine similarity for vectors of different lengths: ${a.length} vs ${b.length}`,\n    );\n  }\n\n  let dot = 0;\n  let magA = 0;\n  let magB = 0;\n\n  for (let i = 0; i < a.length; i++) {\n    dot += a[i] * b[i];\n    magA += a[i] * a[i];\n    magB += b[i] * b[i];\n  }\n\n  const denom = Math.sqrt(magA) * Math.sqrt(magB);\n  if (denom === 0) return 0;\n\n  return dot / denom;\n}\n"]}