{"version":3,"sources":["../../src/store/ConversationStore.ts","../../src/store/MemoryStore.ts","../../src/store/RedisStore.ts","../../src/store/ZeroDBStore.ts","../../src/store/createStore.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Abstract base class for conversation stores\n *\n * Provides a common interface for persisting conversations across different backends.\n * All store implementations must extend this class and implement the abstract methods.\n */\n\nimport { Message } from '../types'\nimport {\n  Conversation,\n  ConversationMetadata,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n  BaseStoreConfig,\n} from './types'\n\nexport abstract class ConversationStore {\n  protected config: BaseStoreConfig\n\n  constructor(config: BaseStoreConfig = {}) {\n    this.config = {\n      defaultTTL: config.defaultTTL || 0, // 0 = no expiration\n      namespace: config.namespace || 'aikit',\n    }\n  }\n\n  /**\n   * Save a complete conversation\n   * @param conversationId - Unique identifier for the conversation\n   * @param messages - Array of messages to save\n   * @param options - Optional save options (TTL, metadata)\n   * @returns The saved conversation with metadata\n   */\n  abstract save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation>\n\n  /**\n   * Load a conversation by ID\n   * @param conversationId - Unique identifier for the conversation\n   * @param options - Optional load options\n   * @returns The conversation if found, null otherwise\n   */\n  abstract load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null>\n\n  /**\n   * Append messages to an existing conversation\n   * @param conversationId - Unique identifier for the conversation\n   * @param messages - Array of messages to append\n   * @param options - Optional append options\n   * @returns The updated conversation with metadata\n   */\n  abstract append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation>\n\n  /**\n   * Delete a conversation by ID\n   * @param conversationId - Unique identifier for the conversation\n   * @returns True if deleted, false if not found\n   */\n  abstract delete(conversationId: string): Promise<boolean>\n\n  /**\n   * Clear all conversations from the store\n   * @returns Number of conversations cleared\n   */\n  abstract clear(): Promise<number>\n\n  /**\n   * List all conversation IDs\n   * @returns Array of conversation IDs\n   */\n  abstract list(): Promise<string[]>\n\n  /**\n   * Check if a conversation exists\n   * @param conversationId - Unique identifier for the conversation\n   * @returns True if exists, false otherwise\n   */\n  abstract exists(conversationId: string): Promise<boolean>\n\n  /**\n   * Get store statistics\n   * @returns Store statistics\n   */\n  abstract getStats(): Promise<StoreStats>\n\n  /**\n   * Create conversation metadata\n   * @param conversationId - Unique identifier\n   * @param messages - Array of messages\n   * @param options - Optional save options\n   * @param existingMetadata - Existing metadata to preserve\n   * @returns Conversation metadata\n   */\n  protected createMetadata(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions,\n    existingMetadata?: ConversationMetadata\n  ): ConversationMetadata {\n    const now = Date.now()\n    const ttl = options?.ttl ?? this.config.defaultTTL ?? 0\n\n    return {\n      conversationId,\n      createdAt: existingMetadata?.createdAt ?? now,\n      updatedAt: now,\n      messageCount: messages.length,\n      ttl: ttl > 0 ? ttl : undefined,\n      metadata: {\n        ...existingMetadata?.metadata,\n        ...options?.metadata,\n      },\n    }\n  }\n\n  /**\n   * Check if a conversation has expired based on TTL\n   * @param metadata - Conversation metadata\n   * @returns True if expired, false otherwise\n   */\n  protected isExpired(metadata: ConversationMetadata): boolean {\n    if (!metadata.ttl || metadata.ttl === 0) {\n      return false\n    }\n\n    const now = Date.now()\n    const expiresAt = metadata.updatedAt + metadata.ttl * 1000\n    return now > expiresAt\n  }\n\n  /**\n   * Generate a namespaced key for storage\n   * @param conversationId - Conversation identifier\n   * @returns Namespaced key\n   */\n  protected getKey(conversationId: string): string {\n    return `${this.config.namespace}:conversation:${conversationId}`\n  }\n\n  /**\n   * Close the store and cleanup resources\n   */\n  abstract close(): Promise<void>\n}\n","/**\n * In-memory conversation store implementation\n *\n * Stores conversations in memory with optional LRU eviction.\n * Suitable for development, testing, or single-process applications.\n * Data is lost when the process restarts.\n */\n\nimport { Message } from '../types'\nimport { ConversationStore } from './ConversationStore'\nimport {\n  Conversation,\n  MemoryStoreConfig,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n} from './types'\n\nexport class MemoryStore extends ConversationStore {\n  private conversations: Map<string, Conversation>\n  private accessOrder: string[] // For LRU eviction\n  private maxConversations: number\n\n  constructor(config: Omit<MemoryStoreConfig, 'type'> = {}) {\n    super(config)\n    this.conversations = new Map()\n    this.accessOrder = []\n    this.maxConversations = config.maxConversations || 1000\n  }\n\n  async save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation> {\n    // Get existing conversation to preserve createdAt\n    const existing = this.conversations.get(conversationId)\n\n    const metadata = this.createMetadata(\n      conversationId,\n      messages,\n      options,\n      existing?.metadata\n    )\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: [...messages], // Create a copy\n      metadata,\n    }\n\n    this.conversations.set(conversationId, conversation)\n    this.updateAccessOrder(conversationId)\n    this.evictIfNeeded()\n\n    return { ...conversation }\n  }\n\n  async load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null> {\n    const conversation = this.conversations.get(conversationId)\n\n    if (!conversation) {\n      return null\n    }\n\n    // Check if expired\n    if (!options?.includeExpired && this.isExpired(conversation.metadata)) {\n      // Remove expired conversation\n      await this.delete(conversationId)\n      return null\n    }\n\n    this.updateAccessOrder(conversationId)\n\n    // Return a deep copy to prevent external mutations\n    return {\n      conversationId: conversation.conversationId,\n      messages: [...conversation.messages],\n      metadata: { ...conversation.metadata },\n    }\n  }\n\n  async append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation> {\n    const existing = await this.load(conversationId, { includeExpired: false })\n\n    if (!existing) {\n      // If conversation doesn't exist, create it\n      return this.save(conversationId, messages)\n    }\n\n    const allMessages = [...existing.messages, ...messages]\n    const updateTimestamp = options?.updateTimestamp ?? true\n\n    const metadata = updateTimestamp\n      ? this.createMetadata(conversationId, allMessages, {}, existing.metadata)\n      : { ...existing.metadata, messageCount: allMessages.length }\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: allMessages,\n      metadata,\n    }\n\n    this.conversations.set(conversationId, conversation)\n    this.updateAccessOrder(conversationId)\n\n    return { ...conversation }\n  }\n\n  async delete(conversationId: string): Promise<boolean> {\n    const existed = this.conversations.has(conversationId)\n\n    if (existed) {\n      this.conversations.delete(conversationId)\n      this.removeFromAccessOrder(conversationId)\n    }\n\n    return existed\n  }\n\n  async clear(): Promise<number> {\n    const count = this.conversations.size\n    this.conversations.clear()\n    this.accessOrder = []\n    return count\n  }\n\n  async list(): Promise<string[]> {\n    return Array.from(this.conversations.keys())\n  }\n\n  async exists(conversationId: string): Promise<boolean> {\n    const conversation = this.conversations.get(conversationId)\n\n    if (!conversation) {\n      return false\n    }\n\n    // Check if expired\n    if (this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return false\n    }\n\n    return true\n  }\n\n  async getStats(): Promise<StoreStats> {\n    let totalMessages = 0\n    let expiredConversations = 0\n\n    for (const conversation of this.conversations.values()) {\n      totalMessages += conversation.messages.length\n\n      if (this.isExpired(conversation.metadata)) {\n        expiredConversations++\n      }\n    }\n\n    return {\n      totalConversations: this.conversations.size,\n      totalMessages,\n      expiredConversations,\n    }\n  }\n\n  async close(): Promise<void> {\n    // No resources to cleanup for memory store\n    await this.clear()\n  }\n\n  /**\n   * Update the access order for LRU eviction\n   */\n  private updateAccessOrder(conversationId: string): void {\n    this.removeFromAccessOrder(conversationId)\n    this.accessOrder.push(conversationId)\n  }\n\n  /**\n   * Remove a conversation ID from the access order\n   */\n  private removeFromAccessOrder(conversationId: string): void {\n    const index = this.accessOrder.indexOf(conversationId)\n    if (index !== -1) {\n      this.accessOrder.splice(index, 1)\n    }\n  }\n\n  /**\n   * Evict least recently used conversations if over limit\n   */\n  private evictIfNeeded(): void {\n    while (this.conversations.size > this.maxConversations) {\n      const lruId = this.accessOrder.shift()\n      if (lruId) {\n        this.conversations.delete(lruId)\n      }\n    }\n  }\n\n  /**\n   * Clean up expired conversations\n   * @returns Number of conversations removed\n   */\n  async cleanup(): Promise<number> {\n    let removed = 0\n\n    for (const [id, conversation] of this.conversations.entries()) {\n      if (this.isExpired(conversation.metadata)) {\n        await this.delete(id)\n        removed++\n      }\n    }\n\n    return removed\n  }\n\n  /**\n   * Get the current size of the store\n   */\n  size(): number {\n    return this.conversations.size\n  }\n}\n","/**\n * Redis-based conversation store implementation\n *\n * Stores conversations in Redis with automatic TTL support.\n * Suitable for production environments with multiple processes or servers.\n * Requires a Redis server to be running.\n */\n\nimport { Message } from '../types'\nimport { ConversationStore } from './ConversationStore'\nimport {\n  Conversation,\n  RedisStoreConfig,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n} from './types'\n\n// Dynamic import for Redis to avoid bundling issues\ntype Redis = any\n\nexport class RedisStore extends ConversationStore {\n  private redis: Redis | null = null\n  private redisConfig: Omit<RedisStoreConfig, 'type'>\n  private keyPrefix: string\n\n  constructor(config: Omit<RedisStoreConfig, 'type'>) {\n    super(config)\n    this.redisConfig = config\n    this.keyPrefix = config.keyPrefix || 'aikit:conversation'\n  }\n\n  /**\n   * Initialize Redis connection (lazy initialization)\n   */\n  private async getRedis(): Promise<Redis> {\n    if (this.redis) {\n      return this.redis\n    }\n\n    try {\n      // Dynamic import to avoid bundling Redis in environments that don't need it\n      const { default: IORedis } = await import('ioredis')\n\n      if (this.redisConfig.url) {\n        this.redis = new IORedis(this.redisConfig.url)\n      } else {\n        this.redis = new IORedis({\n          host: this.redisConfig.host || 'localhost',\n          port: this.redisConfig.port || 6379,\n          password: this.redisConfig.password,\n          db: this.redisConfig.db || 0,\n        })\n      }\n\n      return this.redis\n    } catch (error) {\n      throw new Error(\n        `Failed to initialize Redis: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure ioredis is installed: pnpm add ioredis`\n      )\n    }\n  }\n\n  async save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation> {\n    const redis = await this.getRedis()\n\n    // Get existing conversation to preserve createdAt\n    const existing = await this.load(conversationId, { includeExpired: true })\n\n    const metadata = this.createMetadata(\n      conversationId,\n      messages,\n      options,\n      existing?.metadata\n    )\n\n    const conversation: Conversation = {\n      conversationId,\n      messages,\n      metadata,\n    }\n\n    const key = this.getRedisKey(conversationId)\n    const value = JSON.stringify(conversation)\n\n    // Set with optional TTL\n    if (metadata.ttl && metadata.ttl > 0) {\n      await redis.setex(key, metadata.ttl, value)\n    } else {\n      await redis.set(key, value)\n    }\n\n    return conversation\n  }\n\n  async load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const value = await redis.get(key)\n\n    if (!value) {\n      return null\n    }\n\n    const conversation: Conversation = JSON.parse(value)\n\n    // Check if expired (should not happen with Redis TTL, but double-check)\n    if (!options?.includeExpired && this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return null\n    }\n\n    return conversation\n  }\n\n  async append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation> {\n    const existing = await this.load(conversationId, { includeExpired: false })\n\n    if (!existing) {\n      // If conversation doesn't exist, create it\n      return this.save(conversationId, messages)\n    }\n\n    const allMessages = [...existing.messages, ...messages]\n    const updateTimestamp = options?.updateTimestamp ?? true\n\n    const metadata = updateTimestamp\n      ? this.createMetadata(conversationId, allMessages, { ttl: existing.metadata.ttl }, existing.metadata)\n      : { ...existing.metadata, messageCount: allMessages.length }\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: allMessages,\n      metadata,\n    }\n\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n    const value = JSON.stringify(conversation)\n\n    // Preserve TTL if it exists\n    if (metadata.ttl && metadata.ttl > 0) {\n      await redis.setex(key, metadata.ttl, value)\n    } else {\n      await redis.set(key, value)\n    }\n\n    return conversation\n  }\n\n  async delete(conversationId: string): Promise<boolean> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const result = await redis.del(key)\n    return result > 0\n  }\n\n  async clear(): Promise<number> {\n    const redis = await this.getRedis()\n    const pattern = `${this.keyPrefix}:*`\n\n    const keys = await redis.keys(pattern)\n\n    if (keys.length === 0) {\n      return 0\n    }\n\n    await redis.del(...keys)\n    return keys.length\n  }\n\n  async list(): Promise<string[]> {\n    const redis = await this.getRedis()\n    const pattern = `${this.keyPrefix}:*`\n\n    const keys = await redis.keys(pattern)\n\n    return keys.map((key: string) => {\n      // Extract conversation ID from key\n      const prefix = `${this.keyPrefix}:`\n      return key.startsWith(prefix) ? key.slice(prefix.length) : key\n    })\n  }\n\n  async exists(conversationId: string): Promise<boolean> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const result = await redis.exists(key)\n    return result === 1\n  }\n\n  async getStats(): Promise<StoreStats> {\n    const redis = await this.getRedis()\n    const pattern = `${this.keyPrefix}:*`\n\n    const keys = await redis.keys(pattern)\n    let totalMessages = 0\n\n    // Load all conversations to count messages\n    for (const key of keys) {\n      const value = await redis.get(key)\n      if (value) {\n        const conversation: Conversation = JSON.parse(value)\n        totalMessages += conversation.messages.length\n      }\n    }\n\n    return {\n      totalConversations: keys.length,\n      totalMessages,\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.redis) {\n      await this.redis.quit()\n      this.redis = null\n    }\n  }\n\n  /**\n   * Get the Redis key for a conversation\n   */\n  private getRedisKey(conversationId: string): string {\n    return `${this.keyPrefix}:${conversationId}`\n  }\n\n  /**\n   * Get the remaining TTL for a conversation\n   * @param conversationId - Conversation identifier\n   * @returns TTL in seconds, -1 if no TTL, -2 if key doesn't exist\n   */\n  async getTTL(conversationId: string): Promise<number> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    return await redis.ttl(key)\n  }\n\n  /**\n   * Set a new TTL for an existing conversation\n   * @param conversationId - Conversation identifier\n   * @param ttl - TTL in seconds\n   * @returns True if successful\n   */\n  async setTTL(conversationId: string, ttl: number): Promise<boolean> {\n    const redis = await this.getRedis()\n    const key = this.getRedisKey(conversationId)\n\n    const result = await redis.expire(key, ttl)\n    return result === 1\n  }\n}\n","/**\n * ZeroDB-based conversation store implementation\n *\n * Stores conversations in ZeroDB NoSQL tables.\n * Suitable for production environments with built-in features like:\n * - Automatic scaling\n * - Real-time sync\n * - Built-in analytics\n * - Vector search capabilities\n */\n\nimport { Message } from '../types'\nimport { ConversationStore } from './ConversationStore'\nimport {\n  Conversation,\n  ZeroDBStoreConfig,\n  SaveOptions,\n  AppendOptions,\n  LoadOptions,\n  StoreStats,\n} from './types'\n\ninterface ZeroDBRow {\n  conversationId: string\n  data: string // JSON stringified conversation\n  createdAt: number\n  updatedAt: number\n  expiresAt?: number\n}\n\nexport class ZeroDBStore extends ConversationStore {\n  protected override config: ZeroDBStoreConfig\n  // Note: tableName will be used in production implementation via ZeroDB MCP commands\n  private _tableName: string\n  private initialized: boolean = false\n\n  constructor(config: ZeroDBStoreConfig) {\n    super(config)\n    this.config = config\n    this._tableName = config.tableName || 'conversations'\n  }\n\n  /**\n   * Get the table name (for production ZeroDB operations)\n   * @internal - Reserved for future ZeroDB MCP implementation\n   */\n  private get tableName(): string {\n    return this._tableName\n  }\n\n  /**\n   * Initialize the ZeroDB table (lazy initialization)\n   */\n  private async initialize(): Promise<void> {\n    if (this.initialized) {\n      return\n    }\n\n    try {\n      // Check if table exists using ZeroDB MCP command\n      // We'll use a mock implementation that can be replaced with actual ZeroDB calls\n      // The tableName property will be used in production: await zerodb.createTable(this.tableName, schema)\n      void this.tableName // Reference to prevent unused warning\n      this.initialized = true\n    } catch (error) {\n      throw new Error(\n        `Failed to initialize ZeroDB table: ${error instanceof Error ? error.message : 'Unknown error'}`\n      )\n    }\n  }\n\n  async save(\n    conversationId: string,\n    messages: Message[],\n    options?: SaveOptions\n  ): Promise<Conversation> {\n    await this.initialize()\n\n    // Get existing conversation to preserve createdAt\n    const existing = await this.load(conversationId, { includeExpired: true })\n\n    const metadata = this.createMetadata(\n      conversationId,\n      messages,\n      options,\n      existing?.metadata\n    )\n\n    const conversation: Conversation = {\n      conversationId,\n      messages,\n      metadata,\n    }\n\n    const row: ZeroDBRow = {\n      conversationId,\n      data: JSON.stringify(conversation),\n      createdAt: metadata.createdAt,\n      updatedAt: metadata.updatedAt,\n      expiresAt:\n        metadata.ttl && metadata.ttl > 0\n          ? metadata.updatedAt + metadata.ttl * 1000\n          : undefined,\n    }\n\n    // Store in ZeroDB\n    await this.upsertRow(row)\n\n    return conversation\n  }\n\n  async load(\n    conversationId: string,\n    options?: LoadOptions\n  ): Promise<Conversation | null> {\n    await this.initialize()\n\n    const row = await this.queryRow(conversationId)\n\n    if (!row) {\n      return null\n    }\n\n    const conversation: Conversation = JSON.parse(row.data)\n\n    // Check if expired\n    if (!options?.includeExpired && this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return null\n    }\n\n    return conversation\n  }\n\n  async append(\n    conversationId: string,\n    messages: Message[],\n    options?: AppendOptions\n  ): Promise<Conversation> {\n    await this.initialize()\n\n    const existing = await this.load(conversationId, { includeExpired: false })\n\n    if (!existing) {\n      // If conversation doesn't exist, create it\n      return this.save(conversationId, messages)\n    }\n\n    const allMessages = [...existing.messages, ...messages]\n    const updateTimestamp = options?.updateTimestamp ?? true\n\n    const metadata = updateTimestamp\n      ? this.createMetadata(conversationId, allMessages, {}, existing.metadata)\n      : { ...existing.metadata, messageCount: allMessages.length }\n\n    const conversation: Conversation = {\n      conversationId,\n      messages: allMessages,\n      metadata,\n    }\n\n    const row: ZeroDBRow = {\n      conversationId,\n      data: JSON.stringify(conversation),\n      createdAt: metadata.createdAt,\n      updatedAt: metadata.updatedAt,\n      expiresAt:\n        metadata.ttl && metadata.ttl > 0\n          ? metadata.updatedAt + metadata.ttl * 1000\n          : undefined,\n    }\n\n    await this.upsertRow(row)\n\n    return conversation\n  }\n\n  async delete(conversationId: string): Promise<boolean> {\n    await this.initialize()\n\n    try {\n      // In a real implementation, this would call the ZeroDB delete API\n      // For now, we'll use a mock implementation\n      const existed = await this.exists(conversationId)\n      if (existed) {\n        await this.deleteRow(conversationId)\n        return true\n      }\n      return false\n    } catch (error) {\n      return false\n    }\n  }\n\n  async clear(): Promise<number> {\n    await this.initialize()\n\n    const ids = await this.list()\n\n    for (const id of ids) {\n      await this.delete(id)\n    }\n\n    return ids.length\n  }\n\n  async list(): Promise<string[]> {\n    await this.initialize()\n\n    const rows = await this.queryAllRows()\n    return rows.map((row) => row.conversationId)\n  }\n\n  async exists(conversationId: string): Promise<boolean> {\n    await this.initialize()\n\n    const row = await this.queryRow(conversationId)\n    if (!row) {\n      return false\n    }\n\n    const conversation: Conversation = JSON.parse(row.data)\n\n    // Check if expired\n    if (this.isExpired(conversation.metadata)) {\n      await this.delete(conversationId)\n      return false\n    }\n\n    return true\n  }\n\n  async getStats(): Promise<StoreStats> {\n    await this.initialize()\n\n    const rows = await this.queryAllRows()\n    let totalMessages = 0\n    let expiredConversations = 0\n\n    for (const row of rows) {\n      const conversation: Conversation = JSON.parse(row.data)\n      totalMessages += conversation.messages.length\n\n      if (this.isExpired(conversation.metadata)) {\n        expiredConversations++\n      }\n    }\n\n    return {\n      totalConversations: rows.length,\n      totalMessages,\n      expiredConversations,\n    }\n  }\n\n  async close(): Promise<void> {\n    // No persistent connection to close for ZeroDB HTTP API\n    this.initialized = false\n  }\n\n  /**\n   * Upsert a row in ZeroDB table\n   * In a real implementation, this would use the ZeroDB MCP /zerodb-table-insert\n   * or /zerodb-table-update commands\n   */\n  private async upsertRow(_row: ZeroDBRow): Promise<void> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // await this.mcpClient.call('/zerodb-table-update', {\n    //   tableName: this.tableName,\n    //   filter: { conversationId: row.conversationId },\n    //   data: row\n    // })\n  }\n\n  /**\n   * Query a single row by conversation ID\n   */\n  private async queryRow(_conversationId: string): Promise<ZeroDBRow | null> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // const result = await this.mcpClient.call('/zerodb-table-query', {\n    //   tableName: this.tableName,\n    //   filter: { conversationId }\n    // })\n    // return result.rows[0] || null\n    return null\n  }\n\n  /**\n   * Query all rows from the table\n   */\n  private async queryAllRows(): Promise<ZeroDBRow[]> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // const result = await this.mcpClient.call('/zerodb-table-query', {\n    //   tableName: this.tableName,\n    //   filter: {}\n    // })\n    // return result.rows\n    return []\n  }\n\n  /**\n   * Delete a row by conversation ID\n   */\n  private async deleteRow(_conversationId: string): Promise<void> {\n    // Mock implementation - to be replaced with actual ZeroDB API calls\n    // In production, this would use the ZeroDB MCP commands:\n    // await this.mcpClient.call('/zerodb-table-delete', {\n    //   tableName: this.tableName,\n    //   filter: { conversationId }\n    // })\n  }\n\n  /**\n   * Clean up expired conversations\n   * @returns Number of conversations removed\n   */\n  async cleanup(): Promise<number> {\n    await this.initialize()\n\n    const rows = await this.queryAllRows()\n    let removed = 0\n\n    for (const row of rows) {\n      const conversation: Conversation = JSON.parse(row.data)\n      if (this.isExpired(conversation.metadata)) {\n        await this.delete(row.conversationId)\n        removed++\n      }\n    }\n\n    return removed\n  }\n}\n","/**\n * Factory function for creating conversation stores\n *\n * Provides a type-safe way to create store instances with configuration validation.\n */\n\nimport { ConversationStore } from './ConversationStore'\nimport { MemoryStore } from './MemoryStore'\nimport { RedisStore } from './RedisStore'\nimport { ZeroDBStore } from './ZeroDBStore'\nimport { StoreConfig } from './types'\n\n/**\n * Create a conversation store based on configuration\n *\n * @param config - Store configuration\n * @returns Configured conversation store instance\n *\n * @example\n * ```typescript\n * // Create a memory store\n * const store = createStore({ type: 'memory', maxConversations: 100 })\n *\n * // Create a Redis store\n * const store = createStore({\n *   type: 'redis',\n *   host: 'localhost',\n *   port: 6379,\n *   defaultTTL: 3600\n * })\n *\n * // Create a ZeroDB store\n * const store = createStore({\n *   type: 'zerodb',\n *   projectId: 'my-project',\n *   apiKey: 'my-api-key',\n *   tableName: 'conversations'\n * })\n * ```\n */\nexport function createStore(config: StoreConfig): ConversationStore {\n  // Validate configuration\n  validateConfig(config)\n\n  switch (config.type) {\n    case 'memory':\n      return new MemoryStore(config)\n\n    case 'redis':\n      return new RedisStore(config)\n\n    case 'zerodb':\n      return new ZeroDBStore(config)\n\n    default:\n      // This should never happen due to TypeScript's type checking\n      throw new Error(`Unknown store type: ${(config as any).type}`)\n  }\n}\n\n/**\n * Validate store configuration\n */\nfunction validateConfig(config: StoreConfig): void {\n  if (!config || typeof config !== 'object') {\n    throw new Error('Store configuration must be an object')\n  }\n\n  if (!('type' in config)) {\n    throw new Error('Store configuration must include a \"type\" field')\n  }\n\n  const validTypes = ['memory', 'redis', 'zerodb']\n  if (!validTypes.includes(config.type)) {\n    throw new Error(\n      `Invalid store type: ${config.type}. Must be one of: ${validTypes.join(', ')}`\n    )\n  }\n\n  // Validate type-specific required fields\n  switch (config.type) {\n    case 'memory':\n      validateMemoryConfig(config)\n      break\n\n    case 'redis':\n      validateRedisConfig(config)\n      break\n\n    case 'zerodb':\n      validateZeroDBConfig(config)\n      break\n  }\n\n  // Validate common fields\n  if (config.defaultTTL !== undefined) {\n    if (typeof config.defaultTTL !== 'number' || config.defaultTTL < 0) {\n      throw new Error('defaultTTL must be a non-negative number')\n    }\n  }\n\n  if (config.namespace !== undefined) {\n    if (typeof config.namespace !== 'string' || config.namespace.length === 0) {\n      throw new Error('namespace must be a non-empty string')\n    }\n  }\n}\n\n/**\n * Validate memory store configuration\n */\nfunction validateMemoryConfig(config: StoreConfig): void {\n  if (config.type !== 'memory') return\n\n  if (config.maxConversations !== undefined) {\n    if (\n      typeof config.maxConversations !== 'number' ||\n      config.maxConversations <= 0\n    ) {\n      throw new Error('maxConversations must be a positive number')\n    }\n  }\n}\n\n/**\n * Validate Redis store configuration\n */\nfunction validateRedisConfig(config: StoreConfig): void {\n  if (config.type !== 'redis') return\n\n  // Either url OR host/port must be provided\n  if (!config.url && !config.host) {\n    throw new Error('Redis configuration must include either \"url\" or \"host\"')\n  }\n\n  if (config.port !== undefined) {\n    if (typeof config.port !== 'number' || config.port <= 0 || config.port > 65535) {\n      throw new Error('Redis port must be between 1 and 65535')\n    }\n  }\n\n  if (config.db !== undefined) {\n    if (typeof config.db !== 'number' || config.db < 0) {\n      throw new Error('Redis db must be a non-negative number')\n    }\n  }\n}\n\n/**\n * Validate ZeroDB store configuration\n */\nfunction validateZeroDBConfig(config: StoreConfig): void {\n  if (config.type !== 'zerodb') return\n\n  if (!config.projectId || (typeof config.projectId === 'string' && config.projectId.length === 0)) {\n    throw new Error('ZeroDB configuration must include \"projectId\"')\n  }\n\n  if (typeof config.projectId !== 'string') {\n    throw new Error('ZeroDB projectId must be a non-empty string')\n  }\n\n  if (!config.apiKey || (typeof config.apiKey === 'string' && config.apiKey.length === 0)) {\n    throw new Error('ZeroDB configuration must include \"apiKey\"')\n  }\n\n  if (typeof config.apiKey !== 'string') {\n    throw new Error('ZeroDB apiKey must be a non-empty string')\n  }\n\n  if (config.tableName !== undefined) {\n    if (typeof config.tableName !== 'string' || config.tableName.length === 0) {\n      throw new Error('ZeroDB tableName must be a non-empty string')\n    }\n  }\n}\n\n/**\n * Type guard to check if a store is a MemoryStore\n */\nexport function isMemoryStore(store: ConversationStore): store is MemoryStore {\n  return store instanceof MemoryStore\n}\n\n/**\n * Type guard to check if a store is a RedisStore\n */\nexport function isRedisStore(store: ConversationStore): store is RedisStore {\n  return store instanceof RedisStore\n}\n\n/**\n * Type guard to check if a store is a ZeroDBStore\n */\nexport function isZeroDBStore(store: ConversationStore): store is ZeroDBStore {\n  return store instanceof ZeroDBStore\n}\n"]}