@voltagent/libsql 1.0.14 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/edge.d.mts +111 -0
- package/dist/edge.d.ts +111 -0
- package/dist/edge.js +2183 -0
- package/dist/edge.js.map +1 -0
- package/dist/edge.mjs +2155 -0
- package/dist/edge.mjs.map +1 -0
- package/dist/index.d.mts +24 -391
- package/dist/index.d.ts +24 -391
- package/dist/index.js +209 -340
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +208 -343
- package/dist/index.mjs.map +1 -1
- package/dist/vector-core-CKn8FNVK.d.mts +274 -0
- package/dist/vector-core-CKn8FNVK.d.ts +274 -0
- package/package.json +12 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory-v2-adapter.ts","../src/observability-adapter.ts","../src/vector-adapter.ts"],"sourcesContent":["/**\n * LibSQL Storage Adapter for Memory\n * Stores conversations and messages in SQLite/Turso database\n * Compatible with existing LibSQL storage structure\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { type Client, createClient } from \"@libsql/client\";\nimport {\n AgentRegistry,\n ConversationAlreadyExistsError,\n ConversationNotFoundError,\n} from \"@voltagent/core\";\nimport type {\n Conversation,\n ConversationQueryOptions,\n ConversationStepRecord,\n CreateConversationInput,\n GetConversationStepsOptions,\n GetMessagesOptions,\n StorageAdapter,\n WorkflowStateEntry,\n WorkingMemoryScope,\n} from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal\";\nimport { type Logger, createPinoLogger } from \"@voltagent/logger\";\nimport type { UIMessage } from \"ai\";\n\n/**\n * LibSQL configuration options for Memory\n */\nexport interface LibSQLMemoryOptions {\n /**\n * Database URL (e.g., 'file:./conversations.db' or 'libsql://...')\n * @default \"file:./.voltagent/memory.db\"\n */\n url?: string;\n\n /**\n * Auth token for remote connections (optional)\n */\n authToken?: string;\n\n /**\n * Prefix for table names\n * @default \"voltagent_memory\"\n */\n tablePrefix?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Logger instance\n */\n logger?: Logger;\n\n /**\n * Maximum number of retries for database operations\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Initial retry delay in milliseconds\n * @default 100\n */\n retryDelayMs?: number;\n}\n\n/**\n * LibSQL Storage Adapter for Memory\n * Production-ready storage for conversations and messages\n * Compatible with existing LibSQL storage structure\n */\nexport class LibSQLMemoryAdapter implements StorageAdapter {\n private client: Client;\n private tablePrefix: string;\n private initialized = false;\n private logger: Logger;\n private maxRetries: number;\n private retryDelayMs: number;\n private url: string;\n\n constructor(options: LibSQLMemoryOptions = {}) {\n this.tablePrefix = options.tablePrefix ?? \"voltagent_memory\";\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelayMs = options.retryDelayMs ?? 100;\n\n // Initialize logger - use provided logger, global logger, or create new one\n this.logger =\n options.logger ||\n AgentRegistry.getInstance().getGlobalLogger() ||\n createPinoLogger({ name: \"libsql-memory\" });\n\n this.url = options.url ?? \"file:./.voltagent/memory.db\";\n\n // Create directory for file-based databases\n if (this.url.startsWith(\"file:\")) {\n const dbPath = this.url.replace(\"file:\", \"\");\n const dbDir = path.dirname(dbPath);\n if (dbDir && dbDir !== \".\" && !fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n this.logger.debug(`Created database directory: ${dbDir}`);\n }\n }\n\n // Create LibSQL client\n this.client = createClient({\n url: this.url,\n authToken: options.authToken,\n });\n\n this.logger.debug(\"LibSQL Memory adapter initialized\", { url: this.url });\n }\n\n /**\n * Execute a database operation with retry logic\n */\n private async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error: any) {\n lastError = error;\n\n // Check if error is retryable (SQLITE_BUSY, etc.)\n if (\n error?.code === \"SQLITE_BUSY\" ||\n error?.message?.includes(\"SQLITE_BUSY\") ||\n error?.message?.includes(\"database is locked\")\n ) {\n const delay = this.retryDelayMs * 2 ** attempt; // Exponential backoff\n this.logger.debug(\n `Database busy, retrying ${operationName} (attempt ${attempt + 1}/${this.maxRetries}) after ${delay}ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n // Non-retryable error, throw immediately\n throw error;\n }\n }\n }\n\n // All retries exhausted\n this.logger.error(\n `Failed to execute ${operationName} after ${this.maxRetries} attempts`,\n lastError,\n );\n throw lastError;\n }\n\n /**\n * Initialize database schema\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n const messagesTable = `${this.tablePrefix}_messages`;\n const usersTable = `${this.tablePrefix}_users`;\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const stepsTable = `${this.tablePrefix}_steps`;\n\n // Set PRAGMA settings for better concurrency\n // Execute individually to handle errors gracefully\n const isMemoryDb = this.url === \":memory:\" || this.url.includes(\"mode=memory\");\n\n // Only set WAL mode for file-based databases (not for in-memory)\n if (!isMemoryDb && (this.url.startsWith(\"file:\") || this.url.startsWith(\"libsql:\"))) {\n try {\n await this.client.execute(\"PRAGMA journal_mode=WAL\");\n this.logger.debug(\"Set PRAGMA journal_mode=WAL\");\n } catch (err) {\n this.logger.debug(\"Failed to set PRAGMA journal_mode=WAL (non-critical)\", { err });\n }\n }\n\n // Set busy timeout (works for both memory and file databases)\n try {\n await this.client.execute(\"PRAGMA busy_timeout=5000\");\n this.logger.debug(\"Set PRAGMA busy_timeout=5000\");\n } catch (err) {\n this.logger.debug(\"Failed to set PRAGMA busy_timeout (non-critical)\", { err });\n }\n\n // Enable foreign keys (works for both memory and file databases)\n try {\n await this.client.execute(\"PRAGMA foreign_keys=ON\");\n this.logger.debug(\"Set PRAGMA foreign_keys=ON\");\n } catch (err) {\n this.logger.debug(\"Failed to set PRAGMA foreign_keys (non-critical)\", { err });\n }\n\n this.logger.debug(\"Applied PRAGMA settings for better concurrency\");\n\n await this.executeWithRetry(async () => {\n await this.client.batch([\n // Create users table (for user-level working memory)\n `CREATE TABLE IF NOT EXISTS ${usersTable} (\n id TEXT PRIMARY KEY,\n metadata TEXT,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP\n )`,\n\n // Create conversations table (matching existing structure)\n `CREATE TABLE IF NOT EXISTS ${conversationsTable} (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n title TEXT NOT NULL,\n metadata TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n\n // Create messages table (matching existing structure)\n `CREATE TABLE IF NOT EXISTS ${messagesTable} (\n conversation_id TEXT NOT NULL,\n message_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n role TEXT NOT NULL,\n parts TEXT NOT NULL,\n metadata TEXT,\n format_version INTEGER DEFAULT 2,\n created_at TEXT NOT NULL,\n PRIMARY KEY (conversation_id, message_id)\n )`,\n\n // Create workflow states table\n `CREATE TABLE IF NOT EXISTS ${workflowStatesTable} (\n id TEXT PRIMARY KEY,\n workflow_id TEXT NOT NULL,\n workflow_name TEXT NOT NULL,\n status TEXT NOT NULL,\n suspension TEXT,\n events TEXT,\n output TEXT,\n cancellation TEXT,\n user_id TEXT,\n conversation_id TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n\n // Create conversation steps table\n `CREATE TABLE IF NOT EXISTS ${stepsTable} (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n agent_name TEXT,\n operation_id TEXT,\n step_index INTEGER NOT NULL,\n type TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT,\n arguments TEXT,\n result TEXT,\n usage TEXT,\n sub_agent_id TEXT,\n sub_agent_name TEXT,\n created_at TEXT NOT NULL,\n FOREIGN KEY (conversation_id) REFERENCES ${conversationsTable}(id) ON DELETE CASCADE\n )`,\n\n // Create indexes for better performance\n `CREATE INDEX IF NOT EXISTS idx_${conversationsTable}_user_id ON ${conversationsTable}(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${conversationsTable}_resource_id ON ${conversationsTable}(resource_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${messagesTable}_conversation_id ON ${messagesTable}(conversation_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${messagesTable}_created_at ON ${messagesTable}(created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_${workflowStatesTable}_workflow_id ON ${workflowStatesTable}(workflow_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${workflowStatesTable}_status ON ${workflowStatesTable}(status)`,\n `CREATE INDEX IF NOT EXISTS idx_${stepsTable}_conversation ON ${stepsTable}(conversation_id, step_index)`,\n `CREATE INDEX IF NOT EXISTS idx_${stepsTable}_operation ON ${stepsTable}(conversation_id, operation_id)`,\n ]);\n }, \"initialize database schema\");\n\n // Add V2 columns to existing messages table if needed\n await this.addV2ColumnsToMessagesTable();\n\n // Migrate default user_id values to actual values from conversations\n await this.migrateDefaultUserIds();\n\n // Add new workflow state columns for event persistence\n await this.addWorkflowStateColumns();\n\n this.initialized = true;\n this.logger.debug(\"Database schema initialized\");\n }\n\n /**\n * Add new columns to messages table for V2 format if they don't exist\n * This allows existing tables to support both old and new message formats\n */\n private async addV2ColumnsToMessagesTable(): Promise<void> {\n const messagesTableName = `${this.tablePrefix}_messages`;\n\n try {\n // Check which columns exist\n const tableInfo = await this.client.execute(`PRAGMA table_info(${messagesTableName})`);\n const columns = tableInfo.rows.map((row) => row.name as string);\n\n // Step 1: Add new V2 columns if they don't exist\n if (!columns.includes(\"parts\")) {\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} ADD COLUMN parts TEXT`);\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"metadata\")) {\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} ADD COLUMN metadata TEXT`);\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"format_version\")) {\n try {\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} ADD COLUMN format_version INTEGER DEFAULT 2`,\n );\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"user_id\")) {\n try {\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} ADD COLUMN user_id TEXT NOT NULL DEFAULT 'default'`,\n );\n } catch (_e) {\n // Column might already exist\n }\n }\n\n // Step 2: Migrate old columns to nullable versions if they exist\n // Check if content needs migration (check for NOT NULL constraint)\n const contentInfo = tableInfo.rows.find((row) => row.name === \"content\");\n if (contentInfo && contentInfo.notnull === 1) {\n try {\n // Create nullable temp column\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} ADD COLUMN content_temp TEXT`,\n );\n\n // Copy data\n await this.client.execute(\n `UPDATE ${messagesTableName} SET content_temp = content WHERE content IS NOT NULL`,\n );\n\n // Try to drop old column (SQLite 3.35.0+)\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} DROP COLUMN content`);\n\n // If drop succeeded, rename temp to original\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} RENAME COLUMN content_temp TO content`,\n );\n } catch (_) {\n // If DROP not supported, keep both columns\n // Silent fail - not critical\n }\n } catch (_) {\n // Content migration error - not critical\n }\n }\n\n // Same for type column\n const typeInfo = tableInfo.rows.find((row) => row.name === \"type\");\n if (typeInfo && typeInfo.notnull === 1) {\n try {\n // Create nullable temp column\n await this.client.execute(`ALTER TABLE ${messagesTableName} ADD COLUMN type_temp TEXT`);\n\n // Copy data\n await this.client.execute(\n `UPDATE ${messagesTableName} SET type_temp = type WHERE type IS NOT NULL`,\n );\n\n // Try to drop old column (SQLite 3.35.0+)\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} DROP COLUMN type`);\n\n // If drop succeeded, rename temp to original\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} RENAME COLUMN type_temp TO type`,\n );\n } catch (_) {\n // If DROP not supported, keep both columns\n // Silent fail - not critical\n }\n } catch (_) {\n // Type migration error - not critical\n }\n }\n } catch (_) {\n // Don't throw - this is not critical for new installations\n }\n }\n\n /**\n * Migrate default user_id values in messages table\n * Updates messages with user_id='default' to use the actual user_id from their conversation\n */\n private async migrateDefaultUserIds(): Promise<void> {\n const messagesTableName = `${this.tablePrefix}_messages`;\n const conversationsTableName = `${this.tablePrefix}_conversations`;\n\n try {\n // First, check if there are any messages with default user_id\n const checkResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${messagesTableName} WHERE user_id = 'default'`,\n args: [],\n });\n\n const defaultCount = (checkResult.rows[0]?.count as number) || 0;\n\n if (defaultCount === 0) {\n return;\n }\n\n this.logger.debug(`Found ${defaultCount} messages with default user_id, starting migration`);\n\n // Update messages with the actual user_id from their conversation\n // Using a JOIN to get the user_id from the conversations table\n await this.executeWithRetry(async () => {\n const result = await this.client.execute({\n sql: `UPDATE ${messagesTableName}\n SET user_id = (\n SELECT c.user_id \n FROM ${conversationsTableName} c \n WHERE c.id = ${messagesTableName}.conversation_id\n )\n WHERE user_id = 'default'\n AND EXISTS (\n SELECT 1 \n FROM ${conversationsTableName} c \n WHERE c.id = ${messagesTableName}.conversation_id\n )`,\n args: [],\n });\n\n const updatedCount = result.rowsAffected || 0;\n this.logger.info(\n `Successfully migrated ${updatedCount} messages from default user_id to actual user_ids`,\n );\n\n // Check if there are any remaining messages with default user_id (orphaned messages)\n const remainingResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${messagesTableName} WHERE user_id = 'default'`,\n args: [],\n });\n\n const remainingCount = (remainingResult.rows[0]?.count as number) || 0;\n\n if (remainingCount > 0) {\n this.logger.warn(\n `${remainingCount} messages still have default user_id (possibly orphaned messages without valid conversations)`,\n );\n }\n }, \"migrate default user_ids\");\n } catch (error) {\n // Log the error but don't throw - this migration is not critical\n this.logger.error(\"Failed to migrate default user_ids\", error as Error);\n }\n }\n\n /**\n * Add new columns to workflow_states table for event persistence\n * This migration adds support for events, output, and cancellation tracking\n */\n private async addWorkflowStateColumns(): Promise<void> {\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n\n try {\n // Check which columns exist\n const tableInfo = await this.client.execute(`PRAGMA table_info(${workflowStatesTable})`);\n const columns = tableInfo.rows.map((row) => row.name as string);\n\n // Add events column if it doesn't exist\n if (!columns.includes(\"events\")) {\n try {\n await this.client.execute(`ALTER TABLE ${workflowStatesTable} ADD COLUMN events TEXT`);\n this.logger.debug(\"Added 'events' column to workflow_states table\");\n } catch (_e) {\n // Column might already exist\n }\n }\n\n // Add output column if it doesn't exist\n if (!columns.includes(\"output\")) {\n try {\n await this.client.execute(`ALTER TABLE ${workflowStatesTable} ADD COLUMN output TEXT`);\n this.logger.debug(\"Added 'output' column to workflow_states table\");\n } catch (_e) {\n // Column might already exist\n }\n }\n\n // Add cancellation column if it doesn't exist\n if (!columns.includes(\"cancellation\")) {\n try {\n await this.client.execute(\n `ALTER TABLE ${workflowStatesTable} ADD COLUMN cancellation TEXT`,\n );\n this.logger.debug(\"Added 'cancellation' column to workflow_states table\");\n } catch (_e) {\n // Column might already exist\n }\n }\n } catch (error) {\n // Log the error but don't throw - existing deployments without these columns will still work\n this.logger.warn(\"Failed to add workflow state columns (non-critical)\", error as Error);\n }\n }\n\n // ============================================================================\n // Message Operations\n // ============================================================================\n\n /**\n * Add a single message\n */\n async addMessage(message: UIMessage, userId: string, conversationId: string): Promise<void> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n\n // Ensure conversation exists\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(conversationId);\n }\n\n // Insert message\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `INSERT INTO ${messagesTable} (conversation_id, message_id, user_id, role, parts, metadata, format_version, created_at) \n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n conversationId,\n message.id,\n userId,\n message.role,\n safeStringify(message.parts),\n message.metadata ? safeStringify(message.metadata) : null,\n 2, // format_version\n new Date().toISOString(),\n ],\n });\n }, \"add message\");\n }\n\n /**\n * Add multiple messages\n */\n async addMessages(messages: UIMessage[], userId: string, conversationId: string): Promise<void> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n\n // Ensure conversation exists\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(conversationId);\n }\n\n const now = new Date().toISOString();\n\n // Use transaction for batch insert\n await this.executeWithRetry(async () => {\n await this.client.batch(\n messages.map((message) => ({\n sql: `INSERT INTO ${messagesTable} (conversation_id, message_id, user_id, role, parts, metadata, format_version, created_at) \n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n conversationId,\n message.id,\n userId,\n message.role,\n safeStringify(message.parts),\n message.metadata ? safeStringify(message.metadata) : null,\n 2, // format_version\n now,\n ],\n })),\n );\n }, \"add batch messages\");\n }\n\n async saveConversationSteps(steps: ConversationStepRecord[]): Promise<void> {\n if (steps.length === 0) return;\n\n await this.initialize();\n const stepsTable = `${this.tablePrefix}_steps`;\n\n await this.executeWithRetry(async () => {\n await this.client.batch(\n steps.map((step) => {\n const createdAt = step.createdAt ?? new Date().toISOString();\n return {\n sql: `INSERT INTO ${stepsTable} (\n id,\n conversation_id,\n user_id,\n agent_id,\n agent_name,\n operation_id,\n step_index,\n type,\n role,\n content,\n arguments,\n result,\n usage,\n sub_agent_id,\n sub_agent_name,\n created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n conversation_id = excluded.conversation_id,\n user_id = excluded.user_id,\n agent_id = excluded.agent_id,\n agent_name = excluded.agent_name,\n operation_id = excluded.operation_id,\n step_index = excluded.step_index,\n type = excluded.type,\n role = excluded.role,\n content = excluded.content,\n arguments = excluded.arguments,\n result = excluded.result,\n usage = excluded.usage,\n sub_agent_id = excluded.sub_agent_id,\n sub_agent_name = excluded.sub_agent_name,\n created_at = excluded.created_at`,\n args: [\n step.id,\n step.conversationId,\n step.userId,\n step.agentId,\n step.agentName ?? null,\n step.operationId ?? null,\n step.stepIndex,\n step.type,\n step.role,\n step.content ?? null,\n step.arguments ? safeStringify(step.arguments) : null,\n step.result ? safeStringify(step.result) : null,\n step.usage ? safeStringify(step.usage) : null,\n step.subAgentId ?? null,\n step.subAgentName ?? null,\n createdAt,\n ],\n };\n }),\n );\n }, \"save conversation steps\");\n }\n\n /**\n * Get messages with optional filtering\n */\n async getMessages(\n userId: string,\n conversationId: string,\n options?: GetMessagesOptions,\n ): Promise<UIMessage<{ createdAt: Date }>[]> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n const { limit, before, after, roles } = options || {};\n\n // Build query with filters - use SELECT * to handle both old and new schemas safely\n let sql = `SELECT * FROM ${messagesTable}\n WHERE conversation_id = ? AND user_id = ?`;\n const args: any[] = [conversationId, userId];\n\n // Add role filter\n if (roles && roles.length > 0) {\n const placeholders = roles.map(() => \"?\").join(\",\");\n sql += ` AND role IN (${placeholders})`;\n args.push(...roles);\n }\n\n // Add time filters\n if (before) {\n sql += \" AND created_at < ?\";\n args.push(before.toISOString());\n }\n\n if (after) {\n sql += \" AND created_at > ?\";\n args.push(after.toISOString());\n }\n\n // Order by creation time and apply limit\n sql += \" ORDER BY created_at ASC\";\n if (limit && limit > 0) {\n sql += \" LIMIT ?\";\n args.push(limit);\n }\n\n const result = await this.client.execute({ sql, args });\n\n // Convert rows to UIMessages with on-the-fly migration for old format\n return result.rows.map((row) => {\n // Determine parts based on whether we have new format (parts) or old format (content)\n let parts: any;\n\n // Check for new format first (parts column exists and has value)\n if (row.parts !== undefined && row.parts !== null) {\n // New format - parse parts directly\n try {\n parts = JSON.parse(row.parts as string);\n } catch {\n parts = [];\n }\n }\n // Check for old format (content column exists and has value)\n else if (row.content !== undefined && row.content !== null) {\n // Old format - convert content to parts\n try {\n const content = JSON.parse(row.content as string);\n\n if (typeof content === \"string\") {\n // Simple string content -> text part\n parts = [{ type: \"text\", text: content }];\n } else if (Array.isArray(content)) {\n // Already an array of parts (old BaseMessage format with MessageContent array)\n parts = content;\n } else {\n // Unknown format - fallback to empty\n parts = [];\n }\n } catch {\n // If parsing fails, treat as plain text\n parts = [{ type: \"text\", text: row.content as string }];\n }\n } else {\n // No content at all - empty parts\n parts = [];\n }\n\n const metadata = row.metadata ? JSON.parse(row.metadata as string) : {};\n return {\n id: row.message_id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\",\n parts,\n metadata: {\n ...metadata,\n createdAt: row.created_at ? new Date(row.created_at as string) : undefined,\n },\n };\n });\n }\n\n async getConversationSteps(\n userId: string,\n conversationId: string,\n options?: GetConversationStepsOptions,\n ): Promise<ConversationStepRecord[]> {\n await this.initialize();\n\n const stepsTable = `${this.tablePrefix}_steps`;\n const limit = options?.limit && options.limit > 0 ? options.limit : undefined;\n\n let sql = `SELECT * FROM ${stepsTable} WHERE conversation_id = ? AND user_id = ?`;\n const args: any[] = [conversationId, userId];\n\n if (options?.operationId) {\n sql += \" AND operation_id = ?\";\n args.push(options.operationId);\n }\n\n sql += \" ORDER BY step_index ASC\";\n if (limit !== undefined) {\n sql += \" LIMIT ?\";\n args.push(limit);\n }\n\n const result = await this.client.execute({ sql, args });\n\n const parseJsonField = (value: unknown) => {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n };\n\n return result.rows.map((row) => ({\n id: row.id as string,\n conversationId: row.conversation_id as string,\n userId: row.user_id as string,\n agentId: row.agent_id as string,\n agentName: (row.agent_name as string) ?? undefined,\n operationId: (row.operation_id as string) ?? undefined,\n stepIndex:\n typeof row.step_index === \"number\"\n ? (row.step_index as number)\n : Number(row.step_index ?? 0),\n type: row.type as ConversationStepRecord[\"type\"],\n role: row.role as ConversationStepRecord[\"role\"],\n content: (row.content as string) ?? undefined,\n arguments: parseJsonField(row.arguments),\n result: parseJsonField(row.result),\n usage: parseJsonField(row.usage),\n subAgentId: (row.sub_agent_id as string) ?? undefined,\n subAgentName: (row.sub_agent_name as string) ?? undefined,\n createdAt: (row.created_at as string) ?? new Date().toISOString(),\n }));\n }\n\n /**\n * Clear messages for a user\n */\n async clearMessages(userId: string, conversationId?: string): Promise<void> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n const conversationsTable = `${this.tablePrefix}_conversations`;\n const stepsTable = `${this.tablePrefix}_steps`;\n\n if (conversationId) {\n // Clear messages for specific conversation\n await this.client.execute({\n sql: `DELETE FROM ${messagesTable} WHERE conversation_id = ? AND user_id = ?`,\n args: [conversationId, userId],\n });\n await this.client.execute({\n sql: `DELETE FROM ${stepsTable} WHERE conversation_id = ? AND user_id = ?`,\n args: [conversationId, userId],\n });\n } else {\n // Clear all messages for the user\n await this.client.execute({\n sql: `DELETE FROM ${messagesTable}\n WHERE conversation_id IN (\n SELECT id FROM ${conversationsTable} WHERE user_id = ?\n )`,\n args: [userId],\n });\n await this.client.execute({\n sql: `DELETE FROM ${stepsTable}\n WHERE conversation_id IN (\n SELECT id FROM ${conversationsTable} WHERE user_id = ?\n )`,\n args: [userId],\n });\n }\n }\n\n // ============================================================================\n // Conversation Operations\n // ============================================================================\n\n /**\n * Create a new conversation\n */\n async createConversation(input: CreateConversationInput): Promise<Conversation> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n // Check if conversation already exists\n const existing = await this.getConversation(input.id);\n if (existing) {\n throw new ConversationAlreadyExistsError(input.id);\n }\n\n const now = new Date().toISOString();\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `INSERT INTO ${conversationsTable} (id, resource_id, user_id, title, metadata, created_at, updated_at) \n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n args: [\n input.id,\n input.resourceId,\n input.userId,\n input.title,\n safeStringify(input.metadata || {}),\n now,\n now,\n ],\n });\n }, \"create conversation\");\n\n return {\n id: input.id,\n userId: input.userId,\n resourceId: input.resourceId,\n title: input.title,\n metadata: input.metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n }\n\n /**\n * Get a conversation by ID\n */\n async getConversation(id: string): Promise<Conversation | null> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${conversationsTable} WHERE id = ?`,\n args: [id],\n });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return {\n id: row.id as string,\n userId: row.user_id as string,\n resourceId: row.resource_id as string,\n title: row.title as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : {},\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n };\n }\n\n /**\n * Get conversations by resource ID\n */\n async getConversations(resourceId: string): Promise<Conversation[]> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${conversationsTable} WHERE resource_id = ? ORDER BY updated_at DESC`,\n args: [resourceId],\n });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n userId: row.user_id as string,\n resourceId: row.resource_id as string,\n title: row.title as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : {},\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n }));\n }\n\n /**\n * Get conversations by user ID\n */\n async getConversationsByUserId(\n userId: string,\n options?: Omit<ConversationQueryOptions, \"userId\">,\n ): Promise<Conversation[]> {\n return this.queryConversations({ ...options, userId });\n }\n\n /**\n * Query conversations with filters\n */\n async queryConversations(options: ConversationQueryOptions): Promise<Conversation[]> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n let sql = `SELECT * FROM ${conversationsTable} WHERE 1=1`;\n const args: any[] = [];\n\n // Add filters\n if (options.userId) {\n sql += \" AND user_id = ?\";\n args.push(options.userId);\n }\n\n if (options.resourceId) {\n sql += \" AND resource_id = ?\";\n args.push(options.resourceId);\n }\n\n // Add ordering\n const orderBy = options.orderBy || \"updated_at\";\n const orderDirection = options.orderDirection || \"DESC\";\n sql += ` ORDER BY ${orderBy} ${orderDirection}`;\n\n // Add pagination\n if (options.limit) {\n sql += \" LIMIT ?\";\n args.push(options.limit);\n }\n\n if (options.offset) {\n sql += \" OFFSET ?\";\n args.push(options.offset);\n }\n\n const result = await this.client.execute({ sql, args });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n userId: row.user_id as string,\n resourceId: row.resource_id as string,\n title: row.title as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : {},\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n }));\n }\n\n /**\n * Update a conversation\n */\n async updateConversation(\n id: string,\n updates: Partial<Omit<Conversation, \"id\" | \"createdAt\" | \"updatedAt\">>,\n ): Promise<Conversation> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n const conversation = await this.getConversation(id);\n if (!conversation) {\n throw new ConversationNotFoundError(id);\n }\n\n const now = new Date().toISOString();\n const fieldsToUpdate: string[] = [\"updated_at = ?\"];\n const args: any[] = [now];\n\n if (updates.title !== undefined) {\n fieldsToUpdate.push(\"title = ?\");\n args.push(updates.title);\n }\n\n if (updates.resourceId !== undefined) {\n fieldsToUpdate.push(\"resource_id = ?\");\n args.push(updates.resourceId);\n }\n\n if (updates.metadata !== undefined) {\n fieldsToUpdate.push(\"metadata = ?\");\n args.push(safeStringify(updates.metadata));\n }\n\n args.push(id); // WHERE clause\n\n await this.client.execute({\n sql: `UPDATE ${conversationsTable} SET ${fieldsToUpdate.join(\", \")} WHERE id = ?`,\n args,\n });\n\n const updated = await this.getConversation(id);\n if (!updated) {\n throw new Error(`Conversation not found after update: ${id}`);\n }\n return updated;\n }\n\n /**\n * Delete a conversation\n */\n async deleteConversation(id: string): Promise<void> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n await this.client.execute({\n sql: `DELETE FROM ${conversationsTable} WHERE id = ?`,\n args: [id],\n });\n }\n\n // ============================================================================\n // Working Memory Operations\n // ============================================================================\n\n /**\n * Get working memory\n */\n async getWorkingMemory(params: {\n conversationId?: string;\n userId?: string;\n scope: WorkingMemoryScope;\n }): Promise<string | null> {\n await this.initialize();\n\n if (params.scope === \"conversation\" && params.conversationId) {\n const conversation = await this.getConversation(params.conversationId);\n return (conversation?.metadata?.workingMemory as string) || null;\n }\n\n if (params.scope === \"user\" && params.userId) {\n const usersTable = `${this.tablePrefix}_users`;\n const result = await this.client.execute({\n sql: `SELECT metadata FROM ${usersTable} WHERE id = ?`,\n args: [params.userId],\n });\n\n if (result.rows.length > 0) {\n const metadata = result.rows[0].metadata\n ? JSON.parse(result.rows[0].metadata as string)\n : {};\n return metadata.workingMemory || null;\n }\n }\n\n return null;\n }\n\n /**\n * Set working memory\n */\n async setWorkingMemory(params: {\n conversationId?: string;\n userId?: string;\n content: string;\n scope: WorkingMemoryScope;\n }): Promise<void> {\n await this.initialize();\n\n if (params.scope === \"conversation\" && params.conversationId) {\n const conversation = await this.getConversation(params.conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(params.conversationId);\n }\n\n const metadata = conversation.metadata || {};\n metadata.workingMemory = params.content;\n\n await this.updateConversation(params.conversationId, { metadata });\n }\n\n if (params.scope === \"user\" && params.userId) {\n const usersTable = `${this.tablePrefix}_users`;\n const now = new Date().toISOString();\n\n // Check if user exists\n const result = await this.client.execute({\n sql: `SELECT metadata FROM ${usersTable} WHERE id = ?`,\n args: [params.userId],\n });\n\n if (result.rows.length > 0) {\n // User exists, update metadata\n const metadata = result.rows[0].metadata\n ? JSON.parse(result.rows[0].metadata as string)\n : {};\n metadata.workingMemory = params.content;\n\n await this.client.execute({\n sql: `UPDATE ${usersTable} SET metadata = ?, updated_at = ? WHERE id = ?`,\n args: [safeStringify(metadata), now, params.userId],\n });\n } else {\n // User doesn't exist, create new record\n await this.client.execute({\n sql: `INSERT INTO ${usersTable} (id, metadata, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n args: [params.userId, safeStringify({ workingMemory: params.content }), now, now],\n });\n }\n }\n }\n\n /**\n * Delete working memory\n */\n async deleteWorkingMemory(params: {\n conversationId?: string;\n userId?: string;\n scope: WorkingMemoryScope;\n }): Promise<void> {\n await this.initialize();\n\n if (params.scope === \"conversation\" && params.conversationId) {\n const conversation = await this.getConversation(params.conversationId);\n if (conversation?.metadata?.workingMemory) {\n const metadata = { ...conversation.metadata };\n // biome-ignore lint/performance/noDelete: <explanation>\n delete metadata.workingMemory;\n await this.updateConversation(params.conversationId, { metadata });\n }\n }\n\n if (params.scope === \"user\" && params.userId) {\n const usersTable = `${this.tablePrefix}_users`;\n const result = await this.client.execute({\n sql: `SELECT metadata FROM ${usersTable} WHERE id = ?`,\n args: [params.userId],\n });\n\n if (result.rows.length > 0 && result.rows[0].metadata) {\n const metadata = JSON.parse(result.rows[0].metadata as string);\n if (metadata.workingMemory) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete metadata.workingMemory;\n await this.client.execute({\n sql: `UPDATE ${usersTable} SET metadata = ?, updated_at = ? WHERE id = ?`,\n args: [safeStringify(metadata), new Date().toISOString(), params.userId],\n });\n }\n }\n }\n }\n\n // ============================================================================\n // Workflow State Operations\n // ============================================================================\n\n /**\n * Get workflow state by execution ID\n */\n async getWorkflowState(executionId: string): Promise<WorkflowStateEntry | null> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const result = await this.client.execute({\n sql: `SELECT * FROM ${workflowStatesTable} WHERE id = ?`,\n args: [executionId],\n });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return {\n id: row.id as string,\n workflowId: row.workflow_id as string,\n workflowName: row.workflow_name as string,\n status: row.status as \"running\" | \"suspended\" | \"completed\" | \"error\",\n suspension: row.suspension ? JSON.parse(row.suspension as string) : undefined,\n events: row.events ? JSON.parse(row.events as string) : undefined,\n output: row.output ? JSON.parse(row.output as string) : undefined,\n cancellation: row.cancellation ? JSON.parse(row.cancellation as string) : undefined,\n userId: row.user_id as string | undefined,\n conversationId: row.conversation_id as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n createdAt: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string),\n };\n }\n\n /**\n * Query workflow states with optional filters\n */\n async queryWorkflowRuns(query: {\n workflowId?: string;\n status?: WorkflowStateEntry[\"status\"];\n from?: Date;\n to?: Date;\n limit?: number;\n offset?: number;\n }): Promise<WorkflowStateEntry[]> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const conditions: string[] = [];\n const args: any[] = [];\n\n if (query.workflowId) {\n conditions.push(\"workflow_id = ?\");\n args.push(query.workflowId);\n }\n\n if (query.status) {\n conditions.push(\"status = ?\");\n args.push(query.status);\n }\n\n if (query.from) {\n conditions.push(\"created_at >= ?\");\n args.push(query.from.toISOString());\n }\n\n if (query.to) {\n conditions.push(\"created_at <= ?\");\n args.push(query.to.toISOString());\n }\n\n let sql = `SELECT * FROM ${workflowStatesTable}`;\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(\" AND \")}`;\n }\n sql += \" ORDER BY created_at DESC\";\n\n if (query.limit !== undefined) {\n sql += \" LIMIT ?\";\n args.push(query.limit);\n }\n\n if (query.offset !== undefined) {\n sql += \" OFFSET ?\";\n args.push(query.offset);\n }\n\n const result = await this.client.execute({\n sql,\n args,\n });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n workflowId: row.workflow_id as string,\n workflowName: row.workflow_name as string,\n status: row.status as WorkflowStateEntry[\"status\"],\n suspension: row.suspension ? JSON.parse(row.suspension as string) : undefined,\n events: row.events ? JSON.parse(row.events as string) : undefined,\n output: row.output ? JSON.parse(row.output as string) : undefined,\n cancellation: row.cancellation ? JSON.parse(row.cancellation as string) : undefined,\n userId: row.user_id as string | undefined,\n conversationId: row.conversation_id as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n createdAt: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string),\n }));\n }\n\n /**\n * Set workflow state\n */\n async setWorkflowState(executionId: string, state: WorkflowStateEntry): Promise<void> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n await this.client.execute({\n sql: `INSERT OR REPLACE INTO ${workflowStatesTable}\n (id, workflow_id, workflow_name, status, suspension, events, output, cancellation, user_id, conversation_id, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n executionId,\n state.workflowId,\n state.workflowName,\n state.status,\n state.suspension ? safeStringify(state.suspension) : null,\n state.events ? safeStringify(state.events) : null,\n state.output ? safeStringify(state.output) : null,\n state.cancellation ? safeStringify(state.cancellation) : null,\n state.userId || null,\n state.conversationId || null,\n state.metadata ? safeStringify(state.metadata) : null,\n state.createdAt.toISOString(),\n state.updatedAt.toISOString(),\n ],\n });\n }\n\n /**\n * Update workflow state\n */\n async updateWorkflowState(\n executionId: string,\n updates: Partial<WorkflowStateEntry>,\n ): Promise<void> {\n await this.initialize();\n\n const existing = await this.getWorkflowState(executionId);\n if (!existing) {\n throw new Error(`Workflow state ${executionId} not found`);\n }\n\n const updated: WorkflowStateEntry = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n\n await this.setWorkflowState(executionId, updated);\n }\n\n /**\n * Get suspended workflow states for a workflow\n */\n async getSuspendedWorkflowStates(workflowId: string): Promise<WorkflowStateEntry[]> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const result = await this.client.execute({\n sql: `SELECT * FROM ${workflowStatesTable} WHERE workflow_id = ? AND status = 'suspended' ORDER BY created_at DESC`,\n args: [workflowId],\n });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n workflowId: row.workflow_id as string,\n workflowName: row.workflow_name as string,\n status: \"suspended\" as const,\n suspension: row.suspension ? JSON.parse(row.suspension as string) : undefined,\n events: row.events ? JSON.parse(row.events as string) : undefined,\n output: row.output ? JSON.parse(row.output as string) : undefined,\n cancellation: row.cancellation ? JSON.parse(row.cancellation as string) : undefined,\n userId: row.user_id as string | undefined,\n conversationId: row.conversation_id as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n createdAt: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string),\n }));\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n // LibSQL client doesn't have explicit close method\n // Connection is managed automatically\n this.logger.debug(\"Closing LibSQL Memory adapter\");\n }\n}\n","/**\n * LibSQL Observability Adapter\n * Provides persistent storage for OpenTelemetry spans using LibSQL/Turso database\n * Part of the OpenTelemetry observability migration (Phase 3)\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { Client } from \"@libsql/client\";\nimport { createClient } from \"@libsql/client\";\nimport type {\n LogFilter,\n ObservabilityLogRecord,\n ObservabilitySpan,\n ObservabilityStorageAdapter,\n} from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal/utils\";\nimport { type Logger, createPinoLogger } from \"@voltagent/logger\";\n\n/**\n * Options for configuring the LibSQLObservabilityAdapter\n */\nexport interface LibSQLObservabilityOptions {\n /**\n * LibSQL connection URL\n * Can be either a remote Turso URL or a local file path\n * @default \"file:./.voltagent/observability.db\"\n * @example \"libsql://your-database.turso.io\" for remote Turso\n * @example \"file:observability.db\" for local SQLite in current directory\n * @example \"file:.voltagent/observability.db\" for local SQLite in .voltagent folder\n */\n url?: string;\n\n /**\n * Auth token for LibSQL/Turso\n * Not needed for local SQLite\n */\n authToken?: string;\n\n /**\n * Prefix for table names\n * @default \"observability\"\n */\n tablePrefix?: string;\n\n /**\n * Whether to enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Optional logger instance\n */\n logger?: Logger;\n\n /**\n * Maximum number of spans to return in a single query\n * @default 1000\n */\n maxSpansPerQuery?: number;\n}\n\n/**\n * LibSQL Observability Adapter\n * Provides observability storage using LibSQL/Turso database\n * Implements the ObservabilityStorageAdapter interface for OpenTelemetry spans\n */\nexport class LibSQLObservabilityAdapter implements ObservabilityStorageAdapter {\n private client: Client;\n private tablePrefix: string;\n private debug: boolean;\n private logger: Logger;\n private initialized: Promise<void>;\n private maxSpansPerQuery: number;\n\n constructor(options: LibSQLObservabilityOptions = {}) {\n // Initialize the logger\n this.logger = options.logger || createPinoLogger({ name: \"libsql-observability\" });\n\n this.tablePrefix = options.tablePrefix || \"observability\";\n this.debug = options.debug || false;\n this.maxSpansPerQuery = options.maxSpansPerQuery || 1000;\n const url = options.url || \"file:./.voltagent/observability.db\";\n\n // Ensure parent directory exists for file-based databases\n if (url.startsWith(\"file:\") && !url.includes(\":memory:\")) {\n const filePath = url.substring(5); // Remove 'file:' prefix\n const dir = dirname(filePath);\n if (dir && dir !== \".\" && !existsSync(dir)) {\n try {\n mkdirSync(dir, { recursive: true });\n this.debugLog(\"Created directory for database\", { dir });\n } catch (error) {\n this.logger.warn(\"Failed to create directory for database\", { dir, error });\n }\n }\n }\n\n // Initialize the LibSQL client\n this.client = createClient({\n url,\n authToken: options.authToken,\n });\n\n this.debugLog(\"LibSQL observability adapter initialized with options\", {\n url,\n tablePrefix: this.tablePrefix,\n debug: this.debug,\n maxSpansPerQuery: this.maxSpansPerQuery,\n });\n\n // Initialize the database tables\n this.initialized = this.initializeDatabase();\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n private debugLog(message: string, data?: unknown): void {\n if (this.debug) {\n this.logger.debug(`${message}`, data || \"\");\n }\n }\n\n /**\n * Initialize database tables for observability\n */\n private async initializeDatabase(): Promise<void> {\n try {\n // Create main spans table with entity columns\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${this.tablePrefix}_spans (\n span_id TEXT PRIMARY KEY,\n trace_id TEXT NOT NULL,\n parent_span_id TEXT,\n entity_id TEXT,\n entity_type TEXT,\n name TEXT NOT NULL,\n kind INTEGER DEFAULT 0,\n start_time TEXT NOT NULL,\n end_time TEXT,\n duration REAL,\n status_code INTEGER DEFAULT 0,\n status_message TEXT,\n attributes TEXT,\n events TEXT,\n links TEXT,\n resource TEXT,\n instrumentation_scope TEXT,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Create indexes for efficient queries\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_trace_id \n ON ${this.tablePrefix}_spans(trace_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_parent_span_id \n ON ${this.tablePrefix}_spans(parent_span_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_start_time \n ON ${this.tablePrefix}_spans(start_time)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_name \n ON ${this.tablePrefix}_spans(name)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_entity_id \n ON ${this.tablePrefix}_spans(entity_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_entity_type \n ON ${this.tablePrefix}_spans(entity_type)\n `);\n\n // Create trace metadata table for fast trace listing with entity columns\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${this.tablePrefix}_traces (\n trace_id TEXT PRIMARY KEY,\n root_span_id TEXT,\n entity_id TEXT,\n entity_type TEXT,\n start_time TEXT NOT NULL,\n end_time TEXT,\n span_count INTEGER DEFAULT 1,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_traces_start_time \n ON ${this.tablePrefix}_traces(start_time DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_traces_entity_id \n ON ${this.tablePrefix}_traces(entity_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_traces_entity_type \n ON ${this.tablePrefix}_traces(entity_type)\n `);\n\n // Create logs table\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${this.tablePrefix}_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL,\n trace_id TEXT,\n span_id TEXT,\n trace_flags INTEGER,\n severity_number INTEGER,\n severity_text TEXT,\n body TEXT NOT NULL,\n attributes TEXT,\n resource TEXT,\n instrumentation_scope TEXT,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Create indexes for logs\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_trace_id \n ON ${this.tablePrefix}_logs(trace_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_span_id \n ON ${this.tablePrefix}_logs(span_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_timestamp \n ON ${this.tablePrefix}_logs(timestamp DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_severity \n ON ${this.tablePrefix}_logs(severity_number)\n `);\n\n this.debugLog(\"Database tables initialized successfully\");\n } catch (error) {\n this.logger.error(\"Failed to initialize database tables\", { error });\n throw error;\n }\n }\n\n /**\n * Ensure database is initialized before operations\n */\n private async ensureInitialized(): Promise<void> {\n await this.initialized;\n }\n\n /**\n * Add a span to the database\n */\n async addSpan(span: ObservabilitySpan): Promise<void> {\n await this.ensureInitialized();\n\n try {\n // Extract entity information from attributes\n const entityId = (span.attributes?.[\"entity.id\"] as string) || null;\n const entityType = (span.attributes?.[\"entity.type\"] as string) || null;\n\n // Start a transaction for consistency\n await this.client.batch([\n // Insert the span with entity columns\n {\n sql: `\n INSERT INTO ${this.tablePrefix}_spans (\n span_id, trace_id, parent_span_id, entity_id, entity_type, name, kind,\n start_time, end_time, duration,\n status_code, status_message,\n attributes, events, links,\n resource, instrumentation_scope\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n span.spanId,\n span.traceId,\n span.parentSpanId || null,\n entityId,\n entityType,\n span.name,\n span.kind,\n span.startTime,\n span.endTime || null,\n span.duration || null,\n span.status.code,\n span.status.message || null,\n safeStringify(span.attributes),\n safeStringify(span.events),\n span.links ? safeStringify(span.links) : null,\n span.resource ? safeStringify(span.resource) : null,\n span.instrumentationScope ? safeStringify(span.instrumentationScope) : null,\n ],\n },\n // Update or insert trace metadata with entity columns\n {\n sql: `\n INSERT INTO ${this.tablePrefix}_traces (\n trace_id, root_span_id, entity_id, entity_type, start_time, end_time, span_count\n ) VALUES (?, ?, ?, ?, ?, ?, 1)\n ON CONFLICT(trace_id) DO UPDATE SET\n span_count = span_count + 1,\n entity_id = COALESCE(excluded.entity_id, entity_id),\n entity_type = COALESCE(excluded.entity_type, entity_type),\n start_time = MIN(start_time, excluded.start_time),\n end_time = MAX(COALESCE(end_time, excluded.end_time), excluded.end_time),\n updated_at = CURRENT_TIMESTAMP\n `,\n args: [\n span.traceId,\n span.parentSpanId ? null : span.spanId, // Root span if no parent\n entityId,\n entityType,\n span.startTime,\n span.endTime || null,\n ],\n },\n ]);\n\n this.debugLog(\"Span added successfully\", {\n spanId: span.spanId,\n traceId: span.traceId,\n });\n } catch (error) {\n this.logger.error(\"Failed to add span\", { error, span });\n throw error;\n }\n }\n\n /**\n * Update an existing span\n */\n async updateSpan(spanId: string, updates: Partial<ObservabilitySpan>): Promise<void> {\n await this.ensureInitialized();\n\n try {\n const setClauses: string[] = [];\n const args: any[] = [];\n\n // Build dynamic SET clause based on provided updates\n if (updates.endTime !== undefined) {\n setClauses.push(\"end_time = ?\");\n args.push(updates.endTime);\n }\n if (updates.duration !== undefined) {\n setClauses.push(\"duration = ?\");\n args.push(updates.duration);\n }\n if (updates.status !== undefined) {\n setClauses.push(\"status_code = ?, status_message = ?\");\n args.push(updates.status.code, updates.status.message || null);\n }\n if (updates.attributes !== undefined) {\n setClauses.push(\"attributes = ?\");\n args.push(safeStringify(updates.attributes));\n }\n if (updates.events !== undefined) {\n setClauses.push(\"events = ?\");\n args.push(safeStringify(updates.events));\n }\n if (updates.links !== undefined) {\n setClauses.push(\"links = ?\");\n args.push(safeStringify(updates.links));\n }\n\n if (setClauses.length === 0) {\n return; // Nothing to update\n }\n\n setClauses.push(\"updated_at = CURRENT_TIMESTAMP\");\n args.push(spanId);\n\n await this.client.execute({\n sql: `\n UPDATE ${this.tablePrefix}_spans \n SET ${setClauses.join(\", \")}\n WHERE span_id = ?\n `,\n args,\n });\n\n // If endTime was updated, also update trace metadata\n if (updates.endTime) {\n const span = await this.getSpan(spanId);\n if (span) {\n await this.client.execute({\n sql: `\n UPDATE ${this.tablePrefix}_traces\n SET end_time = MAX(COALESCE(end_time, ?), ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE trace_id = ?\n `,\n args: [updates.endTime, updates.endTime, span.traceId],\n });\n }\n }\n\n this.debugLog(\"Span updated successfully\", { spanId, updates });\n } catch (error) {\n this.logger.error(\"Failed to update span\", { error, spanId, updates });\n throw error;\n }\n }\n\n /**\n * Get a span by ID\n */\n async getSpan(spanId: string): Promise<ObservabilitySpan | null> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_spans\n WHERE span_id = ?\n `,\n args: [spanId],\n });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return this.rowToSpan(row);\n } catch (error) {\n this.logger.error(\"Failed to get span\", { error, spanId });\n throw error;\n }\n }\n\n /**\n * Get all spans in a trace\n */\n async getTrace(traceId: string): Promise<ObservabilitySpan[]> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_spans\n WHERE trace_id = ?\n ORDER BY start_time ASC\n LIMIT ?\n `,\n args: [traceId, this.maxSpansPerQuery],\n });\n\n return result.rows.map((row) => this.rowToSpan(row));\n } catch (error) {\n this.logger.error(\"Failed to get trace\", { error, traceId });\n throw error;\n }\n }\n\n /**\n * List all traces with optional entity filter\n */\n async listTraces(\n limit = 100,\n offset = 0,\n filter?: {\n entityId?: string;\n entityType?: \"agent\" | \"workflow\";\n },\n ): Promise<string[]> {\n await this.ensureInitialized();\n\n try {\n let sql: string;\n let args: any[] = [];\n const conditions: string[] = [];\n\n if (filter?.entityId) {\n conditions.push(\"entity_id = ?\");\n args.push(filter.entityId);\n }\n\n if (filter?.entityType) {\n conditions.push(\"entity_type = ?\");\n args.push(filter.entityType);\n }\n\n if (conditions.length > 0) {\n // Filter by entity\n sql = `\n SELECT trace_id FROM ${this.tablePrefix}_traces\n WHERE ${conditions.join(\" AND \")}\n ORDER BY start_time DESC\n LIMIT ? OFFSET ?\n `;\n args.push(limit, offset);\n } else {\n // Get all traces\n sql = `\n SELECT trace_id FROM ${this.tablePrefix}_traces\n ORDER BY start_time DESC\n LIMIT ? OFFSET ?\n `;\n args = [limit, offset];\n }\n\n const result = await this.client.execute({ sql, args });\n return result.rows.map((row) => row.trace_id as string);\n } catch (error) {\n this.logger.error(\"Failed to list traces\", { error, limit, offset, filter });\n throw error;\n }\n }\n\n /**\n * Delete old spans\n */\n async deleteOldSpans(beforeTimestamp: number): Promise<number> {\n await this.ensureInitialized();\n\n try {\n const beforeDate = new Date(beforeTimestamp).toISOString();\n\n // Get affected trace IDs before deletion\n const tracesResult = await this.client.execute({\n sql: `\n SELECT DISTINCT trace_id FROM ${this.tablePrefix}_spans\n WHERE start_time < ?\n `,\n args: [beforeDate],\n });\n\n const affectedTraceIds = tracesResult.rows.map((row) => row.trace_id as string);\n\n // Delete old spans\n const deleteResult = await this.client.execute({\n sql: `\n DELETE FROM ${this.tablePrefix}_spans\n WHERE start_time < ?\n `,\n args: [beforeDate],\n });\n\n // Clean up trace metadata\n if (affectedTraceIds.length > 0) {\n // Update span counts for affected traces\n for (const traceId of affectedTraceIds) {\n const countResult = await this.client.execute({\n sql: `\n SELECT COUNT(*) as count FROM ${this.tablePrefix}_spans\n WHERE trace_id = ?\n `,\n args: [traceId],\n });\n\n const count = countResult.rows[0].count as number;\n if (count === 0) {\n // Delete trace metadata if no spans remain\n await this.client.execute({\n sql: `\n DELETE FROM ${this.tablePrefix}_traces\n WHERE trace_id = ?\n `,\n args: [traceId],\n });\n } else {\n // Update span count\n await this.client.execute({\n sql: `\n UPDATE ${this.tablePrefix}_traces\n SET span_count = ?,\n updated_at = CURRENT_TIMESTAMP\n WHERE trace_id = ?\n `,\n args: [count, traceId],\n });\n }\n }\n }\n\n const deletedCount = deleteResult.rowsAffected || 0;\n this.debugLog(\"Old spans deleted\", { deletedCount, beforeDate });\n return deletedCount;\n } catch (error) {\n this.logger.error(\"Failed to delete old spans\", { error, beforeTimestamp });\n throw error;\n }\n }\n\n /**\n * Clear all spans, traces, and logs\n */\n async clear(): Promise<void> {\n await this.ensureInitialized();\n\n try {\n await this.client.batch([\n { sql: `DELETE FROM ${this.tablePrefix}_spans`, args: [] },\n { sql: `DELETE FROM ${this.tablePrefix}_traces`, args: [] },\n { sql: `DELETE FROM ${this.tablePrefix}_logs`, args: [] },\n ]);\n\n this.debugLog(\"All spans, traces, and logs cleared\");\n } catch (error) {\n this.logger.error(\"Failed to clear data\", { error });\n throw error;\n }\n }\n\n /**\n * Convert a database row to an ObservabilitySpan\n */\n private rowToSpan(row: any): ObservabilitySpan {\n const span: ObservabilitySpan = {\n traceId: row.trace_id as string,\n spanId: row.span_id as string,\n name: row.name as string,\n kind: row.kind as number,\n startTime: row.start_time as string,\n status: {\n code: row.status_code as number,\n },\n attributes: row.attributes ? JSON.parse(row.attributes as string) : {},\n events: row.events ? JSON.parse(row.events as string) : [],\n };\n\n // Add optional fields only if they have values (not null)\n if (row.parent_span_id !== null) {\n span.parentSpanId = row.parent_span_id as string;\n }\n if (row.end_time !== null) {\n span.endTime = row.end_time as string;\n }\n if (row.duration !== null) {\n span.duration = row.duration as number;\n }\n if (row.status_message !== null) {\n span.status.message = row.status_message as string;\n }\n if (row.links && row.links !== \"null\") {\n const links = JSON.parse(row.links as string);\n if (links && links.length > 0) {\n span.links = links;\n }\n }\n if (row.resource && row.resource !== \"null\") {\n const resource = JSON.parse(row.resource as string);\n if (resource && Object.keys(resource).length > 0) {\n span.resource = resource;\n }\n }\n if (row.instrumentation_scope && row.instrumentation_scope !== \"null\") {\n const scope = JSON.parse(row.instrumentation_scope as string);\n if (scope) {\n span.instrumentationScope = scope;\n }\n }\n\n return span;\n }\n\n /**\n * Get statistics about stored spans\n */\n async getStats(): Promise<{\n spanCount: number;\n traceCount: number;\n oldestSpan?: Date;\n newestSpan?: Date;\n }> {\n await this.ensureInitialized();\n\n try {\n const [spanCountResult, traceCountResult, timeRangeResult] = await Promise.all([\n this.client.execute(`SELECT COUNT(*) as count FROM ${this.tablePrefix}_spans`),\n this.client.execute(`SELECT COUNT(*) as count FROM ${this.tablePrefix}_traces`),\n this.client.execute(`\n SELECT \n MIN(start_time) as oldest,\n MAX(start_time) as newest\n FROM ${this.tablePrefix}_spans\n `),\n ]);\n\n const stats: any = {\n spanCount: spanCountResult.rows[0].count as number,\n traceCount: traceCountResult.rows[0].count as number,\n };\n\n if (timeRangeResult.rows[0].oldest) {\n stats.oldestSpan = new Date(timeRangeResult.rows[0].oldest as string);\n }\n if (timeRangeResult.rows[0].newest) {\n stats.newestSpan = new Date(timeRangeResult.rows[0].newest as string);\n }\n\n return stats;\n } catch (error) {\n this.logger.error(\"Failed to get stats\", { error });\n throw error;\n }\n }\n\n /**\n * Save a log record to the database\n */\n async saveLogRecord(logRecord: any): Promise<void> {\n await this.ensureInitialized();\n\n try {\n // Convert timestamp if it's an array (OpenTelemetry HrTime format)\n let timestamp: string;\n if (Array.isArray(logRecord.hrTime)) {\n const timeMs = logRecord.hrTime[0] * 1000 + logRecord.hrTime[1] / 1000000;\n timestamp = new Date(timeMs).toISOString();\n } else if (logRecord.timestamp) {\n timestamp =\n typeof logRecord.timestamp === \"string\"\n ? logRecord.timestamp\n : new Date(logRecord.timestamp).toISOString();\n } else {\n timestamp = new Date().toISOString();\n }\n\n // Extract trace context\n const spanContext = logRecord.spanContext || {};\n const traceId = spanContext.traceId || null;\n const spanId = spanContext.spanId || null;\n const traceFlags = spanContext.traceFlags ?? null;\n\n // Extract log data\n const severityNumber = logRecord.severityNumber ?? null;\n const severityText = logRecord.severityText || null;\n const body =\n typeof logRecord.body === \"string\" ? logRecord.body : safeStringify(logRecord.body);\n const attributes = logRecord.attributes ? safeStringify(logRecord.attributes) : null;\n const resource = logRecord.resource?.attributes\n ? safeStringify(logRecord.resource.attributes)\n : null;\n const instrumentationScope =\n logRecord.instrumentationLibrary || logRecord.instrumentationScope\n ? safeStringify(logRecord.instrumentationLibrary || logRecord.instrumentationScope)\n : null;\n\n await this.client.execute({\n sql: `\n INSERT INTO ${this.tablePrefix}_logs (\n timestamp, trace_id, span_id, trace_flags,\n severity_number, severity_text, body,\n attributes, resource, instrumentation_scope\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n timestamp,\n traceId,\n spanId,\n traceFlags,\n severityNumber,\n severityText,\n body,\n attributes,\n resource,\n instrumentationScope,\n ],\n });\n\n this.debugLog(\"Log record saved successfully\", {\n timestamp,\n traceId,\n spanId,\n severityNumber,\n });\n } catch (error) {\n this.logger.error(\"Failed to save log record\", { error, logRecord });\n throw error;\n }\n }\n\n /**\n * Get logs by trace ID\n */\n async getLogsByTraceId(traceId: string): Promise<ObservabilityLogRecord[]> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_logs\n WHERE trace_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args: [traceId, this.maxSpansPerQuery],\n });\n\n return result.rows.map((row) => this.rowToLogRecord(row));\n } catch (error) {\n this.logger.error(\"Failed to get logs by trace ID\", { error, traceId });\n throw error;\n }\n }\n\n /**\n * Get logs by span ID\n */\n async getLogsBySpanId(spanId: string): Promise<ObservabilityLogRecord[]> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_logs\n WHERE span_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args: [spanId, this.maxSpansPerQuery],\n });\n\n return result.rows.map((row) => this.rowToLogRecord(row));\n } catch (error) {\n this.logger.error(\"Failed to get logs by span ID\", { error, spanId });\n throw error;\n }\n }\n\n /**\n * Query logs with flexible filtering\n */\n async queryLogs(filter: LogFilter): Promise<ObservabilityLogRecord[]> {\n await this.ensureInitialized();\n\n try {\n const whereClauses: string[] = [];\n const args: any[] = [];\n\n if (filter.traceId) {\n whereClauses.push(\"trace_id = ?\");\n args.push(filter.traceId);\n }\n if (filter.spanId) {\n whereClauses.push(\"span_id = ?\");\n args.push(filter.spanId);\n }\n if (filter.severityNumber !== undefined) {\n whereClauses.push(\"severity_number >= ?\");\n args.push(filter.severityNumber);\n }\n if (filter.severityText) {\n whereClauses.push(\"severity_text = ?\");\n args.push(filter.severityText);\n }\n if (filter.instrumentationScope) {\n whereClauses.push(\"instrumentation_scope LIKE ?\");\n args.push(`%${filter.instrumentationScope}%`);\n }\n if (filter.startTimeMin !== undefined) {\n const minTime = new Date(filter.startTimeMin).toISOString();\n whereClauses.push(\"timestamp >= ?\");\n args.push(minTime);\n }\n if (filter.startTimeMax !== undefined) {\n const maxTime = new Date(filter.startTimeMax).toISOString();\n whereClauses.push(\"timestamp <= ?\");\n args.push(maxTime);\n }\n if (filter.bodyContains) {\n whereClauses.push(\"body LIKE ?\");\n args.push(`%${filter.bodyContains}%`);\n }\n\n const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\";\n\n const limit = filter.limit || this.maxSpansPerQuery;\n args.push(limit);\n\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_logs\n ${whereClause}\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args,\n });\n\n const logs = result.rows.map((row) => this.rowToLogRecord(row));\n\n // Filter by attributes if specified\n if (filter.attributeKey) {\n const key = filter.attributeKey;\n return logs.filter((log) => {\n if (!log.attributes) return false;\n if (filter.attributeValue !== undefined) {\n return log.attributes[key] === filter.attributeValue;\n }\n return key in log.attributes;\n });\n }\n\n return logs;\n } catch (error) {\n this.logger.error(\"Failed to query logs\", { error, filter });\n throw error;\n }\n }\n\n /**\n * Delete old logs\n */\n async deleteOldLogs(beforeTimestamp: number): Promise<number> {\n await this.ensureInitialized();\n\n try {\n const beforeDate = new Date(beforeTimestamp).toISOString();\n\n const result = await this.client.execute({\n sql: `\n DELETE FROM ${this.tablePrefix}_logs\n WHERE timestamp < ?\n `,\n args: [beforeDate],\n });\n\n const deletedCount = result.rowsAffected || 0;\n this.debugLog(\"Old logs deleted\", { deletedCount, beforeDate });\n return deletedCount;\n } catch (error) {\n this.logger.error(\"Failed to delete old logs\", { error, beforeTimestamp });\n throw error;\n }\n }\n\n /**\n * Convert a database row to an ObservabilityLogRecord\n */\n private rowToLogRecord(row: any): ObservabilityLogRecord {\n const log: ObservabilityLogRecord = {\n timestamp: row.timestamp as string,\n body: (() => {\n try {\n // Only parse if it looks like JSON and can actually be parsed\n const bodyStr = row.body as string;\n if (bodyStr.startsWith(\"{\") || bodyStr.startsWith(\"[\")) {\n return JSON.parse(bodyStr);\n }\n } catch {\n // If parsing fails, treat as string\n }\n return row.body as string;\n })(),\n };\n\n // Add optional fields only if they have values (not null)\n if (row.trace_id !== null) {\n log.traceId = row.trace_id as string;\n }\n if (row.span_id !== null) {\n log.spanId = row.span_id as string;\n }\n if (row.trace_flags !== null) {\n log.traceFlags = row.trace_flags as number;\n }\n if (row.severity_number !== null) {\n log.severityNumber = row.severity_number as number;\n }\n if (row.severity_text !== null) {\n log.severityText = row.severity_text as string;\n }\n if (row.attributes && row.attributes !== \"null\") {\n try {\n const attributes = JSON.parse(row.attributes as string);\n if (attributes && Object.keys(attributes).length > 0) {\n log.attributes = attributes;\n }\n } catch {\n // Skip if parsing fails\n }\n }\n if (row.resource && row.resource !== \"null\") {\n try {\n const resource = JSON.parse(row.resource as string);\n if (resource && Object.keys(resource).length > 0) {\n log.resource = resource;\n }\n } catch {\n // Skip if parsing fails\n }\n }\n if (row.instrumentation_scope && row.instrumentation_scope !== \"null\") {\n try {\n const scope = JSON.parse(row.instrumentation_scope as string);\n if (scope) {\n log.instrumentationScope = scope;\n }\n } catch {\n // Skip if parsing fails\n }\n }\n\n return log;\n }\n\n getInfo() {\n return {\n adapter: this.constructor.name,\n displayName: \"LibSQL Observability Storage\",\n persistent: true,\n description: \"Persists spans and logs to a LibSQL/Turso database for long-term retention.\",\n };\n }\n\n /**\n * Close the database connection\n */\n async close(): Promise<void> {\n // LibSQL client doesn't have an explicit close method\n this.debugLog(\"LibSQL observability adapter closed\");\n }\n}\n","/**\n * LibSQL Vector Adapter\n * Provides vector storage and similarity search using LibSQL/Turso database\n * Stores vectors as binary BLOBs for efficiency\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { type Client, createClient } from \"@libsql/client\";\nimport {\n type SearchResult,\n type VectorAdapter,\n type VectorItem,\n type VectorSearchOptions,\n cosineSimilarity,\n} from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal\";\nimport { type Logger, createPinoLogger } from \"@voltagent/logger\";\n\n/**\n * LibSQL Vector Adapter configuration options\n */\nexport interface LibSQLVectorOptions {\n /**\n * Database URL (e.g., 'file:./memory.db' or 'libsql://...')\n * @default \"file:./.voltagent/memory.db\"\n */\n url?: string;\n\n /**\n * Auth token for remote connections (optional)\n */\n authToken?: string;\n\n /**\n * Prefix for table names\n * @default \"voltagent\"\n */\n tablePrefix?: string;\n\n /**\n * Maximum vector dimensions allowed\n * @default 1536\n */\n maxVectorDimensions?: number;\n\n /**\n * Size of the LRU cache for frequently accessed vectors\n * @default 100\n */\n cacheSize?: number;\n\n /**\n * Batch size for bulk operations\n * @default 100\n */\n batchSize?: number;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Logger instance\n */\n logger?: Logger;\n\n /**\n * Maximum number of retries for database operations\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Initial retry delay in milliseconds\n * @default 100\n */\n retryDelayMs?: number;\n}\n\n/**\n * LibSQL Vector Adapter\n * Production-ready vector storage with similarity search\n */\nexport class LibSQLVectorAdapter implements VectorAdapter {\n private client: Client;\n private tablePrefix: string;\n private maxVectorDimensions: number;\n private cacheSize: number;\n private batchSize: number;\n private debug: boolean;\n private logger: Logger;\n private maxRetries: number;\n private retryDelayMs: number;\n private url: string;\n private initialized = false;\n private vectorCache: Map<string, VectorItem>;\n private dimensions: number | null = null;\n\n constructor(options: LibSQLVectorOptions = {}) {\n this.tablePrefix = options.tablePrefix ?? \"voltagent\";\n this.maxVectorDimensions = options.maxVectorDimensions ?? 1536;\n this.cacheSize = options.cacheSize ?? 100;\n this.batchSize = options.batchSize ?? 100;\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelayMs = options.retryDelayMs ?? 100;\n this.debug = options.debug ?? false;\n\n // Initialize logger\n this.logger =\n options.logger ??\n createPinoLogger({\n name: \"libsql-vector-adapter\",\n level: this.debug ? \"debug\" : \"info\",\n });\n\n // Normalize database URL\n const requestedUrl = options.url ?? \"file:./.voltagent/memory.db\";\n // In-memory: use cache=shared which is supported by @libsql/core for :memory:\n // Accept both \":memory:\" and \"file::memory:\" inputs and normalize to URI form.\n if (\n requestedUrl === \":memory:\" ||\n requestedUrl === \"file::memory:\" ||\n requestedUrl.startsWith(\"file::memory:\")\n ) {\n // Use private, per-connection in-memory database (no shared cache)\n // Accept either form and normalize to \":memory:\" which @libsql/core expands to file::memory:\n this.url = \":memory:\";\n } else {\n this.url = requestedUrl;\n }\n\n // Ensure directory exists for file-based databases (skip pure in-memory)\n if (this.url.startsWith(\"file:\") && !this.url.startsWith(\"file::memory:\")) {\n const dbPath = this.url.replace(\"file:\", \"\");\n const dbDir = path.dirname(dbPath);\n if (!fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n }\n }\n\n // Initialize LibSQL client\n this.client = createClient({\n url: this.url,\n authToken: options.authToken,\n });\n\n // Initialize cache\n this.vectorCache = new Map();\n }\n\n /**\n * Initialize the database schema\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n try {\n // Create vectors table and indexes atomically\n await this.client.executeMultiple(`\n BEGIN;\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n vector BLOB NOT NULL,\n dimensions INTEGER NOT NULL,\n metadata TEXT,\n content TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n );\n CREATE INDEX IF NOT EXISTS idx_${tableName}_created ON ${tableName}(created_at);\n CREATE INDEX IF NOT EXISTS idx_${tableName}_dimensions ON ${tableName}(dimensions);\n COMMIT;\n `);\n\n this.initialized = true;\n this.logger.debug(\"Vector adapter initialized\");\n } catch (error) {\n this.logger.error(\"Failed to initialize vector adapter\", error as Error);\n throw error;\n }\n }\n\n /**\n * Serialize a vector to binary format\n */\n private serializeVector(vector: number[]): Buffer {\n const buffer = Buffer.allocUnsafe(vector.length * 4);\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4);\n }\n return buffer;\n }\n\n /**\n * Deserialize a vector from binary format\n */\n private deserializeVector(buffer: Buffer | Uint8Array | ArrayBuffer): number[] {\n let bytes: Buffer;\n if (buffer instanceof Buffer) {\n bytes = buffer;\n } else if (buffer instanceof ArrayBuffer) {\n bytes = Buffer.from(buffer);\n } else {\n bytes = Buffer.from(buffer);\n }\n const vector: number[] = [];\n for (let i = 0; i < bytes.length; i += 4) {\n vector.push(bytes.readFloatLE(i));\n }\n return vector;\n }\n\n /**\n * Execute a database operation with retries\n */\n private async executeWithRetry<T>(operation: () => Promise<T>, context: string): Promise<T> {\n let lastError: Error | undefined;\n let delay = this.retryDelayMs;\n\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n this.logger.warn(`Operation failed (attempt ${attempt}): ${context}`, error as Error);\n\n if (attempt < this.maxRetries) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= 2; // Exponential backoff\n }\n }\n }\n\n this.logger.error(`Operation failed after ${this.maxRetries} attempts: ${context}`, lastError);\n throw lastError;\n }\n\n /**\n * Store a vector with associated metadata\n */\n async store(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void> {\n await this.initialize();\n\n // Validate vector contents\n if (!Array.isArray(vector) || vector.length === 0) {\n throw new Error(\"Vector must be a non-empty array\");\n }\n\n // Validate dimensions\n if (vector.length > this.maxVectorDimensions) {\n throw new Error(\n `Vector dimensions (${vector.length}) exceed maximum (${this.maxVectorDimensions})`,\n );\n }\n\n if (this.dimensions === null) {\n this.dimensions = vector.length;\n } else if (vector.length !== this.dimensions) {\n throw new Error(\n `Vector dimension mismatch. Expected ${this.dimensions}, got ${vector.length}`,\n );\n }\n\n const tableName = `${this.tablePrefix}_vectors`;\n const serializedVector = this.serializeVector(vector);\n const metadataJson = metadata ? safeStringify(metadata) : null;\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `\n INSERT OR REPLACE INTO ${tableName} \n (id, vector, dimensions, metadata, updated_at)\n VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)\n `,\n args: [id, serializedVector, vector.length, metadataJson],\n });\n }, `store vector ${id}`);\n\n // Update cache\n if (this.vectorCache.size >= this.cacheSize) {\n const firstKey = this.vectorCache.keys().next().value;\n if (firstKey) this.vectorCache.delete(firstKey);\n }\n this.vectorCache.set(id, { id, vector, metadata });\n\n this.logger.debug(`Vector stored: ${id} (${vector.length} dimensions)`);\n }\n\n /**\n * Store multiple vectors in batch\n */\n async storeBatch(items: VectorItem[]): Promise<void> {\n await this.initialize();\n\n if (items.length === 0) return;\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n // Process in batches to avoid memory issues\n for (let i = 0; i < items.length; i += this.batchSize) {\n const batch = items.slice(i, i + this.batchSize);\n\n await this.executeWithRetry(async () => {\n const stmts: { sql: string; args: any[] }[] = [];\n for (const item of batch) {\n if (!Array.isArray(item.vector) || item.vector.length === 0) {\n throw new Error(\"Vector must be a non-empty array\");\n }\n // Validate dimensions\n if (this.dimensions === null) {\n this.dimensions = item.vector.length;\n } else if (item.vector.length !== this.dimensions) {\n throw new Error(\n `Vector dimension mismatch. Expected ${this.dimensions}, got ${item.vector.length}`,\n );\n }\n\n const serializedVector = this.serializeVector(item.vector);\n const metadataJson = item.metadata ? safeStringify(item.metadata) : null;\n const content = item.content ?? null;\n stmts.push({\n sql: `INSERT OR REPLACE INTO ${tableName} (id, vector, dimensions, metadata, content, updated_at) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n args: [item.id, serializedVector, item.vector.length, metadataJson, content],\n });\n }\n await this.client.batch(stmts, \"write\");\n }, `storeBatch ${batch.length} vectors`);\n\n this.logger.debug(`Batch of ${batch.length} vectors stored`);\n }\n }\n\n /**\n * Search for similar vectors using cosine similarity\n */\n async search(queryVector: number[], options?: VectorSearchOptions): Promise<SearchResult[]> {\n await this.initialize();\n\n const { limit = 10, threshold = 0, filter } = options || {};\n\n // Validate query vector dimensions\n if (this.dimensions !== null && queryVector.length !== this.dimensions) {\n throw new Error(\n `Query vector dimension mismatch. Expected ${this.dimensions}, got ${queryVector.length}`,\n );\n }\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n // Build query with optional dimension filter\n let query = `SELECT id, vector, dimensions, metadata, content FROM ${tableName}`;\n const args: any[] = [];\n\n if (this.dimensions !== null) {\n query += \" WHERE dimensions = ?\";\n args.push(this.dimensions);\n }\n\n const result = await this.executeWithRetry(\n async () => await this.client.execute({ sql: query, args }),\n \"search vectors\",\n );\n\n const searchResults: SearchResult[] = [];\n\n // Calculate similarities for all vectors\n for (const row of result.rows) {\n const id = row.id as string;\n const vectorBlob = row.vector as Uint8Array | ArrayBuffer;\n const metadataJson = row.metadata as string | null;\n const content = (row.content as string | null) ?? undefined;\n\n // Parse metadata\n const metadata = metadataJson ? JSON.parse(metadataJson) : undefined;\n\n // Apply metadata filter if provided\n if (filter && !this.matchesFilter(metadata, filter)) {\n continue;\n }\n\n // Deserialize vector\n const vector = this.deserializeVector(vectorBlob);\n\n // Calculate cosine similarity\n const similarity = cosineSimilarity(queryVector, vector);\n\n // Convert similarity to score (0-1 range where 1 is most similar)\n const score = (similarity + 1) / 2;\n\n if (score >= threshold) {\n searchResults.push({\n id,\n vector,\n metadata,\n content,\n score,\n distance: 1 - similarity, // Convert to distance metric\n });\n }\n }\n\n // Sort by score (descending) and limit results\n searchResults.sort((a, b) => b.score - a.score);\n\n return searchResults.slice(0, limit);\n }\n\n /**\n * Check if metadata matches the filter criteria\n */\n private matchesFilter(\n metadata: Record<string, unknown> | undefined,\n filter: Record<string, unknown>,\n ): boolean {\n if (!metadata) {\n return false;\n }\n\n for (const [key, value] of Object.entries(filter)) {\n if (metadata[key] !== value) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Delete a vector by ID\n */\n async delete(id: string): Promise<void> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `DELETE FROM ${tableName} WHERE id = ?`,\n args: [id],\n });\n }, `delete vector ${id}`);\n\n // Remove from cache\n this.vectorCache.delete(id);\n\n this.logger.debug(`Vector deleted: ${id}`);\n }\n\n /**\n * Delete multiple vectors by IDs\n */\n async deleteBatch(ids: string[]): Promise<void> {\n await this.initialize();\n\n if (ids.length === 0) return;\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n // Process in batches\n for (let i = 0; i < ids.length; i += this.batchSize) {\n const batch = ids.slice(i, i + this.batchSize);\n const placeholders = batch.map(() => \"?\").join(\",\");\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `DELETE FROM ${tableName} WHERE id IN (${placeholders})`,\n args: batch,\n });\n }, `deleteBatch ${batch.length} vectors`);\n\n // Remove from cache\n for (const id of batch) {\n this.vectorCache.delete(id);\n }\n\n this.logger.debug(`Batch of ${batch.length} vectors deleted`);\n }\n }\n\n /**\n * Clear all vectors\n */\n async clear(): Promise<void> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n await this.executeWithRetry(async () => {\n await this.client.execute(`DELETE FROM ${tableName}`);\n }, \"clear all vectors\");\n\n // Clear cache and reset dimensions\n this.vectorCache.clear();\n this.dimensions = null;\n\n this.logger.debug(\"All vectors cleared\");\n }\n\n /**\n * Get total count of stored vectors\n */\n async count(): Promise<number> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n const result = await this.executeWithRetry(\n async () => await this.client.execute(`SELECT COUNT(*) as count FROM ${tableName}`),\n \"count vectors\",\n );\n\n const raw = result.rows[0]?.count as any;\n // libsql/sqlite may return number, string, or bigint depending on driver\n if (typeof raw === \"bigint\") return Number(raw);\n if (typeof raw === \"string\") return Number.parseInt(raw, 10) || 0;\n return (raw as number) ?? 0;\n }\n\n /**\n * Get a specific vector by ID\n */\n async get(id: string): Promise<VectorItem | null> {\n await this.initialize();\n\n // Check cache first\n if (this.vectorCache.has(id)) {\n const cached = this.vectorCache.get(id);\n if (cached) {\n return {\n ...cached,\n vector: [...cached.vector], // Return a copy\n metadata: cached.metadata ? { ...cached.metadata } : undefined,\n };\n }\n }\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n const result = await this.executeWithRetry(\n async () =>\n await this.client.execute({\n sql: `SELECT id, vector, metadata, content FROM ${tableName} WHERE id = ?`,\n args: [id],\n }),\n `get vector ${id}`,\n );\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n const vectorBlob = row.vector as unknown as Uint8Array | ArrayBuffer;\n const metadataJson = row.metadata as string | null;\n const content = row.content as string | null;\n\n const vector = this.deserializeVector(vectorBlob);\n const metadata = metadataJson ? JSON.parse(metadataJson) : undefined;\n\n const item: VectorItem = {\n id,\n vector,\n metadata,\n content: content ?? undefined,\n };\n\n // Update cache\n if (this.vectorCache.size >= this.cacheSize) {\n const firstKey = this.vectorCache.keys().next().value;\n if (firstKey) this.vectorCache.delete(firstKey);\n }\n this.vectorCache.set(id, item);\n\n return item;\n }\n\n /**\n * Close the database connection\n */\n async close(): Promise<void> {\n this.vectorCache.clear();\n this.logger.debug(\"Vector adapter closed\");\n try {\n (this.client as any)?.close?.();\n } catch {\n // ignore\n }\n }\n\n /**\n * Get statistics about the vector table and cache\n */\n async getStats(): Promise<{\n count: number;\n dimensions: number | null;\n cacheSize: number;\n tableSizeBytes: number;\n }> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n const [countResult, sizeResult] = await Promise.all([\n this.executeWithRetry(\n async () =>\n await this.client.execute(\n `SELECT COUNT(*) as count, MAX(dimensions) as dims FROM ${tableName}`,\n ),\n \"getStats count\",\n ),\n // Approximate table size by summing blob/text lengths\n this.executeWithRetry(\n async () =>\n await this.client.execute({\n sql: `SELECT \n COALESCE(SUM(LENGTH(id)),0) + \n COALESCE(SUM(LENGTH(vector)),0) + \n COALESCE(SUM(LENGTH(metadata)),0) +\n COALESCE(SUM(LENGTH(content)),0) AS size\n FROM ${tableName}`,\n }),\n \"getStats size\",\n ),\n ]);\n\n const row1 = countResult.rows[0] as any;\n const row2 = sizeResult.rows[0] as any;\n\n const countRaw = row1?.count as any;\n const dimsRaw = row1?.dims as any;\n const sizeRaw = row2?.size as any;\n\n const normalize = (v: any): number =>\n typeof v === \"bigint\"\n ? Number(v)\n : typeof v === \"string\"\n ? Number.parseInt(v, 10) || 0\n : (v ?? 0);\n\n return {\n count: normalize(countRaw),\n dimensions: dimsRaw != null ? normalize(dimsRaw) : this.dimensions,\n cacheSize: this.vectorCache.size,\n tableSizeBytes: normalize(sizeRaw),\n };\n }\n}\n"],"mappings":"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","names":["createClient","safeStringify","createPinoLogger","createPinoLogger","createClient","safeStringify","fs","path","createClient","safeStringify","createPinoLogger","createPinoLogger","path","fs","createClient","safeStringify"]}
|
|
1
|
+
{"version":3,"sources":["../src/memory-v2-adapter.ts","../src/memory-core.ts","../src/observability-adapter.ts","../src/observability-core.ts","../src/vector-adapter.ts","../src/vector-core.ts"],"sourcesContent":["/**\n * LibSQL Storage Adapter for Memory - Node.js\n * Stores conversations and messages in SQLite/Turso database\n * Supports both local file databases and remote Turso connections\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createClient } from \"@libsql/client\";\nimport { AgentRegistry } from \"@voltagent/core\";\nimport { createPinoLogger } from \"@voltagent/logger\";\nimport type { Logger } from \"@voltagent/logger\";\nimport { LibSQLMemoryCore, type LibSQLMemoryCoreOptions } from \"./memory-core\";\n\n/**\n * LibSQL configuration options for Memory\n */\nexport interface LibSQLMemoryOptions extends LibSQLMemoryCoreOptions {\n /**\n * Database URL (e.g., 'file:./conversations.db' or 'libsql://...')\n * @default \"file:./.voltagent/memory.db\"\n */\n url?: string;\n\n /**\n * Auth token for remote connections (optional)\n */\n authToken?: string;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Logger instance\n */\n logger?: Logger;\n}\n\n/**\n * LibSQL Storage Adapter for Memory - Node.js\n * Production-ready storage for conversations and messages\n * Supports both local SQLite files and remote Turso databases\n */\nexport class LibSQLMemoryAdapter extends LibSQLMemoryCore {\n constructor(options: LibSQLMemoryOptions = {}) {\n const url = options.url ?? \"file:./.voltagent/memory.db\";\n\n // Initialize logger - use provided logger, global logger, or create new one\n const logger =\n options.logger ||\n AgentRegistry.getInstance().getGlobalLogger() ||\n createPinoLogger({ name: \"libsql-memory\" });\n\n // Create directory for file-based databases\n if (url.startsWith(\"file:\")) {\n const dbPath = url.replace(\"file:\", \"\");\n const dbDir = path.dirname(dbPath);\n if (dbDir && dbDir !== \".\" && !fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n logger.debug(`Created database directory: ${dbDir}`);\n }\n }\n\n // Create LibSQL client\n const client = createClient({\n url: url,\n authToken: options.authToken,\n });\n\n super(client, url, options, logger);\n }\n}\n","/**\n * LibSQL Memory Adapter Core\n * Contains shared logic for both Node.js and Edge environments\n * Environment-specific adapters extend this class\n */\n\nimport type { Client } from \"@libsql/client\";\nimport { ConversationAlreadyExistsError, ConversationNotFoundError } from \"@voltagent/core\";\nimport type {\n Conversation,\n ConversationQueryOptions,\n ConversationStepRecord,\n CreateConversationInput,\n GetConversationStepsOptions,\n GetMessagesOptions,\n StorageAdapter,\n WorkflowStateEntry,\n WorkingMemoryScope,\n} from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal\";\nimport type { Logger } from \"@voltagent/logger\";\nimport type { UIMessage } from \"ai\";\n\n/**\n * Core configuration options for LibSQL Memory adapter\n */\nexport interface LibSQLMemoryCoreOptions {\n /**\n * Prefix for table names\n * @default \"voltagent_memory\"\n */\n tablePrefix?: string;\n\n /**\n * Maximum number of retries for database operations\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Initial retry delay in milliseconds\n * @default 100\n */\n retryDelayMs?: number;\n}\n\n/**\n * LibSQL Memory Adapter Core\n * Implements all storage operations, receives client via dependency injection\n */\nexport class LibSQLMemoryCore implements StorageAdapter {\n protected client: Client;\n protected tablePrefix: string;\n protected initialized = false;\n protected logger: Logger;\n protected maxRetries: number;\n protected retryDelayMs: number;\n protected url: string;\n\n constructor(client: Client, url: string, options: LibSQLMemoryCoreOptions, logger: Logger) {\n this.client = client;\n this.url = url;\n this.tablePrefix = options.tablePrefix ?? \"voltagent_memory\";\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelayMs = options.retryDelayMs ?? 100;\n this.logger = logger;\n\n this.logger.debug(\"LibSQL Memory adapter core initialized\", { url: this.url });\n }\n\n /**\n * Execute a database operation with retry logic\n */\n protected async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error: any) {\n lastError = error;\n\n if (\n error?.code === \"SQLITE_BUSY\" ||\n error?.message?.includes(\"SQLITE_BUSY\") ||\n error?.message?.includes(\"database is locked\")\n ) {\n const delay = this.retryDelayMs * 2 ** attempt;\n this.logger.debug(\n `Database busy, retrying ${operationName} (attempt ${attempt + 1}/${this.maxRetries}) after ${delay}ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n throw error;\n }\n }\n }\n\n this.logger.error(\n `Failed to execute ${operationName} after ${this.maxRetries} attempts`,\n lastError,\n );\n throw lastError;\n }\n\n /**\n * Initialize database schema\n */\n protected async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n const messagesTable = `${this.tablePrefix}_messages`;\n const usersTable = `${this.tablePrefix}_users`;\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const stepsTable = `${this.tablePrefix}_steps`;\n\n const isMemoryDb = this.url === \":memory:\" || this.url.includes(\"mode=memory\");\n\n if (!isMemoryDb && (this.url.startsWith(\"file:\") || this.url.startsWith(\"libsql:\"))) {\n try {\n await this.client.execute(\"PRAGMA journal_mode=WAL\");\n this.logger.debug(\"Set PRAGMA journal_mode=WAL\");\n } catch (err) {\n this.logger.debug(\"Failed to set PRAGMA journal_mode=WAL (non-critical)\", { err });\n }\n }\n\n try {\n await this.client.execute(\"PRAGMA busy_timeout=5000\");\n this.logger.debug(\"Set PRAGMA busy_timeout=5000\");\n } catch (err) {\n this.logger.debug(\"Failed to set PRAGMA busy_timeout (non-critical)\", { err });\n }\n\n try {\n await this.client.execute(\"PRAGMA foreign_keys=ON\");\n this.logger.debug(\"Set PRAGMA foreign_keys=ON\");\n } catch (err) {\n this.logger.debug(\"Failed to set PRAGMA foreign_keys (non-critical)\", { err });\n }\n\n this.logger.debug(\"Applied PRAGMA settings for better concurrency\");\n\n await this.executeWithRetry(async () => {\n await this.client.batch([\n `CREATE TABLE IF NOT EXISTS ${usersTable} (\n id TEXT PRIMARY KEY,\n metadata TEXT,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP\n )`,\n\n `CREATE TABLE IF NOT EXISTS ${conversationsTable} (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n title TEXT NOT NULL,\n metadata TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n\n `CREATE TABLE IF NOT EXISTS ${messagesTable} (\n conversation_id TEXT NOT NULL,\n message_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n role TEXT NOT NULL,\n parts TEXT NOT NULL,\n metadata TEXT,\n format_version INTEGER DEFAULT 2,\n created_at TEXT NOT NULL,\n PRIMARY KEY (conversation_id, message_id)\n )`,\n\n `CREATE TABLE IF NOT EXISTS ${workflowStatesTable} (\n id TEXT PRIMARY KEY,\n workflow_id TEXT NOT NULL,\n workflow_name TEXT NOT NULL,\n status TEXT NOT NULL,\n suspension TEXT,\n events TEXT,\n output TEXT,\n cancellation TEXT,\n user_id TEXT,\n conversation_id TEXT,\n metadata TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )`,\n\n `CREATE TABLE IF NOT EXISTS ${stepsTable} (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n agent_name TEXT,\n operation_id TEXT,\n step_index INTEGER NOT NULL,\n type TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT,\n arguments TEXT,\n result TEXT,\n usage TEXT,\n sub_agent_id TEXT,\n sub_agent_name TEXT,\n created_at TEXT NOT NULL,\n FOREIGN KEY (conversation_id) REFERENCES ${conversationsTable}(id) ON DELETE CASCADE\n )`,\n\n `CREATE INDEX IF NOT EXISTS idx_${conversationsTable}_user_id ON ${conversationsTable}(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${conversationsTable}_resource_id ON ${conversationsTable}(resource_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${messagesTable}_conversation_id ON ${messagesTable}(conversation_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${messagesTable}_created_at ON ${messagesTable}(created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_${workflowStatesTable}_workflow_id ON ${workflowStatesTable}(workflow_id)`,\n `CREATE INDEX IF NOT EXISTS idx_${workflowStatesTable}_status ON ${workflowStatesTable}(status)`,\n `CREATE INDEX IF NOT EXISTS idx_${stepsTable}_conversation ON ${stepsTable}(conversation_id, step_index)`,\n `CREATE INDEX IF NOT EXISTS idx_${stepsTable}_operation ON ${stepsTable}(conversation_id, operation_id)`,\n ]);\n }, \"initialize database schema\");\n\n await this.addV2ColumnsToMessagesTable();\n await this.migrateDefaultUserIds();\n await this.addWorkflowStateColumns();\n\n this.initialized = true;\n this.logger.debug(\"Database schema initialized\");\n }\n\n private async addV2ColumnsToMessagesTable(): Promise<void> {\n const messagesTableName = `${this.tablePrefix}_messages`;\n\n try {\n const tableInfo = await this.client.execute(`PRAGMA table_info(${messagesTableName})`);\n const columns = tableInfo.rows.map((row) => row.name as string);\n\n if (!columns.includes(\"parts\")) {\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} ADD COLUMN parts TEXT`);\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"metadata\")) {\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} ADD COLUMN metadata TEXT`);\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"format_version\")) {\n try {\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} ADD COLUMN format_version INTEGER DEFAULT 2`,\n );\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"user_id\")) {\n try {\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} ADD COLUMN user_id TEXT NOT NULL DEFAULT 'default'`,\n );\n } catch (_e) {\n // Column might already exist\n }\n }\n\n const contentInfo = tableInfo.rows.find((row) => row.name === \"content\");\n if (contentInfo && contentInfo.notnull === 1) {\n try {\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} ADD COLUMN content_temp TEXT`,\n );\n await this.client.execute(\n `UPDATE ${messagesTableName} SET content_temp = content WHERE content IS NOT NULL`,\n );\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} DROP COLUMN content`);\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} RENAME COLUMN content_temp TO content`,\n );\n } catch (_) {\n // If DROP not supported, keep both columns\n }\n } catch (_) {\n // Content migration error - not critical\n }\n }\n\n const typeInfo = tableInfo.rows.find((row) => row.name === \"type\");\n if (typeInfo && typeInfo.notnull === 1) {\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} ADD COLUMN type_temp TEXT`);\n await this.client.execute(\n `UPDATE ${messagesTableName} SET type_temp = type WHERE type IS NOT NULL`,\n );\n try {\n await this.client.execute(`ALTER TABLE ${messagesTableName} DROP COLUMN type`);\n await this.client.execute(\n `ALTER TABLE ${messagesTableName} RENAME COLUMN type_temp TO type`,\n );\n } catch (_) {\n // If DROP not supported, keep both columns\n }\n } catch (_) {\n // Type migration error - not critical\n }\n }\n } catch (_) {\n // Don't throw - this is not critical for new installations\n }\n }\n\n private async migrateDefaultUserIds(): Promise<void> {\n const messagesTableName = `${this.tablePrefix}_messages`;\n const conversationsTableName = `${this.tablePrefix}_conversations`;\n\n try {\n const checkResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${messagesTableName} WHERE user_id = 'default'`,\n args: [],\n });\n\n const defaultCount = (checkResult.rows[0]?.count as number) || 0;\n\n if (defaultCount === 0) {\n return;\n }\n\n this.logger.debug(`Found ${defaultCount} messages with default user_id, starting migration`);\n\n await this.executeWithRetry(async () => {\n const result = await this.client.execute({\n sql: `UPDATE ${messagesTableName}\n SET user_id = (\n SELECT c.user_id\n FROM ${conversationsTableName} c\n WHERE c.id = ${messagesTableName}.conversation_id\n )\n WHERE user_id = 'default'\n AND EXISTS (\n SELECT 1\n FROM ${conversationsTableName} c\n WHERE c.id = ${messagesTableName}.conversation_id\n )`,\n args: [],\n });\n\n const updatedCount = result.rowsAffected || 0;\n this.logger.info(\n `Successfully migrated ${updatedCount} messages from default user_id to actual user_ids`,\n );\n\n const remainingResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${messagesTableName} WHERE user_id = 'default'`,\n args: [],\n });\n\n const remainingCount = (remainingResult.rows[0]?.count as number) || 0;\n\n if (remainingCount > 0) {\n this.logger.warn(\n `${remainingCount} messages still have default user_id (possibly orphaned messages without valid conversations)`,\n );\n }\n }, \"migrate default user_ids\");\n } catch (error) {\n this.logger.error(\"Failed to migrate default user_ids\", error as Error);\n }\n }\n\n private async addWorkflowStateColumns(): Promise<void> {\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n\n try {\n const tableInfo = await this.client.execute(`PRAGMA table_info(${workflowStatesTable})`);\n const columns = tableInfo.rows.map((row) => row.name as string);\n\n if (!columns.includes(\"events\")) {\n try {\n await this.client.execute(`ALTER TABLE ${workflowStatesTable} ADD COLUMN events TEXT`);\n this.logger.debug(\"Added 'events' column to workflow_states table\");\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"output\")) {\n try {\n await this.client.execute(`ALTER TABLE ${workflowStatesTable} ADD COLUMN output TEXT`);\n this.logger.debug(\"Added 'output' column to workflow_states table\");\n } catch (_e) {\n // Column might already exist\n }\n }\n\n if (!columns.includes(\"cancellation\")) {\n try {\n await this.client.execute(\n `ALTER TABLE ${workflowStatesTable} ADD COLUMN cancellation TEXT`,\n );\n this.logger.debug(\"Added 'cancellation' column to workflow_states table\");\n } catch (_e) {\n // Column might already exist\n }\n }\n } catch (error) {\n this.logger.warn(\"Failed to add workflow state columns (non-critical)\", error as Error);\n }\n }\n\n // ============================================================================\n // Message Operations\n // ============================================================================\n\n async addMessage(message: UIMessage, userId: string, conversationId: string): Promise<void> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(conversationId);\n }\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `INSERT INTO ${messagesTable} (conversation_id, message_id, user_id, role, parts, metadata, format_version, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n conversationId,\n message.id,\n userId,\n message.role,\n safeStringify(message.parts),\n message.metadata ? safeStringify(message.metadata) : null,\n 2,\n new Date().toISOString(),\n ],\n });\n }, \"add message\");\n }\n\n async addMessages(messages: UIMessage[], userId: string, conversationId: string): Promise<void> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n\n const conversation = await this.getConversation(conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(conversationId);\n }\n\n const now = new Date().toISOString();\n\n await this.executeWithRetry(async () => {\n await this.client.batch(\n messages.map((message) => ({\n sql: `INSERT INTO ${messagesTable} (conversation_id, message_id, user_id, role, parts, metadata, format_version, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n conversationId,\n message.id,\n userId,\n message.role,\n safeStringify(message.parts),\n message.metadata ? safeStringify(message.metadata) : null,\n 2,\n now,\n ],\n })),\n );\n }, \"add batch messages\");\n }\n\n async saveConversationSteps(steps: ConversationStepRecord[]): Promise<void> {\n if (steps.length === 0) return;\n\n await this.initialize();\n const stepsTable = `${this.tablePrefix}_steps`;\n\n await this.executeWithRetry(async () => {\n await this.client.batch(\n steps.map((step) => {\n const createdAt = step.createdAt ?? new Date().toISOString();\n return {\n sql: `INSERT INTO ${stepsTable} (\n id,\n conversation_id,\n user_id,\n agent_id,\n agent_name,\n operation_id,\n step_index,\n type,\n role,\n content,\n arguments,\n result,\n usage,\n sub_agent_id,\n sub_agent_name,\n created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n conversation_id = excluded.conversation_id,\n user_id = excluded.user_id,\n agent_id = excluded.agent_id,\n agent_name = excluded.agent_name,\n operation_id = excluded.operation_id,\n step_index = excluded.step_index,\n type = excluded.type,\n role = excluded.role,\n content = excluded.content,\n arguments = excluded.arguments,\n result = excluded.result,\n usage = excluded.usage,\n sub_agent_id = excluded.sub_agent_id,\n sub_agent_name = excluded.sub_agent_name,\n created_at = excluded.created_at`,\n args: [\n step.id,\n step.conversationId,\n step.userId,\n step.agentId,\n step.agentName ?? null,\n step.operationId ?? null,\n step.stepIndex,\n step.type,\n step.role,\n step.content ?? null,\n step.arguments ? safeStringify(step.arguments) : null,\n step.result ? safeStringify(step.result) : null,\n step.usage ? safeStringify(step.usage) : null,\n step.subAgentId ?? null,\n step.subAgentName ?? null,\n createdAt,\n ],\n };\n }),\n );\n }, \"save conversation steps\");\n }\n\n async getMessages(\n userId: string,\n conversationId: string,\n options?: GetMessagesOptions,\n ): Promise<UIMessage<{ createdAt: Date }>[]> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n const { limit, before, after, roles } = options || {};\n\n let sql = `SELECT * FROM ${messagesTable}\n WHERE conversation_id = ? AND user_id = ?`;\n const args: any[] = [conversationId, userId];\n\n if (roles && roles.length > 0) {\n const placeholders = roles.map(() => \"?\").join(\",\");\n sql += ` AND role IN (${placeholders})`;\n args.push(...roles);\n }\n\n if (before) {\n sql += \" AND created_at < ?\";\n args.push(before.toISOString());\n }\n\n if (after) {\n sql += \" AND created_at > ?\";\n args.push(after.toISOString());\n }\n\n sql += \" ORDER BY created_at ASC\";\n if (limit && limit > 0) {\n sql += \" LIMIT ?\";\n args.push(limit);\n }\n\n const result = await this.client.execute({ sql, args });\n\n return result.rows.map((row) => {\n let parts: any;\n\n if (row.parts !== undefined && row.parts !== null) {\n try {\n parts = JSON.parse(row.parts as string);\n } catch {\n parts = [];\n }\n } else if (row.content !== undefined && row.content !== null) {\n try {\n const content = JSON.parse(row.content as string);\n\n if (typeof content === \"string\") {\n parts = [{ type: \"text\", text: content }];\n } else if (Array.isArray(content)) {\n parts = content;\n } else {\n parts = [];\n }\n } catch {\n parts = [{ type: \"text\", text: row.content as string }];\n }\n } else {\n parts = [];\n }\n\n const metadata = row.metadata ? JSON.parse(row.metadata as string) : {};\n return {\n id: row.message_id as string,\n role: row.role as \"system\" | \"user\" | \"assistant\",\n parts,\n metadata: {\n ...metadata,\n createdAt: row.created_at ? new Date(row.created_at as string) : undefined,\n },\n };\n });\n }\n\n async getConversationSteps(\n userId: string,\n conversationId: string,\n options?: GetConversationStepsOptions,\n ): Promise<ConversationStepRecord[]> {\n await this.initialize();\n\n const stepsTable = `${this.tablePrefix}_steps`;\n const limit = options?.limit && options.limit > 0 ? options.limit : undefined;\n\n let sql = `SELECT * FROM ${stepsTable} WHERE conversation_id = ? AND user_id = ?`;\n const args: any[] = [conversationId, userId];\n\n if (options?.operationId) {\n sql += \" AND operation_id = ?\";\n args.push(options.operationId);\n }\n\n sql += \" ORDER BY step_index ASC\";\n if (limit !== undefined) {\n sql += \" LIMIT ?\";\n args.push(limit);\n }\n\n const result = await this.client.execute({ sql, args });\n\n const parseJsonField = (value: unknown) => {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n };\n\n return result.rows.map((row) => ({\n id: row.id as string,\n conversationId: row.conversation_id as string,\n userId: row.user_id as string,\n agentId: row.agent_id as string,\n agentName: (row.agent_name as string) ?? undefined,\n operationId: (row.operation_id as string) ?? undefined,\n stepIndex:\n typeof row.step_index === \"number\"\n ? (row.step_index as number)\n : Number(row.step_index ?? 0),\n type: row.type as ConversationStepRecord[\"type\"],\n role: row.role as ConversationStepRecord[\"role\"],\n content: (row.content as string) ?? undefined,\n arguments: parseJsonField(row.arguments),\n result: parseJsonField(row.result),\n usage: parseJsonField(row.usage),\n subAgentId: (row.sub_agent_id as string) ?? undefined,\n subAgentName: (row.sub_agent_name as string) ?? undefined,\n createdAt: (row.created_at as string) ?? new Date().toISOString(),\n }));\n }\n\n async clearMessages(userId: string, conversationId?: string): Promise<void> {\n await this.initialize();\n\n const messagesTable = `${this.tablePrefix}_messages`;\n const conversationsTable = `${this.tablePrefix}_conversations`;\n const stepsTable = `${this.tablePrefix}_steps`;\n\n if (conversationId) {\n await this.client.execute({\n sql: `DELETE FROM ${messagesTable} WHERE conversation_id = ? AND user_id = ?`,\n args: [conversationId, userId],\n });\n await this.client.execute({\n sql: `DELETE FROM ${stepsTable} WHERE conversation_id = ? AND user_id = ?`,\n args: [conversationId, userId],\n });\n } else {\n await this.client.execute({\n sql: `DELETE FROM ${messagesTable}\n WHERE conversation_id IN (\n SELECT id FROM ${conversationsTable} WHERE user_id = ?\n )`,\n args: [userId],\n });\n await this.client.execute({\n sql: `DELETE FROM ${stepsTable}\n WHERE conversation_id IN (\n SELECT id FROM ${conversationsTable} WHERE user_id = ?\n )`,\n args: [userId],\n });\n }\n }\n\n // ============================================================================\n // Conversation Operations\n // ============================================================================\n\n async createConversation(input: CreateConversationInput): Promise<Conversation> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n const existing = await this.getConversation(input.id);\n if (existing) {\n throw new ConversationAlreadyExistsError(input.id);\n }\n\n const now = new Date().toISOString();\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `INSERT INTO ${conversationsTable} (id, resource_id, user_id, title, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n args: [\n input.id,\n input.resourceId,\n input.userId,\n input.title,\n safeStringify(input.metadata || {}),\n now,\n now,\n ],\n });\n }, \"create conversation\");\n\n return {\n id: input.id,\n userId: input.userId,\n resourceId: input.resourceId,\n title: input.title,\n metadata: input.metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n }\n\n async getConversation(id: string): Promise<Conversation | null> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${conversationsTable} WHERE id = ?`,\n args: [id],\n });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return {\n id: row.id as string,\n userId: row.user_id as string,\n resourceId: row.resource_id as string,\n title: row.title as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : {},\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n };\n }\n\n async getConversations(resourceId: string): Promise<Conversation[]> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${conversationsTable} WHERE resource_id = ? ORDER BY updated_at DESC`,\n args: [resourceId],\n });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n userId: row.user_id as string,\n resourceId: row.resource_id as string,\n title: row.title as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : {},\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n }));\n }\n\n async getConversationsByUserId(\n userId: string,\n options?: Omit<ConversationQueryOptions, \"userId\">,\n ): Promise<Conversation[]> {\n return this.queryConversations({ ...options, userId });\n }\n\n async queryConversations(options: ConversationQueryOptions): Promise<Conversation[]> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n let sql = `SELECT * FROM ${conversationsTable} WHERE 1=1`;\n const args: any[] = [];\n\n if (options.userId) {\n sql += \" AND user_id = ?\";\n args.push(options.userId);\n }\n\n if (options.resourceId) {\n sql += \" AND resource_id = ?\";\n args.push(options.resourceId);\n }\n\n const orderBy = options.orderBy || \"updated_at\";\n const orderDirection = options.orderDirection || \"DESC\";\n sql += ` ORDER BY ${orderBy} ${orderDirection}`;\n\n if (options.limit) {\n sql += \" LIMIT ?\";\n args.push(options.limit);\n }\n\n if (options.offset) {\n sql += \" OFFSET ?\";\n args.push(options.offset);\n }\n\n const result = await this.client.execute({ sql, args });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n userId: row.user_id as string,\n resourceId: row.resource_id as string,\n title: row.title as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : {},\n createdAt: row.created_at as string,\n updatedAt: row.updated_at as string,\n }));\n }\n\n async updateConversation(\n id: string,\n updates: Partial<Omit<Conversation, \"id\" | \"createdAt\" | \"updatedAt\">>,\n ): Promise<Conversation> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n const conversation = await this.getConversation(id);\n if (!conversation) {\n throw new ConversationNotFoundError(id);\n }\n\n const now = new Date().toISOString();\n const fieldsToUpdate: string[] = [\"updated_at = ?\"];\n const args: any[] = [now];\n\n if (updates.title !== undefined) {\n fieldsToUpdate.push(\"title = ?\");\n args.push(updates.title);\n }\n\n if (updates.resourceId !== undefined) {\n fieldsToUpdate.push(\"resource_id = ?\");\n args.push(updates.resourceId);\n }\n\n if (updates.metadata !== undefined) {\n fieldsToUpdate.push(\"metadata = ?\");\n args.push(safeStringify(updates.metadata));\n }\n\n args.push(id);\n\n await this.client.execute({\n sql: `UPDATE ${conversationsTable} SET ${fieldsToUpdate.join(\", \")} WHERE id = ?`,\n args,\n });\n\n const updated = await this.getConversation(id);\n if (!updated) {\n throw new Error(`Conversation not found after update: ${id}`);\n }\n return updated;\n }\n\n async deleteConversation(id: string): Promise<void> {\n await this.initialize();\n\n const conversationsTable = `${this.tablePrefix}_conversations`;\n\n await this.client.execute({\n sql: `DELETE FROM ${conversationsTable} WHERE id = ?`,\n args: [id],\n });\n }\n\n // ============================================================================\n // Working Memory Operations\n // ============================================================================\n\n async getWorkingMemory(params: {\n conversationId?: string;\n userId?: string;\n scope: WorkingMemoryScope;\n }): Promise<string | null> {\n await this.initialize();\n\n if (params.scope === \"conversation\" && params.conversationId) {\n const conversation = await this.getConversation(params.conversationId);\n return (conversation?.metadata?.workingMemory as string) || null;\n }\n\n if (params.scope === \"user\" && params.userId) {\n const usersTable = `${this.tablePrefix}_users`;\n const result = await this.client.execute({\n sql: `SELECT metadata FROM ${usersTable} WHERE id = ?`,\n args: [params.userId],\n });\n\n if (result.rows.length > 0) {\n const metadata = result.rows[0].metadata\n ? JSON.parse(result.rows[0].metadata as string)\n : {};\n return metadata.workingMemory || null;\n }\n }\n\n return null;\n }\n\n async setWorkingMemory(params: {\n conversationId?: string;\n userId?: string;\n content: string;\n scope: WorkingMemoryScope;\n }): Promise<void> {\n await this.initialize();\n\n if (params.scope === \"conversation\" && params.conversationId) {\n const conversation = await this.getConversation(params.conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(params.conversationId);\n }\n\n const metadata = conversation.metadata || {};\n metadata.workingMemory = params.content;\n\n await this.updateConversation(params.conversationId, { metadata });\n }\n\n if (params.scope === \"user\" && params.userId) {\n const usersTable = `${this.tablePrefix}_users`;\n const now = new Date().toISOString();\n\n const result = await this.client.execute({\n sql: `SELECT metadata FROM ${usersTable} WHERE id = ?`,\n args: [params.userId],\n });\n\n if (result.rows.length > 0) {\n const metadata = result.rows[0].metadata\n ? JSON.parse(result.rows[0].metadata as string)\n : {};\n metadata.workingMemory = params.content;\n\n await this.client.execute({\n sql: `UPDATE ${usersTable} SET metadata = ?, updated_at = ? WHERE id = ?`,\n args: [safeStringify(metadata), now, params.userId],\n });\n } else {\n await this.client.execute({\n sql: `INSERT INTO ${usersTable} (id, metadata, created_at, updated_at) VALUES (?, ?, ?, ?)`,\n args: [params.userId, safeStringify({ workingMemory: params.content }), now, now],\n });\n }\n }\n }\n\n async deleteWorkingMemory(params: {\n conversationId?: string;\n userId?: string;\n scope: WorkingMemoryScope;\n }): Promise<void> {\n await this.initialize();\n\n if (params.scope === \"conversation\" && params.conversationId) {\n const conversation = await this.getConversation(params.conversationId);\n if (conversation?.metadata?.workingMemory) {\n const metadata = { ...conversation.metadata };\n // biome-ignore lint/performance/noDelete: <explanation>\n delete metadata.workingMemory;\n await this.updateConversation(params.conversationId, { metadata });\n }\n }\n\n if (params.scope === \"user\" && params.userId) {\n const usersTable = `${this.tablePrefix}_users`;\n const result = await this.client.execute({\n sql: `SELECT metadata FROM ${usersTable} WHERE id = ?`,\n args: [params.userId],\n });\n\n if (result.rows.length > 0 && result.rows[0].metadata) {\n const metadata = JSON.parse(result.rows[0].metadata as string);\n if (metadata.workingMemory) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete metadata.workingMemory;\n await this.client.execute({\n sql: `UPDATE ${usersTable} SET metadata = ?, updated_at = ? WHERE id = ?`,\n args: [safeStringify(metadata), new Date().toISOString(), params.userId],\n });\n }\n }\n }\n }\n\n // ============================================================================\n // Workflow State Operations\n // ============================================================================\n\n async getWorkflowState(executionId: string): Promise<WorkflowStateEntry | null> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const result = await this.client.execute({\n sql: `SELECT * FROM ${workflowStatesTable} WHERE id = ?`,\n args: [executionId],\n });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return {\n id: row.id as string,\n workflowId: row.workflow_id as string,\n workflowName: row.workflow_name as string,\n status: row.status as \"running\" | \"suspended\" | \"completed\" | \"error\",\n suspension: row.suspension ? JSON.parse(row.suspension as string) : undefined,\n events: row.events ? JSON.parse(row.events as string) : undefined,\n output: row.output ? JSON.parse(row.output as string) : undefined,\n cancellation: row.cancellation ? JSON.parse(row.cancellation as string) : undefined,\n userId: row.user_id as string | undefined,\n conversationId: row.conversation_id as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n createdAt: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string),\n };\n }\n\n async queryWorkflowRuns(query: {\n workflowId?: string;\n status?: WorkflowStateEntry[\"status\"];\n from?: Date;\n to?: Date;\n limit?: number;\n offset?: number;\n }): Promise<WorkflowStateEntry[]> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const conditions: string[] = [];\n const args: any[] = [];\n\n if (query.workflowId) {\n conditions.push(\"workflow_id = ?\");\n args.push(query.workflowId);\n }\n\n if (query.status) {\n conditions.push(\"status = ?\");\n args.push(query.status);\n }\n\n if (query.from) {\n conditions.push(\"created_at >= ?\");\n args.push(query.from.toISOString());\n }\n\n if (query.to) {\n conditions.push(\"created_at <= ?\");\n args.push(query.to.toISOString());\n }\n\n let sql = `SELECT * FROM ${workflowStatesTable}`;\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(\" AND \")}`;\n }\n sql += \" ORDER BY created_at DESC\";\n\n if (query.limit !== undefined) {\n sql += \" LIMIT ?\";\n args.push(query.limit);\n }\n\n if (query.offset !== undefined) {\n sql += \" OFFSET ?\";\n args.push(query.offset);\n }\n\n const result = await this.client.execute({\n sql,\n args,\n });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n workflowId: row.workflow_id as string,\n workflowName: row.workflow_name as string,\n status: row.status as WorkflowStateEntry[\"status\"],\n suspension: row.suspension ? JSON.parse(row.suspension as string) : undefined,\n events: row.events ? JSON.parse(row.events as string) : undefined,\n output: row.output ? JSON.parse(row.output as string) : undefined,\n cancellation: row.cancellation ? JSON.parse(row.cancellation as string) : undefined,\n userId: row.user_id as string | undefined,\n conversationId: row.conversation_id as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n createdAt: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string),\n }));\n }\n\n async setWorkflowState(executionId: string, state: WorkflowStateEntry): Promise<void> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n await this.client.execute({\n sql: `INSERT OR REPLACE INTO ${workflowStatesTable}\n (id, workflow_id, workflow_name, status, suspension, events, output, cancellation, user_id, conversation_id, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n executionId,\n state.workflowId,\n state.workflowName,\n state.status,\n state.suspension ? safeStringify(state.suspension) : null,\n state.events ? safeStringify(state.events) : null,\n state.output ? safeStringify(state.output) : null,\n state.cancellation ? safeStringify(state.cancellation) : null,\n state.userId || null,\n state.conversationId || null,\n state.metadata ? safeStringify(state.metadata) : null,\n state.createdAt.toISOString(),\n state.updatedAt.toISOString(),\n ],\n });\n }\n\n async updateWorkflowState(\n executionId: string,\n updates: Partial<WorkflowStateEntry>,\n ): Promise<void> {\n await this.initialize();\n\n const existing = await this.getWorkflowState(executionId);\n if (!existing) {\n throw new Error(`Workflow state ${executionId} not found`);\n }\n\n const updated: WorkflowStateEntry = {\n ...existing,\n ...updates,\n updatedAt: new Date(),\n };\n\n await this.setWorkflowState(executionId, updated);\n }\n\n async getSuspendedWorkflowStates(workflowId: string): Promise<WorkflowStateEntry[]> {\n await this.initialize();\n\n const workflowStatesTable = `${this.tablePrefix}_workflow_states`;\n const result = await this.client.execute({\n sql: `SELECT * FROM ${workflowStatesTable} WHERE workflow_id = ? AND status = 'suspended' ORDER BY created_at DESC`,\n args: [workflowId],\n });\n\n return result.rows.map((row) => ({\n id: row.id as string,\n workflowId: row.workflow_id as string,\n workflowName: row.workflow_name as string,\n status: \"suspended\" as const,\n suspension: row.suspension ? JSON.parse(row.suspension as string) : undefined,\n events: row.events ? JSON.parse(row.events as string) : undefined,\n output: row.output ? JSON.parse(row.output as string) : undefined,\n cancellation: row.cancellation ? JSON.parse(row.cancellation as string) : undefined,\n userId: row.user_id as string | undefined,\n conversationId: row.conversation_id as string | undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n createdAt: new Date(row.created_at as string),\n updatedAt: new Date(row.updated_at as string),\n }));\n }\n\n async close(): Promise<void> {\n this.logger.debug(\"Closing LibSQL Memory adapter\");\n }\n}\n","/**\n * LibSQL Observability Adapter - Node.js\n * Provides persistent storage for OpenTelemetry spans using LibSQL/Turso database\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { createClient } from \"@libsql/client\";\nimport { createPinoLogger } from \"@voltagent/logger\";\nimport type { Logger } from \"@voltagent/logger\";\nimport { LibSQLObservabilityCore, type LibSQLObservabilityCoreOptions } from \"./observability-core\";\n\n/**\n * Options for configuring the LibSQLObservabilityAdapter\n */\nexport interface LibSQLObservabilityOptions extends LibSQLObservabilityCoreOptions {\n /**\n * LibSQL connection URL\n * Can be either a remote Turso URL or a local file path\n * @default \"file:./.voltagent/observability.db\"\n */\n url?: string;\n\n /**\n * Auth token for LibSQL/Turso\n * Not needed for local SQLite\n */\n authToken?: string;\n\n /**\n * Optional logger instance\n */\n logger?: Logger;\n}\n\n/**\n * LibSQL Observability Adapter - Node.js\n * Provides observability storage using LibSQL/Turso database\n * Supports both local SQLite files and remote Turso databases\n */\nexport class LibSQLObservabilityAdapter extends LibSQLObservabilityCore {\n constructor(options: LibSQLObservabilityOptions = {}) {\n const url = options.url || \"file:./.voltagent/observability.db\";\n\n // Initialize the logger\n const logger = options.logger || createPinoLogger({ name: \"libsql-observability\" });\n\n // Ensure parent directory exists for file-based databases\n if (url.startsWith(\"file:\") && !url.includes(\":memory:\")) {\n const filePath = url.substring(5);\n const dir = dirname(filePath);\n if (dir && dir !== \".\" && !existsSync(dir)) {\n try {\n mkdirSync(dir, { recursive: true });\n if (options.debug) {\n logger.debug(\"Created directory for database\", { dir });\n }\n } catch (error) {\n logger.warn(\"Failed to create directory for database\", { dir, error });\n }\n }\n }\n\n // Initialize the LibSQL client\n const client = createClient({\n url,\n authToken: options.authToken,\n });\n\n super(client, options, logger);\n }\n}\n","/**\n * LibSQL Observability Adapter Core\n * Contains shared logic for both Node.js and Edge environments\n * Environment-specific adapters extend this class\n */\n\nimport type { Client } from \"@libsql/client\";\nimport type {\n LogFilter,\n ObservabilityLogRecord,\n ObservabilitySpan,\n ObservabilityStorageAdapter,\n} from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal/utils\";\nimport type { Logger } from \"@voltagent/logger\";\n\n/**\n * Core configuration options for LibSQL Observability adapter\n */\nexport interface LibSQLObservabilityCoreOptions {\n /**\n * Prefix for table names\n * @default \"observability\"\n */\n tablePrefix?: string;\n\n /**\n * Whether to enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Maximum number of spans to return in a single query\n * @default 1000\n */\n maxSpansPerQuery?: number;\n}\n\n/**\n * LibSQL Observability Adapter Core\n * Implements all observability storage operations, receives client via dependency injection\n */\nexport class LibSQLObservabilityCore implements ObservabilityStorageAdapter {\n protected client: Client;\n protected tablePrefix: string;\n protected debug: boolean;\n protected logger: Logger;\n protected initialized: Promise<void>;\n protected maxSpansPerQuery: number;\n\n constructor(client: Client, options: LibSQLObservabilityCoreOptions, logger: Logger) {\n this.client = client;\n this.logger = logger;\n this.tablePrefix = options.tablePrefix || \"observability\";\n this.debug = options.debug || false;\n this.maxSpansPerQuery = options.maxSpansPerQuery || 1000;\n\n this.debugLog(\"LibSQL observability adapter core initialized\", {\n tablePrefix: this.tablePrefix,\n debug: this.debug,\n maxSpansPerQuery: this.maxSpansPerQuery,\n });\n\n this.initialized = this.initializeDatabase();\n }\n\n protected debugLog(message: string, data?: unknown): void {\n if (this.debug) {\n this.logger.debug(`${message}`, data || \"\");\n }\n }\n\n private async initializeDatabase(): Promise<void> {\n try {\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${this.tablePrefix}_spans (\n span_id TEXT PRIMARY KEY,\n trace_id TEXT NOT NULL,\n parent_span_id TEXT,\n entity_id TEXT,\n entity_type TEXT,\n name TEXT NOT NULL,\n kind INTEGER DEFAULT 0,\n start_time TEXT NOT NULL,\n end_time TEXT,\n duration REAL,\n status_code INTEGER DEFAULT 0,\n status_message TEXT,\n attributes TEXT,\n events TEXT,\n links TEXT,\n resource TEXT,\n instrumentation_scope TEXT,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_trace_id\n ON ${this.tablePrefix}_spans(trace_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_parent_span_id\n ON ${this.tablePrefix}_spans(parent_span_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_start_time\n ON ${this.tablePrefix}_spans(start_time)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_name\n ON ${this.tablePrefix}_spans(name)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_entity_id\n ON ${this.tablePrefix}_spans(entity_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_spans_entity_type\n ON ${this.tablePrefix}_spans(entity_type)\n `);\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${this.tablePrefix}_traces (\n trace_id TEXT PRIMARY KEY,\n root_span_id TEXT,\n entity_id TEXT,\n entity_type TEXT,\n start_time TEXT NOT NULL,\n end_time TEXT,\n span_count INTEGER DEFAULT 1,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_traces_start_time\n ON ${this.tablePrefix}_traces(start_time DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_traces_entity_id\n ON ${this.tablePrefix}_traces(entity_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_traces_entity_type\n ON ${this.tablePrefix}_traces(entity_type)\n `);\n\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${this.tablePrefix}_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL,\n trace_id TEXT,\n span_id TEXT,\n trace_flags INTEGER,\n severity_number INTEGER,\n severity_text TEXT,\n body TEXT NOT NULL,\n attributes TEXT,\n resource TEXT,\n instrumentation_scope TEXT,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_trace_id\n ON ${this.tablePrefix}_logs(trace_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_span_id\n ON ${this.tablePrefix}_logs(span_id)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_timestamp\n ON ${this.tablePrefix}_logs(timestamp DESC)\n `);\n\n await this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_${this.tablePrefix}_logs_severity\n ON ${this.tablePrefix}_logs(severity_number)\n `);\n\n this.debugLog(\"Database tables initialized successfully\");\n } catch (error) {\n this.logger.error(\"Failed to initialize database tables\", { error });\n throw error;\n }\n }\n\n protected async ensureInitialized(): Promise<void> {\n await this.initialized;\n }\n\n async addSpan(span: ObservabilitySpan): Promise<void> {\n await this.ensureInitialized();\n\n try {\n const entityId = (span.attributes?.[\"entity.id\"] as string) || null;\n const entityType = (span.attributes?.[\"entity.type\"] as string) || null;\n\n await this.client.batch([\n {\n sql: `\n INSERT INTO ${this.tablePrefix}_spans (\n span_id, trace_id, parent_span_id, entity_id, entity_type, name, kind,\n start_time, end_time, duration,\n status_code, status_message,\n attributes, events, links,\n resource, instrumentation_scope\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n span.spanId,\n span.traceId,\n span.parentSpanId || null,\n entityId,\n entityType,\n span.name,\n span.kind,\n span.startTime,\n span.endTime || null,\n span.duration || null,\n span.status.code,\n span.status.message || null,\n safeStringify(span.attributes),\n safeStringify(span.events),\n span.links ? safeStringify(span.links) : null,\n span.resource ? safeStringify(span.resource) : null,\n span.instrumentationScope ? safeStringify(span.instrumentationScope) : null,\n ],\n },\n {\n sql: `\n INSERT INTO ${this.tablePrefix}_traces (\n trace_id, root_span_id, entity_id, entity_type, start_time, end_time, span_count\n ) VALUES (?, ?, ?, ?, ?, ?, 1)\n ON CONFLICT(trace_id) DO UPDATE SET\n span_count = span_count + 1,\n entity_id = COALESCE(excluded.entity_id, entity_id),\n entity_type = COALESCE(excluded.entity_type, entity_type),\n start_time = MIN(start_time, excluded.start_time),\n end_time = MAX(COALESCE(end_time, excluded.end_time), excluded.end_time),\n updated_at = CURRENT_TIMESTAMP\n `,\n args: [\n span.traceId,\n span.parentSpanId ? null : span.spanId,\n entityId,\n entityType,\n span.startTime,\n span.endTime || null,\n ],\n },\n ]);\n\n this.debugLog(\"Span added successfully\", {\n spanId: span.spanId,\n traceId: span.traceId,\n });\n } catch (error) {\n this.logger.error(\"Failed to add span\", { error, span });\n throw error;\n }\n }\n\n async updateSpan(spanId: string, updates: Partial<ObservabilitySpan>): Promise<void> {\n await this.ensureInitialized();\n\n try {\n const setClauses: string[] = [];\n const args: any[] = [];\n\n if (updates.endTime !== undefined) {\n setClauses.push(\"end_time = ?\");\n args.push(updates.endTime);\n }\n if (updates.duration !== undefined) {\n setClauses.push(\"duration = ?\");\n args.push(updates.duration);\n }\n if (updates.status !== undefined) {\n setClauses.push(\"status_code = ?, status_message = ?\");\n args.push(updates.status.code, updates.status.message || null);\n }\n if (updates.attributes !== undefined) {\n setClauses.push(\"attributes = ?\");\n args.push(safeStringify(updates.attributes));\n }\n if (updates.events !== undefined) {\n setClauses.push(\"events = ?\");\n args.push(safeStringify(updates.events));\n }\n if (updates.links !== undefined) {\n setClauses.push(\"links = ?\");\n args.push(safeStringify(updates.links));\n }\n\n if (setClauses.length === 0) {\n return;\n }\n\n setClauses.push(\"updated_at = CURRENT_TIMESTAMP\");\n args.push(spanId);\n\n await this.client.execute({\n sql: `\n UPDATE ${this.tablePrefix}_spans\n SET ${setClauses.join(\", \")}\n WHERE span_id = ?\n `,\n args,\n });\n\n if (updates.endTime) {\n const span = await this.getSpan(spanId);\n if (span) {\n await this.client.execute({\n sql: `\n UPDATE ${this.tablePrefix}_traces\n SET end_time = MAX(COALESCE(end_time, ?), ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE trace_id = ?\n `,\n args: [updates.endTime, updates.endTime, span.traceId],\n });\n }\n }\n\n this.debugLog(\"Span updated successfully\", { spanId, updates });\n } catch (error) {\n this.logger.error(\"Failed to update span\", { error, spanId, updates });\n throw error;\n }\n }\n\n async getSpan(spanId: string): Promise<ObservabilitySpan | null> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `SELECT * FROM ${this.tablePrefix}_spans WHERE span_id = ?`,\n args: [spanId],\n });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n return this.rowToSpan(result.rows[0]);\n } catch (error) {\n this.logger.error(\"Failed to get span\", { error, spanId });\n throw error;\n }\n }\n\n async getTrace(traceId: string): Promise<ObservabilitySpan[]> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_spans\n WHERE trace_id = ?\n ORDER BY start_time ASC\n LIMIT ?\n `,\n args: [traceId, this.maxSpansPerQuery],\n });\n\n return result.rows.map((row) => this.rowToSpan(row));\n } catch (error) {\n this.logger.error(\"Failed to get trace\", { error, traceId });\n throw error;\n }\n }\n\n async listTraces(\n limit = 100,\n offset = 0,\n filter?: {\n entityId?: string;\n entityType?: \"agent\" | \"workflow\";\n },\n ): Promise<string[]> {\n await this.ensureInitialized();\n\n try {\n let sql: string;\n let args: any[] = [];\n const conditions: string[] = [];\n\n if (filter?.entityId) {\n conditions.push(\"entity_id = ?\");\n args.push(filter.entityId);\n }\n\n if (filter?.entityType) {\n conditions.push(\"entity_type = ?\");\n args.push(filter.entityType);\n }\n\n if (conditions.length > 0) {\n sql = `\n SELECT trace_id FROM ${this.tablePrefix}_traces\n WHERE ${conditions.join(\" AND \")}\n ORDER BY start_time DESC\n LIMIT ? OFFSET ?\n `;\n args.push(limit, offset);\n } else {\n sql = `\n SELECT trace_id FROM ${this.tablePrefix}_traces\n ORDER BY start_time DESC\n LIMIT ? OFFSET ?\n `;\n args = [limit, offset];\n }\n\n const result = await this.client.execute({ sql, args });\n return result.rows.map((row) => row.trace_id as string);\n } catch (error) {\n this.logger.error(\"Failed to list traces\", { error, limit, offset, filter });\n throw error;\n }\n }\n\n async deleteOldSpans(beforeTimestamp: number): Promise<number> {\n await this.ensureInitialized();\n\n try {\n const beforeDate = new Date(beforeTimestamp).toISOString();\n\n const tracesResult = await this.client.execute({\n sql: `SELECT DISTINCT trace_id FROM ${this.tablePrefix}_spans WHERE start_time < ?`,\n args: [beforeDate],\n });\n\n const affectedTraceIds = tracesResult.rows.map((row) => row.trace_id as string);\n\n const deleteResult = await this.client.execute({\n sql: `DELETE FROM ${this.tablePrefix}_spans WHERE start_time < ?`,\n args: [beforeDate],\n });\n\n if (affectedTraceIds.length > 0) {\n for (const traceId of affectedTraceIds) {\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${this.tablePrefix}_spans WHERE trace_id = ?`,\n args: [traceId],\n });\n\n const count = countResult.rows[0].count as number;\n if (count === 0) {\n await this.client.execute({\n sql: `DELETE FROM ${this.tablePrefix}_traces WHERE trace_id = ?`,\n args: [traceId],\n });\n } else {\n await this.client.execute({\n sql: `\n UPDATE ${this.tablePrefix}_traces\n SET span_count = ?, updated_at = CURRENT_TIMESTAMP\n WHERE trace_id = ?\n `,\n args: [count, traceId],\n });\n }\n }\n }\n\n const deletedCount = deleteResult.rowsAffected || 0;\n this.debugLog(\"Old spans deleted\", { deletedCount, beforeDate });\n return deletedCount;\n } catch (error) {\n this.logger.error(\"Failed to delete old spans\", { error, beforeTimestamp });\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n await this.ensureInitialized();\n\n try {\n await this.client.batch([\n { sql: `DELETE FROM ${this.tablePrefix}_spans`, args: [] },\n { sql: `DELETE FROM ${this.tablePrefix}_traces`, args: [] },\n { sql: `DELETE FROM ${this.tablePrefix}_logs`, args: [] },\n ]);\n\n this.debugLog(\"All spans, traces, and logs cleared\");\n } catch (error) {\n this.logger.error(\"Failed to clear data\", { error });\n throw error;\n }\n }\n\n private rowToSpan(row: any): ObservabilitySpan {\n const span: ObservabilitySpan = {\n traceId: row.trace_id as string,\n spanId: row.span_id as string,\n name: row.name as string,\n kind: row.kind as number,\n startTime: row.start_time as string,\n status: {\n code: row.status_code as number,\n },\n attributes: row.attributes ? JSON.parse(row.attributes as string) : {},\n events: row.events ? JSON.parse(row.events as string) : [],\n };\n\n if (row.parent_span_id !== null) {\n span.parentSpanId = row.parent_span_id as string;\n }\n if (row.end_time !== null) {\n span.endTime = row.end_time as string;\n }\n if (row.duration !== null) {\n span.duration = row.duration as number;\n }\n if (row.status_message !== null) {\n span.status.message = row.status_message as string;\n }\n if (row.links && row.links !== \"null\") {\n const links = JSON.parse(row.links as string);\n if (links && links.length > 0) {\n span.links = links;\n }\n }\n if (row.resource && row.resource !== \"null\") {\n const resource = JSON.parse(row.resource as string);\n if (resource && Object.keys(resource).length > 0) {\n span.resource = resource;\n }\n }\n if (row.instrumentation_scope && row.instrumentation_scope !== \"null\") {\n const scope = JSON.parse(row.instrumentation_scope as string);\n if (scope) {\n span.instrumentationScope = scope;\n }\n }\n\n return span;\n }\n\n async getStats(): Promise<{\n spanCount: number;\n traceCount: number;\n oldestSpan?: Date;\n newestSpan?: Date;\n }> {\n await this.ensureInitialized();\n\n try {\n const [spanCountResult, traceCountResult, timeRangeResult] = await Promise.all([\n this.client.execute(`SELECT COUNT(*) as count FROM ${this.tablePrefix}_spans`),\n this.client.execute(`SELECT COUNT(*) as count FROM ${this.tablePrefix}_traces`),\n this.client.execute(`\n SELECT MIN(start_time) as oldest, MAX(start_time) as newest\n FROM ${this.tablePrefix}_spans\n `),\n ]);\n\n const stats: any = {\n spanCount: spanCountResult.rows[0].count as number,\n traceCount: traceCountResult.rows[0].count as number,\n };\n\n if (timeRangeResult.rows[0].oldest) {\n stats.oldestSpan = new Date(timeRangeResult.rows[0].oldest as string);\n }\n if (timeRangeResult.rows[0].newest) {\n stats.newestSpan = new Date(timeRangeResult.rows[0].newest as string);\n }\n\n return stats;\n } catch (error) {\n this.logger.error(\"Failed to get stats\", { error });\n throw error;\n }\n }\n\n async saveLogRecord(logRecord: any): Promise<void> {\n await this.ensureInitialized();\n\n try {\n let timestamp: string;\n if (Array.isArray(logRecord.hrTime)) {\n const timeMs = logRecord.hrTime[0] * 1000 + logRecord.hrTime[1] / 1000000;\n timestamp = new Date(timeMs).toISOString();\n } else if (logRecord.timestamp) {\n timestamp =\n typeof logRecord.timestamp === \"string\"\n ? logRecord.timestamp\n : new Date(logRecord.timestamp).toISOString();\n } else {\n timestamp = new Date().toISOString();\n }\n\n const spanContext = logRecord.spanContext || {};\n const traceId = spanContext.traceId || null;\n const spanId = spanContext.spanId || null;\n const traceFlags = spanContext.traceFlags ?? null;\n\n const severityNumber = logRecord.severityNumber ?? null;\n const severityText = logRecord.severityText || null;\n const body =\n typeof logRecord.body === \"string\" ? logRecord.body : safeStringify(logRecord.body);\n const attributes = logRecord.attributes ? safeStringify(logRecord.attributes) : null;\n const resource = logRecord.resource?.attributes\n ? safeStringify(logRecord.resource.attributes)\n : null;\n const instrumentationScope =\n logRecord.instrumentationLibrary || logRecord.instrumentationScope\n ? safeStringify(logRecord.instrumentationLibrary || logRecord.instrumentationScope)\n : null;\n\n await this.client.execute({\n sql: `\n INSERT INTO ${this.tablePrefix}_logs (\n timestamp, trace_id, span_id, trace_flags,\n severity_number, severity_text, body,\n attributes, resource, instrumentation_scope\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `,\n args: [\n timestamp,\n traceId,\n spanId,\n traceFlags,\n severityNumber,\n severityText,\n body,\n attributes,\n resource,\n instrumentationScope,\n ],\n });\n\n this.debugLog(\"Log record saved successfully\", {\n timestamp,\n traceId,\n spanId,\n severityNumber,\n });\n } catch (error) {\n this.logger.error(\"Failed to save log record\", { error, logRecord });\n throw error;\n }\n }\n\n async getLogsByTraceId(traceId: string): Promise<ObservabilityLogRecord[]> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_logs\n WHERE trace_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args: [traceId, this.maxSpansPerQuery],\n });\n\n return result.rows.map((row) => this.rowToLogRecord(row));\n } catch (error) {\n this.logger.error(\"Failed to get logs by trace ID\", { error, traceId });\n throw error;\n }\n }\n\n async getLogsBySpanId(spanId: string): Promise<ObservabilityLogRecord[]> {\n await this.ensureInitialized();\n\n try {\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_logs\n WHERE span_id = ?\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args: [spanId, this.maxSpansPerQuery],\n });\n\n return result.rows.map((row) => this.rowToLogRecord(row));\n } catch (error) {\n this.logger.error(\"Failed to get logs by span ID\", { error, spanId });\n throw error;\n }\n }\n\n async queryLogs(filter: LogFilter): Promise<ObservabilityLogRecord[]> {\n await this.ensureInitialized();\n\n try {\n const whereClauses: string[] = [];\n const args: any[] = [];\n\n if (filter.traceId) {\n whereClauses.push(\"trace_id = ?\");\n args.push(filter.traceId);\n }\n if (filter.spanId) {\n whereClauses.push(\"span_id = ?\");\n args.push(filter.spanId);\n }\n if (filter.severityNumber !== undefined) {\n whereClauses.push(\"severity_number >= ?\");\n args.push(filter.severityNumber);\n }\n if (filter.severityText) {\n whereClauses.push(\"severity_text = ?\");\n args.push(filter.severityText);\n }\n if (filter.instrumentationScope) {\n whereClauses.push(\"instrumentation_scope LIKE ?\");\n args.push(`%${filter.instrumentationScope}%`);\n }\n if (filter.startTimeMin !== undefined) {\n const minTime = new Date(filter.startTimeMin).toISOString();\n whereClauses.push(\"timestamp >= ?\");\n args.push(minTime);\n }\n if (filter.startTimeMax !== undefined) {\n const maxTime = new Date(filter.startTimeMax).toISOString();\n whereClauses.push(\"timestamp <= ?\");\n args.push(maxTime);\n }\n if (filter.bodyContains) {\n whereClauses.push(\"body LIKE ?\");\n args.push(`%${filter.bodyContains}%`);\n }\n\n const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\";\n\n const limit = filter.limit || this.maxSpansPerQuery;\n args.push(limit);\n\n const result = await this.client.execute({\n sql: `\n SELECT * FROM ${this.tablePrefix}_logs\n ${whereClause}\n ORDER BY timestamp DESC\n LIMIT ?\n `,\n args,\n });\n\n const logs = result.rows.map((row) => this.rowToLogRecord(row));\n\n if (filter.attributeKey) {\n const key = filter.attributeKey;\n return logs.filter((log) => {\n if (!log.attributes) return false;\n if (filter.attributeValue !== undefined) {\n return log.attributes[key] === filter.attributeValue;\n }\n return key in log.attributes;\n });\n }\n\n return logs;\n } catch (error) {\n this.logger.error(\"Failed to query logs\", { error, filter });\n throw error;\n }\n }\n\n async deleteOldLogs(beforeTimestamp: number): Promise<number> {\n await this.ensureInitialized();\n\n try {\n const beforeDate = new Date(beforeTimestamp).toISOString();\n\n const result = await this.client.execute({\n sql: `DELETE FROM ${this.tablePrefix}_logs WHERE timestamp < ?`,\n args: [beforeDate],\n });\n\n const deletedCount = result.rowsAffected || 0;\n this.debugLog(\"Old logs deleted\", { deletedCount, beforeDate });\n return deletedCount;\n } catch (error) {\n this.logger.error(\"Failed to delete old logs\", { error, beforeTimestamp });\n throw error;\n }\n }\n\n private rowToLogRecord(row: any): ObservabilityLogRecord {\n const log: ObservabilityLogRecord = {\n timestamp: row.timestamp as string,\n body: (() => {\n try {\n const bodyStr = row.body as string;\n if (bodyStr.startsWith(\"{\") || bodyStr.startsWith(\"[\")) {\n return JSON.parse(bodyStr);\n }\n } catch {\n // If parsing fails, treat as string\n }\n return row.body as string;\n })(),\n };\n\n if (row.trace_id !== null) {\n log.traceId = row.trace_id as string;\n }\n if (row.span_id !== null) {\n log.spanId = row.span_id as string;\n }\n if (row.trace_flags !== null) {\n log.traceFlags = row.trace_flags as number;\n }\n if (row.severity_number !== null) {\n log.severityNumber = row.severity_number as number;\n }\n if (row.severity_text !== null) {\n log.severityText = row.severity_text as string;\n }\n if (row.attributes && row.attributes !== \"null\") {\n try {\n const attributes = JSON.parse(row.attributes as string);\n if (attributes && Object.keys(attributes).length > 0) {\n log.attributes = attributes;\n }\n } catch {\n // Skip if parsing fails\n }\n }\n if (row.resource && row.resource !== \"null\") {\n try {\n const resource = JSON.parse(row.resource as string);\n if (resource && Object.keys(resource).length > 0) {\n log.resource = resource;\n }\n } catch {\n // Skip if parsing fails\n }\n }\n if (row.instrumentation_scope && row.instrumentation_scope !== \"null\") {\n try {\n const scope = JSON.parse(row.instrumentation_scope as string);\n if (scope) {\n log.instrumentationScope = scope;\n }\n } catch {\n // Skip if parsing fails\n }\n }\n\n return log;\n }\n\n getInfo() {\n return {\n adapter: this.constructor.name,\n displayName: \"LibSQL Observability Storage\",\n persistent: true,\n description: \"Persists spans and logs to a LibSQL/Turso database for long-term retention.\",\n };\n }\n\n async close(): Promise<void> {\n this.debugLog(\"LibSQL observability adapter closed\");\n }\n}\n","/**\n * LibSQL Vector Adapter - Node.js\n * Provides vector storage and similarity search using LibSQL/Turso database\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createClient } from \"@libsql/client\";\nimport { createPinoLogger } from \"@voltagent/logger\";\nimport type { Logger } from \"@voltagent/logger\";\nimport { LibSQLVectorCore, type LibSQLVectorCoreOptions } from \"./vector-core\";\n\n/**\n * LibSQL Vector Adapter configuration options\n */\nexport interface LibSQLVectorOptions extends LibSQLVectorCoreOptions {\n /**\n * Database URL (e.g., 'file:./memory.db' or 'libsql://...')\n * @default \"file:./.voltagent/memory.db\"\n */\n url?: string;\n\n /**\n * Auth token for remote connections (optional)\n */\n authToken?: string;\n\n /**\n * Logger instance\n */\n logger?: Logger;\n}\n\n/**\n * LibSQL Vector Adapter - Node.js\n * Production-ready vector storage with similarity search\n * Supports both local SQLite files and remote Turso databases\n */\nexport class LibSQLVectorAdapter extends LibSQLVectorCore {\n constructor(options: LibSQLVectorOptions = {}) {\n // Initialize logger\n const logger =\n options.logger ??\n createPinoLogger({\n name: \"libsql-vector-adapter\",\n level: options.debug ? \"debug\" : \"info\",\n });\n\n // Normalize database URL\n const requestedUrl = options.url ?? \"file:./.voltagent/memory.db\";\n let url: string;\n\n if (\n requestedUrl === \":memory:\" ||\n requestedUrl === \"file::memory:\" ||\n requestedUrl.startsWith(\"file::memory:\")\n ) {\n url = \":memory:\";\n } else {\n url = requestedUrl;\n }\n\n // Ensure directory exists for file-based databases (skip pure in-memory)\n if (url.startsWith(\"file:\") && !url.startsWith(\"file::memory:\")) {\n const dbPath = url.replace(\"file:\", \"\");\n const dbDir = path.dirname(dbPath);\n if (!fs.existsSync(dbDir)) {\n fs.mkdirSync(dbDir, { recursive: true });\n }\n }\n\n // Initialize LibSQL client\n const client = createClient({\n url: url,\n authToken: options.authToken,\n });\n\n super(client, options, logger);\n }\n\n /**\n * Override to use Buffer for more efficient serialization in Node.js\n */\n protected serializeVector(vector: number[]): Uint8Array {\n const buffer = Buffer.allocUnsafe(vector.length * 4);\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4);\n }\n return buffer;\n }\n\n /**\n * Override to use Buffer for more efficient deserialization in Node.js\n */\n protected deserializeVector(data: Uint8Array | ArrayBuffer): number[] {\n let buffer: Buffer;\n if (data instanceof Buffer) {\n buffer = data;\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(data);\n } else {\n buffer = Buffer.from(data);\n }\n const vector: number[] = [];\n for (let i = 0; i < buffer.length; i += 4) {\n vector.push(buffer.readFloatLE(i));\n }\n return vector;\n }\n}\n","/**\n * LibSQL Vector Adapter Core\n * Contains shared logic for both Node.js and Edge environments\n * Environment-specific adapters extend this class\n */\n\nimport type { Client } from \"@libsql/client\";\nimport {\n type SearchResult,\n type VectorAdapter,\n type VectorItem,\n type VectorSearchOptions,\n cosineSimilarity,\n} from \"@voltagent/core\";\nimport { safeStringify } from \"@voltagent/internal\";\nimport type { Logger } from \"@voltagent/logger\";\n\n/**\n * Core configuration options for LibSQL Vector adapter\n */\nexport interface LibSQLVectorCoreOptions {\n /**\n * Prefix for table names\n * @default \"voltagent\"\n */\n tablePrefix?: string;\n\n /**\n * Maximum vector dimensions allowed\n * @default 1536\n */\n maxVectorDimensions?: number;\n\n /**\n * Size of the LRU cache for frequently accessed vectors\n * @default 100\n */\n cacheSize?: number;\n\n /**\n * Batch size for bulk operations\n * @default 100\n */\n batchSize?: number;\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Maximum number of retries for database operations\n * @default 3\n */\n maxRetries?: number;\n\n /**\n * Initial retry delay in milliseconds\n * @default 100\n */\n retryDelayMs?: number;\n}\n\n/**\n * LibSQL Vector Adapter Core\n * Implements all vector storage operations, receives client via dependency injection\n */\nexport class LibSQLVectorCore implements VectorAdapter {\n protected client: Client;\n protected tablePrefix: string;\n protected maxVectorDimensions: number;\n protected cacheSize: number;\n protected batchSize: number;\n protected debug: boolean;\n protected logger: Logger;\n protected maxRetries: number;\n protected retryDelayMs: number;\n protected initialized = false;\n protected vectorCache: Map<string, VectorItem>;\n protected dimensions: number | null = null;\n\n constructor(client: Client, options: LibSQLVectorCoreOptions, logger: Logger) {\n this.client = client;\n this.tablePrefix = options.tablePrefix ?? \"voltagent\";\n this.maxVectorDimensions = options.maxVectorDimensions ?? 1536;\n this.cacheSize = options.cacheSize ?? 100;\n this.batchSize = options.batchSize ?? 100;\n this.maxRetries = options.maxRetries ?? 3;\n this.retryDelayMs = options.retryDelayMs ?? 100;\n this.debug = options.debug ?? false;\n this.logger = logger;\n\n this.vectorCache = new Map();\n }\n\n /**\n * Serialize a vector to binary format\n * Uses ArrayBuffer/DataView for cross-platform compatibility\n */\n protected serializeVector(vector: number[]): Uint8Array {\n const buffer = new ArrayBuffer(vector.length * 4);\n const view = new DataView(buffer);\n for (let i = 0; i < vector.length; i++) {\n view.setFloat32(i * 4, vector[i], true); // little-endian\n }\n return new Uint8Array(buffer);\n }\n\n /**\n * Deserialize a vector from binary format\n */\n protected deserializeVector(data: Uint8Array | ArrayBuffer): number[] {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const vector: number[] = [];\n for (let i = 0; i < bytes.length; i += 4) {\n vector.push(view.getFloat32(i, true)); // little-endian\n }\n return vector;\n }\n\n /**\n * Initialize the database schema\n */\n protected async initialize(): Promise<void> {\n if (this.initialized) return;\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n try {\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n vector BLOB NOT NULL,\n dimensions INTEGER NOT NULL,\n metadata TEXT,\n content TEXT,\n created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n await this.client.execute(\n `CREATE INDEX IF NOT EXISTS idx_${tableName}_created ON ${tableName}(created_at)`,\n );\n\n await this.client.execute(\n `CREATE INDEX IF NOT EXISTS idx_${tableName}_dimensions ON ${tableName}(dimensions)`,\n );\n\n this.initialized = true;\n this.logger.debug(\"Vector adapter initialized\");\n } catch (error) {\n this.logger.error(\"Failed to initialize vector adapter\", error as Error);\n throw error;\n }\n }\n\n /**\n * Execute a database operation with retries\n */\n protected async executeWithRetry<T>(operation: () => Promise<T>, context: string): Promise<T> {\n let lastError: Error | undefined;\n let delay = this.retryDelayMs;\n\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n this.logger.warn(`Operation failed (attempt ${attempt}): ${context}`, error as Error);\n\n if (attempt < this.maxRetries) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= 2;\n }\n }\n }\n\n this.logger.error(`Operation failed after ${this.maxRetries} attempts: ${context}`, lastError);\n throw lastError;\n }\n\n async store(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void> {\n await this.initialize();\n\n if (!Array.isArray(vector) || vector.length === 0) {\n throw new Error(\"Vector must be a non-empty array\");\n }\n\n if (vector.length > this.maxVectorDimensions) {\n throw new Error(\n `Vector dimensions (${vector.length}) exceed maximum (${this.maxVectorDimensions})`,\n );\n }\n\n if (this.dimensions === null) {\n this.dimensions = vector.length;\n } else if (vector.length !== this.dimensions) {\n throw new Error(\n `Vector dimension mismatch. Expected ${this.dimensions}, got ${vector.length}`,\n );\n }\n\n const tableName = `${this.tablePrefix}_vectors`;\n const serializedVector = this.serializeVector(vector);\n const metadataJson = metadata ? safeStringify(metadata) : null;\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `\n INSERT OR REPLACE INTO ${tableName}\n (id, vector, dimensions, metadata, updated_at)\n VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)\n `,\n args: [id, serializedVector, vector.length, metadataJson],\n });\n }, `store vector ${id}`);\n\n if (this.vectorCache.size >= this.cacheSize) {\n const firstKey = this.vectorCache.keys().next().value;\n if (firstKey) this.vectorCache.delete(firstKey);\n }\n this.vectorCache.set(id, { id, vector, metadata });\n\n this.logger.debug(`Vector stored: ${id} (${vector.length} dimensions)`);\n }\n\n async storeBatch(items: VectorItem[]): Promise<void> {\n await this.initialize();\n\n if (items.length === 0) return;\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n for (let i = 0; i < items.length; i += this.batchSize) {\n const batch = items.slice(i, i + this.batchSize);\n\n await this.executeWithRetry(async () => {\n const stmts: { sql: string; args: any[] }[] = [];\n for (const item of batch) {\n if (!Array.isArray(item.vector) || item.vector.length === 0) {\n throw new Error(\"Vector must be a non-empty array\");\n }\n if (this.dimensions === null) {\n this.dimensions = item.vector.length;\n } else if (item.vector.length !== this.dimensions) {\n throw new Error(\n `Vector dimension mismatch. Expected ${this.dimensions}, got ${item.vector.length}`,\n );\n }\n\n const serializedVector = this.serializeVector(item.vector);\n const metadataJson = item.metadata ? safeStringify(item.metadata) : null;\n const content = item.content ?? null;\n stmts.push({\n sql: `INSERT OR REPLACE INTO ${tableName} (id, vector, dimensions, metadata, content, updated_at) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)`,\n args: [item.id, serializedVector, item.vector.length, metadataJson, content],\n });\n }\n await this.client.batch(stmts, \"write\");\n }, `storeBatch ${batch.length} vectors`);\n\n this.logger.debug(`Batch of ${batch.length} vectors stored`);\n }\n }\n\n async search(queryVector: number[], options?: VectorSearchOptions): Promise<SearchResult[]> {\n await this.initialize();\n\n const { limit = 10, threshold = 0, filter } = options || {};\n\n if (this.dimensions !== null && queryVector.length !== this.dimensions) {\n throw new Error(\n `Query vector dimension mismatch. Expected ${this.dimensions}, got ${queryVector.length}`,\n );\n }\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n let query = `SELECT id, vector, dimensions, metadata, content FROM ${tableName}`;\n const args: any[] = [];\n\n if (this.dimensions !== null) {\n query += \" WHERE dimensions = ?\";\n args.push(this.dimensions);\n }\n\n const result = await this.executeWithRetry(\n async () => await this.client.execute({ sql: query, args }),\n \"search vectors\",\n );\n\n const searchResults: SearchResult[] = [];\n\n for (const row of result.rows) {\n const id = row.id as string;\n const vectorBlob = row.vector as Uint8Array | ArrayBuffer;\n const metadataJson = row.metadata as string | null;\n const content = (row.content as string | null) ?? undefined;\n\n const metadata = metadataJson ? JSON.parse(metadataJson) : undefined;\n\n if (filter && !this.matchesFilter(metadata, filter)) {\n continue;\n }\n\n const vector = this.deserializeVector(vectorBlob);\n const similarity = cosineSimilarity(queryVector, vector);\n const score = (similarity + 1) / 2;\n\n if (score >= threshold) {\n searchResults.push({\n id,\n vector,\n metadata,\n content,\n score,\n distance: 1 - similarity,\n });\n }\n }\n\n searchResults.sort((a, b) => b.score - a.score);\n\n return searchResults.slice(0, limit);\n }\n\n private matchesFilter(\n metadata: Record<string, unknown> | undefined,\n filter: Record<string, unknown>,\n ): boolean {\n if (!metadata) {\n return false;\n }\n\n for (const [key, value] of Object.entries(filter)) {\n if (metadata[key] !== value) {\n return false;\n }\n }\n\n return true;\n }\n\n async delete(id: string): Promise<void> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `DELETE FROM ${tableName} WHERE id = ?`,\n args: [id],\n });\n }, `delete vector ${id}`);\n\n this.vectorCache.delete(id);\n\n this.logger.debug(`Vector deleted: ${id}`);\n }\n\n async deleteBatch(ids: string[]): Promise<void> {\n await this.initialize();\n\n if (ids.length === 0) return;\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n for (let i = 0; i < ids.length; i += this.batchSize) {\n const batch = ids.slice(i, i + this.batchSize);\n const placeholders = batch.map(() => \"?\").join(\",\");\n\n await this.executeWithRetry(async () => {\n await this.client.execute({\n sql: `DELETE FROM ${tableName} WHERE id IN (${placeholders})`,\n args: batch,\n });\n }, `deleteBatch ${batch.length} vectors`);\n\n for (const id of batch) {\n this.vectorCache.delete(id);\n }\n\n this.logger.debug(`Batch of ${batch.length} vectors deleted`);\n }\n }\n\n async clear(): Promise<void> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n await this.executeWithRetry(async () => {\n await this.client.execute(`DELETE FROM ${tableName}`);\n }, \"clear all vectors\");\n\n this.vectorCache.clear();\n this.dimensions = null;\n\n this.logger.debug(\"All vectors cleared\");\n }\n\n async count(): Promise<number> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n const result = await this.executeWithRetry(\n async () => await this.client.execute(`SELECT COUNT(*) as count FROM ${tableName}`),\n \"count vectors\",\n );\n\n const raw = result.rows[0]?.count as any;\n if (typeof raw === \"bigint\") return Number(raw);\n if (typeof raw === \"string\") return Number.parseInt(raw, 10) || 0;\n return (raw as number) ?? 0;\n }\n\n async get(id: string): Promise<VectorItem | null> {\n await this.initialize();\n\n if (this.vectorCache.has(id)) {\n const cached = this.vectorCache.get(id);\n if (cached) {\n return {\n ...cached,\n vector: [...cached.vector],\n metadata: cached.metadata ? { ...cached.metadata } : undefined,\n };\n }\n }\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n const result = await this.executeWithRetry(\n async () =>\n await this.client.execute({\n sql: `SELECT id, vector, metadata, content FROM ${tableName} WHERE id = ?`,\n args: [id],\n }),\n `get vector ${id}`,\n );\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n const vectorBlob = row.vector as Uint8Array | ArrayBuffer;\n const metadataJson = row.metadata as string | null;\n const content = row.content as string | null;\n\n const vector = this.deserializeVector(vectorBlob);\n const metadata = metadataJson ? JSON.parse(metadataJson) : undefined;\n\n const item: VectorItem = {\n id,\n vector,\n metadata,\n content: content ?? undefined,\n };\n\n if (this.vectorCache.size >= this.cacheSize) {\n const firstKey = this.vectorCache.keys().next().value;\n if (firstKey) this.vectorCache.delete(firstKey);\n }\n this.vectorCache.set(id, item);\n\n return item;\n }\n\n async close(): Promise<void> {\n this.vectorCache.clear();\n this.logger.debug(\"Vector adapter closed\");\n }\n\n async getStats(): Promise<{\n count: number;\n dimensions: number | null;\n cacheSize: number;\n tableSizeBytes: number;\n }> {\n await this.initialize();\n\n const tableName = `${this.tablePrefix}_vectors`;\n\n const [countResult, sizeResult] = await Promise.all([\n this.executeWithRetry(\n async () =>\n await this.client.execute(\n `SELECT COUNT(*) as count, MAX(dimensions) as dims FROM ${tableName}`,\n ),\n \"getStats count\",\n ),\n this.executeWithRetry(\n async () =>\n await this.client.execute({\n sql: `SELECT\n COALESCE(SUM(LENGTH(id)),0) +\n COALESCE(SUM(LENGTH(vector)),0) +\n COALESCE(SUM(LENGTH(metadata)),0) +\n COALESCE(SUM(LENGTH(content)),0) AS size\n FROM ${tableName}`,\n }),\n \"getStats size\",\n ),\n ]);\n\n const row1 = countResult.rows[0] as any;\n const row2 = sizeResult.rows[0] as any;\n\n const countRaw = row1?.count as any;\n const dimsRaw = row1?.dims as any;\n const sizeRaw = row2?.size as any;\n\n const normalize = (v: any): number =>\n typeof v === \"bigint\"\n ? Number(v)\n : typeof v === \"string\"\n ? Number.parseInt(v, 10) || 0\n : (v ?? 0);\n\n return {\n count: normalize(countRaw),\n dimensions: dimsRaw != null ? normalize(dimsRaw) : this.dimensions,\n cacheSize: this.vectorCache.size,\n tableSizeBytes: normalize(sizeRaw),\n };\n }\n}\n"],"mappings":"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","names":["createClient","createPinoLogger","safeStringify","safeStringify","createPinoLogger","createClient","fs","path","createClient","createPinoLogger","safeStringify","safeStringify","createPinoLogger","path","fs","createClient"]}
|