@mastra/lance 1.0.0-beta.2 → 1.0.0-beta.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/filter.ts","../src/vector/index.ts"],"names":["TABLE_WORKFLOW_SNAPSHOT","MastraError","ErrorDomain","ErrorCategory","error","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","MessageList","normalizePerPage","calculatePagination","threadId","TABLE_RESOURCES","StoreOperations","Utf8","Int32","Float64","Float32","Binary","Field","Schema","ScoresStorage","saveScorePayloadSchema","TABLE_SCORERS","ensureDate","WorkflowsStorage","MastraStorage","connect","BaseFilterTranslator","filter","MastraVector","Index"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Connection, FieldLike, SchemaLike } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\nexport function getPrimaryKeys(tableName: TABLE_NAMES): string[] {\n let primaryId: string[] = ['id'];\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n primaryId = ['workflow_name', 'run_id'];\n }\n\n return primaryId;\n}\n\nexport function validateKeyTypes(keys: Record<string, any>, tableSchema: SchemaLike): void {\n // Create a map of field names to their expected types\n const fieldTypes = new Map(\n tableSchema.fields.map((field: any) => [field.name, field.type?.toString().toLowerCase()]),\n );\n\n for (const [key, value] of Object.entries(keys)) {\n const fieldType = fieldTypes.get(key);\n\n if (!fieldType) {\n throw new Error(`Field '${key}' does not exist in table schema`);\n }\n\n // Type validation\n if (value !== null) {\n if ((fieldType.includes('int') || fieldType.includes('bigint')) && typeof value !== 'number') {\n throw new Error(`Expected numeric value for field '${key}', got ${typeof value}`);\n }\n\n if (fieldType.includes('utf8') && typeof value !== 'string') {\n throw new Error(`Expected string value for field '${key}', got ${typeof value}`);\n }\n\n if (fieldType.includes('timestamp') && !(value instanceof Date) && typeof value !== 'string') {\n throw new Error(`Expected Date or string value for field '${key}', got ${typeof value}`);\n }\n }\n }\n}\n\nexport function processResultWithTypeConversion(\n rawResult: Record<string, any> | Record<string, any>[],\n tableSchema: SchemaLike,\n): Record<string, any> | Record<string, any>[] {\n // Build a map of field names to their schema types\n const fieldTypeMap = new Map();\n tableSchema.fields.forEach((field: any) => {\n const fieldName = field.name;\n const fieldTypeStr = field.type.toString().toLowerCase();\n fieldTypeMap.set(fieldName, fieldTypeStr);\n });\n\n // Handle array case\n if (Array.isArray(rawResult)) {\n return rawResult.map(item => processResultWithTypeConversion(item, tableSchema));\n }\n\n // Handle single record case\n const processedResult = { ...rawResult };\n\n // Convert each field according to its schema type\n for (const key in processedResult) {\n const fieldTypeStr = fieldTypeMap.get(key);\n if (!fieldTypeStr) continue;\n\n // Skip conversion for ID fields - preserve their original format\n // if (key === 'id') {\n // continue;\n // }\n\n // Only try to convert string values\n if (typeof processedResult[key] === 'string') {\n // Numeric types\n if (fieldTypeStr.includes('int32') || fieldTypeStr.includes('float32')) {\n if (!isNaN(Number(processedResult[key]))) {\n processedResult[key] = Number(processedResult[key]);\n }\n } else if (fieldTypeStr.includes('int64')) {\n processedResult[key] = Number(processedResult[key]);\n } else if (fieldTypeStr.includes('utf8') && key !== 'id') {\n try {\n const parsed = JSON.parse(processedResult[key]);\n if (typeof parsed === 'object') {\n processedResult[key] = JSON.parse(processedResult[key]);\n }\n } catch {}\n }\n } else if (typeof processedResult[key] === 'bigint') {\n // Convert BigInt values to regular numbers for application layer\n processedResult[key] = Number(processedResult[key]);\n } else if (fieldTypeStr.includes('float64') && ['createdAt', 'updatedAt'].includes(key)) {\n processedResult[key] = new Date(processedResult[key]);\n }\n }\n\n return processedResult;\n}\n\nexport async function getTableSchema({\n tableName,\n client,\n}: {\n tableName: TABLE_NAMES;\n client: Connection;\n}): Promise<SchemaLike> {\n try {\n if (!client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for getTableSchema.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_GET_TABLE_SCHEMA_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await client.openTable(tableName);\n const rawSchema = await table.schema();\n const fields = rawSchema.fields as FieldLike[];\n\n // Convert schema to SchemaLike format\n return {\n fields,\n metadata: new Map<string, string>(),\n get names() {\n return fields.map((field: FieldLike) => field.name);\n },\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_GET_TABLE_SCHEMA_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n} from '@mastra/core/storage';\nimport type { StoreOperationsLance } from '../operations';\nimport { getTableSchema, processResultWithTypeConversion } from '../utils';\n\nexport class StoreMemoryLance extends MemoryStorage {\n private client: Connection;\n private operations: StoreOperationsLance;\n constructor({ client, operations }: { client: Connection; operations: StoreOperationsLance }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n // Utility to escape single quotes in SQL strings\n private escapeSql(str: string): string {\n return str.replace(/'/g, \"''\");\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const thread = await this.operations.load({ tableName: TABLE_THREADS, keys: { id: threadId } });\n\n if (!thread) {\n return null;\n }\n\n return {\n ...thread,\n createdAt: new Date(thread.createdAt),\n updatedAt: new Date(thread.updatedAt),\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Saves a thread to the database. This function doesn't overwrite existing threads.\n * @param thread - The thread to save\n * @returns The saved thread\n */\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n const record = { ...thread, metadata: JSON.stringify(thread.metadata) };\n const table = await this.client.openTable(TABLE_THREADS);\n await table.add([record], { mode: 'append' });\n\n return thread;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const maxRetries = 5;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n // Get current state atomically\n const current = await this.getThreadById({ threadId: id });\n if (!current) {\n throw new Error(`Thread with id ${id} not found`);\n }\n\n // Merge metadata\n const mergedMetadata = { ...current.metadata, ...metadata };\n\n // Update atomically\n const record = {\n id,\n title,\n metadata: JSON.stringify(mergedMetadata),\n updatedAt: new Date().getTime(),\n };\n\n const table = await this.client.openTable(TABLE_THREADS);\n await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([record]);\n\n const updatedThread = await this.getThreadById({ threadId: id });\n if (!updatedThread) {\n throw new Error(`Failed to retrieve updated thread ${id}`);\n }\n return updatedThread;\n } catch (error: any) {\n if (error.message?.includes('Commit conflict') && attempt < maxRetries - 1) {\n // Wait with exponential backoff before retrying\n const delay = Math.pow(2, attempt) * 10; // 10ms, 20ms, 40ms\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // If it's not a commit conflict or we've exhausted retries, throw the error\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // This should never be reached, but just in case\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n new Error('All retries exhausted'),\n );\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // Delete the thread\n const table = await this.client.openTable(TABLE_THREADS);\n await table.delete(`id = '${threadId}'`);\n\n // Delete all messages with the matching thread_id\n const messagesTable = await this.client.openTable(TABLE_MESSAGES);\n await messagesTable.delete(`thread_id = '${threadId}'`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private normalizeMessage(message: any): MastraMessageV1 | MastraDBMessage {\n const { thread_id, ...rest } = message;\n return {\n ...rest,\n threadId: thread_id,\n content:\n typeof message.content === 'string'\n ? (() => {\n try {\n return JSON.parse(message.content);\n } catch {\n return message.content;\n }\n })()\n : message.content,\n };\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n try {\n const table = await this.client.openTable(TABLE_MESSAGES);\n\n const quotedIds = messageIds.map(id => `'${id}'`).join(', ');\n const allRecords = await table.query().where(`id IN (${quotedIds})`).toArray();\n\n const messages = processResultWithTypeConversion(\n allRecords,\n await getTableSchema({ tableName: TABLE_MESSAGES, client: this.client }),\n );\n\n const list = new MessageList().add(\n messages.map(this.normalizeMessage) as (MastraMessageV1 | MastraDBMessage)[],\n 'memory',\n );\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: JSON.stringify(messageIds),\n },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n if (!threadId.trim()) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_LIST_MESSAGES_INVALID_THREAD_ID',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n new Error('threadId must be a non-empty string'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n // When perPage is false (get all), ignore page offset\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_LIST_MESSAGES_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // Determine sort field and direction\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n const table = await this.client.openTable(TABLE_MESSAGES);\n\n // Build query conditions\n const conditions: string[] = [`thread_id = '${this.escapeSql(threadId)}'`];\n\n if (resourceId) {\n conditions.push(`\\`resourceId\\` = '${this.escapeSql(resourceId)}'`);\n }\n\n if (filter?.dateRange?.start) {\n const startTime =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.getTime()\n : new Date(filter.dateRange.start).getTime();\n conditions.push(`\\`createdAt\\` >= ${startTime}`);\n }\n\n if (filter?.dateRange?.end) {\n const endTime =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.getTime()\n : new Date(filter.dateRange.end).getTime();\n conditions.push(`\\`createdAt\\` <= ${endTime}`);\n }\n\n const whereClause = conditions.join(' AND ');\n\n // Get total count\n const total = await table.countRows(whereClause);\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n const query = table.query().where(whereClause);\n let allRecords = await query.toArray();\n\n // Sort records\n allRecords.sort((a, b) => {\n const aValue = field === 'createdAt' ? a.createdAt : a[field];\n const bValue = field === 'createdAt' ? b.createdAt : b[field];\n\n // Handle null/undefined - treat as \"smallest\" values\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return direction === 'ASC' ? -1 : 1;\n if (bValue == null) return direction === 'ASC' ? 1 : -1;\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'ASC' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n }\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n // Apply pagination\n const paginatedRecords = allRecords.slice(offset, offset + perPage);\n const messages: any[] = paginatedRecords.map((row: any) => this.normalizeMessage(row));\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n // Get all unique thread IDs from include items\n const threadIds = [...new Set(include.map(item => item.threadId || threadId))];\n\n // Fetch all messages from all relevant threads\n const allThreadMessages: any[] = [];\n for (const tid of threadIds) {\n const threadQuery = table.query().where(`thread_id = '${tid}'`);\n let threadRecords = await threadQuery.toArray();\n allThreadMessages.push(...threadRecords);\n }\n\n // Sort all messages by createdAt\n allThreadMessages.sort((a, b) => a.createdAt - b.createdAt);\n\n // Apply processMessagesWithContext to get included messages with context\n const contextMessages = this.processMessagesWithContext(allThreadMessages, include);\n const includedMessages = contextMessages.map((row: any) => this.normalizeMessage(row));\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includedMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(messages, 'memory');\n let finalMessages = list.get.all.db();\n\n // Sort all messages (paginated + included) for final output\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n // Handle null/undefined - treat as \"smallest\" values\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return direction === 'ASC' ? -1 : 1;\n if (bValue == null) return direction === 'ASC' ? 1 : -1;\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'ASC' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n }\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const returnedThreadMessageIds = new Set(finalMessages.filter(m => m.threadId === threadId).map(m => m.id));\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const fetchedAll = perPageInput === false || allThreadMessagesReturned;\n const hasMore = !fetchedAll && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: 'LANCE_STORE_LIST_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n try {\n const { messages } = args;\n if (messages.length === 0) {\n return { messages: [] };\n }\n\n const threadId = messages[0]?.threadId;\n\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Validate all messages before saving\n for (const message of messages) {\n if (!message.id) {\n throw new Error('Message ID is required');\n }\n if (!message.threadId) {\n throw new Error('Thread ID is required for all messages');\n }\n if (message.resourceId === null || message.resourceId === undefined) {\n throw new Error('Resource ID cannot be null or undefined');\n }\n if (!message.content) {\n throw new Error('Message content is required');\n }\n }\n\n const transformedMessages = messages.map((message: MastraDBMessage | MastraMessageV1) => {\n const { threadId, type, ...rest } = message;\n return {\n ...rest,\n thread_id: threadId,\n type: type ?? 'v2',\n content: JSON.stringify(message.content),\n };\n });\n\n const table = await this.client.openTable(TABLE_MESSAGES);\n await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(transformedMessages);\n\n // Update the thread's updatedAt timestamp\n const threadsTable = await this.client.openTable(TABLE_THREADS);\n const currentTime = new Date().getTime();\n const updateRecord = { id: threadId, updatedAt: currentTime };\n await threadsTable.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([updateRecord]);\n\n const list = new MessageList().add(messages as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n try {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n const perPage = normalizePerPage(perPageInput, 100);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_LIST_THREADS_BY_RESOURCE_ID_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // When perPage is false (get all), ignore page offset\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n const table = await this.client.openTable(TABLE_THREADS);\n\n // Get total count\n const total = await table.countRows(`\\`resourceId\\` = '${this.escapeSql(resourceId)}'`);\n\n // Get ALL matching records (no limit/offset yet - need to sort first)\n const query = table.query().where(`\\`resourceId\\` = '${this.escapeSql(resourceId)}'`);\n const records = await query.toArray();\n\n // Apply dynamic sorting BEFORE pagination\n records.sort((a, b) => {\n const aValue = ['createdAt', 'updatedAt'].includes(field) ? new Date(a[field]).getTime() : a[field];\n const bValue = ['createdAt', 'updatedAt'].includes(field) ? new Date(b[field]).getTime() : b[field];\n\n // Handle null/undefined - treat as \"smallest\" values\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return direction === 'ASC' ? -1 : 1;\n if (bValue == null) return direction === 'ASC' ? 1 : -1;\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'ASC' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n }\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n // Apply pagination AFTER sorting\n const paginatedRecords = records.slice(offset, offset + perPage);\n\n const schema = await getTableSchema({ tableName: TABLE_THREADS, client: this.client });\n const threads = paginatedRecords.map(record =>\n processResultWithTypeConversion(record, schema),\n ) as StorageThreadType[];\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LIST_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Processes messages to include context messages based on withPreviousMessages and withNextMessages\n * @param records - The sorted array of records to process\n * @param include - The array of include specifications with context parameters\n * @returns The processed array with context messages included\n */\n private processMessagesWithContext(\n records: any[],\n include: { id: string; withPreviousMessages?: number; withNextMessages?: number }[],\n ): any[] {\n const messagesWithContext = include.filter(item => item.withPreviousMessages || item.withNextMessages);\n\n if (messagesWithContext.length === 0) {\n return records;\n }\n\n // Create a map of message id to index in the sorted array for quick lookup\n const messageIndexMap = new Map<string, number>();\n records.forEach((message, index) => {\n messageIndexMap.set(message.id, index);\n });\n\n // Keep track of additional indices to include\n const additionalIndices = new Set<number>();\n\n for (const item of messagesWithContext) {\n const messageIndex = messageIndexMap.get(item.id);\n\n if (messageIndex !== undefined) {\n // Add previous messages if requested\n if (item.withPreviousMessages) {\n const startIdx = Math.max(0, messageIndex - item.withPreviousMessages);\n for (let i = startIdx; i < messageIndex; i++) {\n additionalIndices.add(i);\n }\n }\n\n // Add next messages if requested\n if (item.withNextMessages) {\n const endIdx = Math.min(records.length - 1, messageIndex + item.withNextMessages);\n for (let i = messageIndex + 1; i <= endIdx; i++) {\n additionalIndices.add(i);\n }\n }\n }\n }\n\n // If we need to include additional messages, create a new set of records\n if (additionalIndices.size === 0) {\n return records;\n }\n\n // Get IDs of the records that matched the original query\n const originalMatchIds = new Set(include.map(item => item.id));\n\n // Create a set of all indices we need to include\n const allIndices = new Set<number>();\n\n // Add indices of originally matched messages\n records.forEach((record, index) => {\n if (originalMatchIds.has(record.id)) {\n allIndices.add(index);\n }\n });\n\n // Add the additional context message indices\n additionalIndices.forEach(index => {\n allIndices.add(index);\n });\n\n // Create a new filtered array with only the required messages\n // while maintaining chronological order\n return Array.from(allIndices)\n .sort((a, b) => a - b)\n .map(index => records[index]);\n }\n\n /**\n * Parse message data from LanceDB record format to MastraDBMessage format\n */\n private parseMessageData(data: any): MastraDBMessage {\n const { thread_id, ...rest } = data;\n return {\n ...rest,\n threadId: thread_id,\n content:\n typeof data.content === 'string'\n ? (() => {\n try {\n return JSON.parse(data.content);\n } catch {\n return data.content;\n }\n })()\n : data.content,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n } as MastraDBMessage;\n }\n\n async updateMessages(args: {\n messages: Partial<Omit<MastraDBMessage, 'createdAt'>> &\n {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n }[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n this.logger.debug('Updating messages', { count: messages.length });\n\n if (!messages.length) {\n return [];\n }\n\n const updatedMessages: MastraDBMessage[] = [];\n const affectedThreadIds = new Set<string>();\n\n try {\n for (const updateData of messages) {\n const { id, ...updates } = updateData;\n\n // Get the existing message\n const existingMessage = await this.operations.load({ tableName: TABLE_MESSAGES, keys: { id } });\n if (!existingMessage) {\n this.logger.warn('Message not found for update', { id });\n continue;\n }\n\n const existingMsg = this.parseMessageData(existingMessage);\n const originalThreadId = existingMsg.threadId;\n affectedThreadIds.add(originalThreadId!);\n\n // Prepare the update payload\n const updatePayload: any = {};\n\n // Handle basic field updates\n if ('role' in updates && updates.role !== undefined) updatePayload.role = updates.role;\n if ('type' in updates && updates.type !== undefined) updatePayload.type = updates.type;\n if ('resourceId' in updates && updates.resourceId !== undefined) updatePayload.resourceId = updates.resourceId;\n if ('threadId' in updates && updates.threadId !== undefined && updates.threadId !== null) {\n updatePayload.thread_id = updates.threadId;\n affectedThreadIds.add(updates.threadId as string);\n }\n\n // Handle content updates\n if (updates.content) {\n const existingContent = existingMsg.content;\n let newContent = { ...existingContent };\n\n // Deep merge metadata if provided\n if (updates.content.metadata !== undefined) {\n newContent.metadata = {\n ...(existingContent.metadata || {}),\n ...(updates.content.metadata || {}),\n };\n }\n\n // Update content string if provided\n if (updates.content.content !== undefined) {\n newContent.content = updates.content.content;\n }\n\n // Update parts if provided (only if it exists in the content type)\n if ('parts' in updates.content && updates.content.parts !== undefined) {\n (newContent as any).parts = updates.content.parts;\n }\n\n updatePayload.content = JSON.stringify(newContent);\n }\n\n // Update the message using merge insert\n await this.operations.insert({ tableName: TABLE_MESSAGES, record: { id, ...updatePayload } });\n\n // Get the updated message\n const updatedMessage = await this.operations.load({ tableName: TABLE_MESSAGES, keys: { id } });\n if (updatedMessage) {\n updatedMessages.push(this.parseMessageData(updatedMessage));\n }\n }\n\n // Update timestamps for all affected threads\n for (const threadId of affectedThreadIds) {\n await this.operations.insert({\n tableName: TABLE_THREADS,\n record: { id: threadId, updatedAt: Date.now() },\n });\n }\n\n return updatedMessages;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messages.length },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const resource = await this.operations.load({ tableName: TABLE_RESOURCES, keys: { id: resourceId } });\n\n if (!resource) {\n return null;\n }\n\n // Handle date conversion - LanceDB stores timestamps as numbers\n let createdAt: Date;\n let updatedAt: Date;\n\n // Convert ISO strings back to Date objects with error handling\n try {\n // If createdAt is already a Date object, use it directly\n if (resource.createdAt instanceof Date) {\n createdAt = resource.createdAt;\n } else if (typeof resource.createdAt === 'string') {\n // If it's an ISO string, parse it\n createdAt = new Date(resource.createdAt);\n } else if (typeof resource.createdAt === 'number') {\n // If it's a timestamp, convert it to Date\n createdAt = new Date(resource.createdAt);\n } else {\n // If it's null or undefined, use current date\n createdAt = new Date();\n }\n if (isNaN(createdAt.getTime())) {\n createdAt = new Date(); // Fallback to current date if invalid\n }\n } catch {\n createdAt = new Date(); // Fallback to current date if conversion fails\n }\n\n try {\n // If updatedAt is already a Date object, use it directly\n if (resource.updatedAt instanceof Date) {\n updatedAt = resource.updatedAt;\n } else if (typeof resource.updatedAt === 'string') {\n // If it's an ISO string, parse it\n updatedAt = new Date(resource.updatedAt);\n } else if (typeof resource.updatedAt === 'number') {\n // If it's a timestamp, convert it to Date\n updatedAt = new Date(resource.updatedAt);\n } else {\n // If it's null or undefined, use current date\n updatedAt = new Date();\n }\n if (isNaN(updatedAt.getTime())) {\n updatedAt = new Date(); // Fallback to current date if invalid\n }\n } catch {\n updatedAt = new Date(); // Fallback to current date if conversion fails\n }\n\n // Handle workingMemory - return undefined for null/undefined, empty string for empty string\n let workingMemory = resource.workingMemory;\n if (workingMemory === null || workingMemory === undefined) {\n workingMemory = undefined;\n } else if (workingMemory === '') {\n workingMemory = ''; // Return empty string for empty strings to match test expectations\n } else if (typeof workingMemory === 'object') {\n workingMemory = JSON.stringify(workingMemory);\n }\n\n // Handle metadata - return undefined for empty strings, parse JSON safely\n let metadata = resource.metadata;\n if (metadata === '' || metadata === null || metadata === undefined) {\n metadata = undefined;\n } else if (typeof metadata === 'string') {\n try {\n metadata = JSON.parse(metadata);\n } catch {\n // If JSON parsing fails, return the original string\n metadata = metadata;\n }\n }\n\n return {\n ...resource,\n createdAt,\n updatedAt,\n workingMemory,\n metadata,\n } as StorageResourceType;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_GET_RESOURCE_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n const record = {\n ...resource,\n metadata: resource.metadata ? JSON.stringify(resource.metadata) : '',\n createdAt: resource.createdAt.getTime(), // Store as timestamp (milliseconds)\n updatedAt: resource.updatedAt.getTime(), // Store as timestamp (milliseconds)\n };\n\n const table = await this.client.openTable(TABLE_RESOURCES);\n await table.add([record], { mode: 'append' });\n\n return resource;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_SAVE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const maxRetries = 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n const record = {\n id: resourceId,\n workingMemory: updatedResource.workingMemory || '',\n metadata: updatedResource.metadata ? JSON.stringify(updatedResource.metadata) : '',\n updatedAt: updatedResource.updatedAt.getTime(), // Store as timestamp (milliseconds)\n };\n\n const table = await this.client.openTable(TABLE_RESOURCES);\n await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([record]);\n\n return updatedResource;\n } catch (error: any) {\n if (error.message?.includes('Commit conflict') && attempt < maxRetries - 1) {\n // Wait with exponential backoff before retrying\n const delay = Math.pow(2, attempt) * 10; // 10ms, 20ms, 40ms\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // If it's not a commit conflict or we've exhausted retries, throw the error\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // This should never be reached, but TypeScript requires it\n throw new Error('Unexpected end of retry loop');\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { StoreOperations } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport { Utf8, Int32, Float32, Binary, Schema, Field, Float64 } from 'apache-arrow';\nimport type { DataType } from 'apache-arrow';\nimport { getPrimaryKeys, getTableSchema, processResultWithTypeConversion, validateKeyTypes } from '../utils';\n\nexport class StoreOperationsLance extends StoreOperations {\n client: Connection;\n constructor({ client }: { client: Connection }) {\n super();\n this.client = client;\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return \"''\";\n case 'timestamp':\n return 'CURRENT_TIMESTAMP';\n case 'integer':\n case 'bigint':\n return '0';\n case 'jsonb':\n return \"'{}'\";\n case 'uuid':\n return \"''\";\n default:\n return super.getDefaultValue(type);\n }\n }\n\n async hasColumn(tableName: TABLE_NAMES, columnName: string): Promise<boolean> {\n const table = await this.client.openTable(tableName);\n const schema = await table.schema();\n return schema.fields.some(field => field.name === columnName);\n }\n\n private translateSchema(schema: Record<string, StorageColumn>): Schema {\n const fields = Object.entries(schema).map(([name, column]) => {\n // Convert string type to Arrow DataType\n let arrowType: DataType;\n switch (column.type.toLowerCase()) {\n case 'text':\n case 'uuid':\n arrowType = new Utf8();\n break;\n case 'int':\n case 'integer':\n arrowType = new Int32();\n break;\n case 'bigint':\n arrowType = new Float64();\n break;\n case 'float':\n arrowType = new Float32();\n break;\n case 'jsonb':\n case 'json':\n arrowType = new Utf8();\n break;\n case 'binary':\n arrowType = new Binary();\n break;\n case 'timestamp':\n arrowType = new Float64();\n break;\n default:\n // Default to string for unknown types\n arrowType = new Utf8();\n }\n\n // Create a field with the appropriate arrow type\n return new Field(name, arrowType, column.nullable ?? true);\n });\n\n return new Schema(fields);\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for createTable.');\n }\n if (!schema) {\n throw new Error('schema is required for createTable.');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CREATE_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { tableName },\n },\n error,\n );\n }\n\n try {\n const arrowSchema = this.translateSchema(schema);\n await this.client.createEmptyTable(tableName, arrowSchema);\n } catch (error: any) {\n if (error.message?.includes('already exists')) {\n this.logger.debug(`Table '${tableName}' already exists, skipping create`);\n return;\n }\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for dropTable.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_DROP_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n await this.client.dropTable(tableName);\n } catch (error: any) {\n if (error.toString().includes('was not found') || error.message?.includes('Table not found')) {\n this.logger.debug(`Table '${tableName}' does not exist, skipping drop`);\n return;\n }\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: string;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for alterTable.');\n }\n if (!schema) {\n throw new Error('schema is required for alterTable.');\n }\n if (!ifNotExists || ifNotExists.length === 0) {\n this.logger.debug('No columns specified to add in alterTable, skipping.');\n return;\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_ALTER_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n const currentSchema = await table.schema();\n const existingFields = new Set(currentSchema.fields.map((f: any) => f.name));\n\n const typeMap: Record<string, string> = {\n text: 'string',\n integer: 'int',\n bigint: 'bigint',\n timestamp: 'timestamp',\n jsonb: 'string',\n uuid: 'string',\n };\n\n // Find columns to add\n const columnsToAdd = ifNotExists\n .filter(col => schema[col] && !existingFields.has(col))\n .map(col => {\n const colDef = schema[col];\n return {\n name: col,\n valueSql: colDef?.nullable\n ? `cast(NULL as ${typeMap[colDef.type ?? 'text']})`\n : `cast(${this.getDefaultValue(colDef?.type ?? 'text')} as ${typeMap[colDef?.type ?? 'text']})`,\n };\n });\n\n if (columnsToAdd.length > 0) {\n await table.addColumns(columnsToAdd);\n this.logger?.info?.(`Added columns [${columnsToAdd.map(c => c.name).join(', ')}] to table ${tableName}`);\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_ALTER_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for clearTable.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CLEAR_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n\n // delete function always takes a predicate as an argument, so we use '1=1' to delete all records because it is always true.\n await table.delete('1=1');\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async insert({ tableName, record }: { tableName: string; record: Record<string, any> }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for insert.');\n }\n if (!record || Object.keys(record).length === 0) {\n throw new Error('record is required and cannot be empty for insert.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_INSERT_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n\n const primaryId = getPrimaryKeys(tableName as TABLE_NAMES);\n\n const processedRecord = { ...record };\n\n for (const key in processedRecord) {\n if (\n processedRecord[key] !== null &&\n typeof processedRecord[key] === 'object' &&\n !(processedRecord[key] instanceof Date)\n ) {\n this.logger.debug('Converting object to JSON string: ', processedRecord[key]);\n processedRecord[key] = JSON.stringify(processedRecord[key]);\n }\n }\n console.info(await table.schema());\n\n await table.mergeInsert(primaryId).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([processedRecord]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: string; records: Record<string, any>[] }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for batchInsert.');\n }\n if (!records || records.length === 0) {\n throw new Error('records array is required and cannot be empty for batchInsert.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_BATCH_INSERT_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n\n const primaryId = getPrimaryKeys(tableName as TABLE_NAMES);\n\n const processedRecords = records.map(record => {\n const processedRecord = { ...record };\n\n // Convert values based on schema type\n for (const key in processedRecord) {\n // Skip null/undefined values\n if (processedRecord[key] == null) continue;\n\n if (\n processedRecord[key] !== null &&\n typeof processedRecord[key] === 'object' &&\n !(processedRecord[key] instanceof Date)\n ) {\n processedRecord[key] = JSON.stringify(processedRecord[key]);\n }\n }\n\n return processedRecord;\n });\n\n await table.mergeInsert(primaryId).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(processedRecords);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<any> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for load.');\n }\n if (!keys || Object.keys(keys).length === 0) {\n throw new Error('keys are required and cannot be empty for load.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_LOAD_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n const tableSchema = await getTableSchema({ tableName, client: this.client });\n const query = table.query();\n\n // Build filter condition with 'and' between all conditions\n if (Object.keys(keys).length > 0) {\n // Validate key types against schema\n validateKeyTypes(keys, tableSchema);\n\n const filterConditions = Object.entries(keys)\n .map(([key, value]) => {\n // Check if key is in camelCase and wrap it in backticks if it is\n const isCamelCase = /^[a-z][a-zA-Z]*$/.test(key) && /[A-Z]/.test(key);\n const quotedKey = isCamelCase ? `\\`${key}\\`` : key;\n\n // Handle different types appropriately\n if (typeof value === 'string') {\n return `${quotedKey} = '${value}'`;\n } else if (value === null) {\n return `${quotedKey} IS NULL`;\n } else {\n // For numbers, booleans, etc.\n return `${quotedKey} = ${value}`;\n }\n })\n .join(' AND ');\n\n this.logger.debug('where clause generated: ' + filterConditions);\n query.where(filterConditions);\n }\n\n const result = await query.limit(1).toArray();\n\n if (result.length === 0) {\n this.logger.debug('No record found');\n return null;\n }\n // Process the result with type conversions\n return processResultWithTypeConversion(result[0], tableSchema);\n } catch (error: any) {\n // If it's already a MastraError (e.g. from validateKeyTypes if we change it later), rethrow\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, keyCount: Object.keys(keys).length, firstKey: Object.keys(keys)[0] ?? '' },\n },\n error,\n );\n }\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport { ScoresStorage, TABLE_SCORERS, calculatePagination, normalizePerPage } from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport { getTableSchema, processResultWithTypeConversion } from '../utils';\n\nexport class StoreScoresLance extends ScoresStorage {\n private client: Connection;\n constructor({ client }: { client: Connection }) {\n super();\n this.client = client;\n }\n\n async saveScore(score: ScoreRowData): Promise<{ score: ScoreRowData }> {\n let validatedScore: ValidatedSaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_SAVE_SCORE_FAILED',\n text: 'Failed to save score in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n try {\n const id = crypto.randomUUID();\n const table = await this.client.openTable(TABLE_SCORERS);\n // Fetch schema fields for mastra_scorers\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const allowedFields = new Set(schema.fields.map((f: any) => f.name));\n // Filter out fields not in schema\n const filteredScore: Record<string, any> = {};\n (Object.keys(validatedScore) as (keyof ScoreRowData)[]).forEach(key => {\n if (allowedFields.has(key)) {\n filteredScore[key] = score[key];\n }\n });\n // Convert any object fields to JSON strings for storage\n for (const key in filteredScore) {\n if (\n filteredScore[key] !== null &&\n typeof filteredScore[key] === 'object' &&\n !(filteredScore[key] instanceof Date)\n ) {\n filteredScore[key] = JSON.stringify(filteredScore[key]);\n }\n }\n\n filteredScore.id = id;\n await table.add([filteredScore], { mode: 'append' });\n return { score };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_SAVE_SCORE_FAILED',\n text: 'Failed to save score in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const table = await this.client.openTable(TABLE_SCORERS);\n\n const query = table.query().where(`id = '${id}'`).limit(1);\n\n const records = await query.toArray();\n\n if (records.length === 0) return null;\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n return processResultWithTypeConversion(records[0], schema) as ScoreRowData;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORE_BY_ID_FAILED',\n text: 'Failed to get score by id in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n let query = table.query().where(`\\`scorerId\\` = '${scorerId}'`);\n\n if (source) {\n query = query.where(`\\`source\\` = '${source}'`);\n }\n\n if (entityId) {\n query = query.where(`\\`entityId\\` = '${entityId}'`);\n }\n if (entityType) {\n query = query.where(`\\`entityType\\` = '${entityType}'`);\n }\n\n // Get total count first\n let totalQuery = table.query().where(`\\`scorerId\\` = '${scorerId}'`);\n if (source) {\n totalQuery = totalQuery.where(`\\`source\\` = '${source}'`);\n }\n if (entityId) {\n totalQuery = totalQuery.where(`\\`entityId\\` = '${entityId}'`);\n }\n if (entityType) {\n totalQuery = totalQuery.where(`\\`entityType\\` = '${entityType}'`);\n }\n const allRecords = await totalQuery.toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // For perPage: false, don't use limit/offset, just get all records\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const scores = processResultWithTypeConversion(records, schema) as ScoreRowData[];\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_SCORER_ID_FAILED',\n text: 'Failed to get scores by scorerId in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n // Get total count for pagination\n const allRecords = await table.query().where(`\\`runId\\` = '${runId}'`).toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Query for scores with the given runId\n let query = table.query().where(`\\`runId\\` = '${runId}'`);\n\n // For perPage: false, don't use limit/offset\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const scores = processResultWithTypeConversion(records, schema) as ScoreRowData[];\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_RUN_ID_FAILED',\n text: 'Failed to get scores by runId in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n // Get total count for pagination\n const allRecords = await table\n .query()\n .where(`\\`entityId\\` = '${entityId}' AND \\`entityType\\` = '${entityType}'`)\n .toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Query for scores with the given entityId and entityType\n let query = table.query().where(`\\`entityId\\` = '${entityId}' AND \\`entityType\\` = '${entityType}'`);\n\n // For perPage: false, don't use limit/offset\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const scores = processResultWithTypeConversion(records, schema) as ScoreRowData[];\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_ENTITY_ID_FAILED',\n text: 'Failed to get scores by entityId and entityType in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n // Get total count for pagination\n const allRecords = await table.query().where(`\\`traceId\\` = '${traceId}' AND \\`spanId\\` = '${spanId}'`).toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Query for scores with the given traceId and spanId\n let query = table.query().where(`\\`traceId\\` = '${traceId}' AND \\`spanId\\` = '${spanId}'`);\n\n // For perPage: false, don't use limit/offset\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const scores = processResultWithTypeConversion(records, schema) as ScoreRowData[];\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_SPAN_FAILED',\n text: 'Failed to get scores by traceId and spanId in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { WorkflowRun, StorageListWorkflowRunsInput, WorkflowRuns } from '@mastra/core/storage';\nimport { ensureDate, normalizePerPage, TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\n\nfunction parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n resourceId: row.resourceId,\n };\n}\n\nexport class StoreWorkflowsLance extends WorkflowsStorage {\n client: Connection;\n constructor({ client }: { client: Connection }) {\n super();\n this.client = client;\n }\n\n updateWorkflowResults(\n {\n // workflowName,\n // runId,\n // stepId,\n // result,\n // requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n\n // Try to find the existing record\n const query = table.query().where(`workflow_name = '${workflowName}' AND run_id = '${runId}'`);\n const records = await query.toArray();\n let createdAt: number;\n const now = Date.now();\n\n if (records.length > 0) {\n createdAt = records[0].createdAt ?? now;\n } else {\n createdAt = now;\n }\n\n const { status, value, ...rest } = snapshot;\n\n const record = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify({ status, value, ...rest }), // this is to ensure status is always just before value, for when querying the db by status\n createdAt,\n updatedAt: now,\n };\n\n await table\n .mergeInsert(['workflow_name', 'run_id'])\n .whenMatchedUpdateAll()\n .whenNotMatchedInsertAll()\n .execute([record]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_PERSIST_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n const query = table.query().where(`workflow_name = '${workflowName}' AND run_id = '${runId}'`);\n const records = await query.toArray();\n return records.length > 0 ? JSON.parse(records[0].snapshot) : null;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LOAD_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<{\n workflowName: string;\n runId: string;\n snapshot: any;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n let whereClause = `run_id = '${args.runId}'`;\n if (args.workflowName) {\n whereClause += ` AND workflow_name = '${args.workflowName}'`;\n }\n const query = table.query().where(whereClause);\n const records = await query.toArray();\n if (records.length === 0) return null;\n const record = records[0];\n return parseWorkflowRun(record);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: args.runId, workflowName: args.workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n\n let query = table.query();\n\n const conditions: string[] = [];\n\n if (args?.workflowName) {\n conditions.push(`workflow_name = '${args.workflowName.replace(/'/g, \"''\")}'`);\n }\n\n if (args?.status) {\n const escapedStatus = args.status\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"''\")\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_');\n // Note: Using LIKE pattern since LanceDB doesn't support JSON extraction on string columns\n // The pattern ensures we match the workflow status (which appears before \"value\") and not step status\n conditions.push(`\\`snapshot\\` LIKE '%\"status\":\"${escapedStatus}\",\"value\"%'`);\n }\n\n if (args?.resourceId) {\n conditions.push(`\\`resourceId\\` = '${args.resourceId}'`);\n }\n\n if (args?.fromDate instanceof Date) {\n conditions.push(`\\`createdAt\\` >= ${args.fromDate.getTime()}`);\n }\n\n if (args?.toDate instanceof Date) {\n conditions.push(`\\`createdAt\\` <= ${args.toDate.getTime()}`);\n }\n\n let total = 0;\n\n // Apply all conditions\n if (conditions.length > 0) {\n query = query.where(conditions.join(' AND '));\n total = await table.countRows(conditions.join(' AND '));\n } else {\n total = await table.countRows();\n }\n\n if (args?.perPage !== undefined && args?.page !== undefined) {\n const normalizedPerPage = normalizePerPage(args.perPage, Number.MAX_SAFE_INTEGER);\n\n if (args.page < 0 || !Number.isInteger(args.page)) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_INVALID_PAGINATION_PARAMS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page: args.page, perPage: args.perPage },\n },\n new Error(`Invalid pagination parameters: page=${args.page}, perPage=${args.perPage}`),\n );\n }\n const offset = args.page * normalizedPerPage;\n query.limit(normalizedPerPage);\n query.offset(offset);\n }\n\n const records = await query.toArray();\n\n return {\n runs: records.map(record => parseWorkflowRun(record)),\n total: total || records.length,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LIST_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: args?.resourceId ?? '', workflowName: args?.workflowName ?? '' },\n },\n error,\n );\n }\n }\n}\n","import { connect } from '@lancedb/lancedb';\nimport type { Connection, ConnectionOptions } from '@lancedb/lancedb';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n TABLE_NAMES,\n PaginationInfo,\n StorageColumn,\n WorkflowRuns,\n StoragePagination,\n StorageDomains,\n StorageResourceType,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { StoreMemoryLance } from './domains/memory';\nimport { StoreOperationsLance } from './domains/operations';\nimport { StoreScoresLance } from './domains/scores';\nimport { StoreWorkflowsLance } from './domains/workflows';\n\nexport class LanceStorage extends MastraStorage {\n stores: StorageDomains;\n private lanceClient!: Connection;\n /**\n * Creates a new instance of LanceStorage\n * @param id The unique identifier for this storage instance\n * @param name The name for this storage instance\n * @param uri The URI to connect to LanceDB\n * @param options connection options\n *\n * Usage:\n *\n * Connect to a local database\n * ```ts\n * const store = await LanceStorage.create('my-storage-id', 'MyStorage', '/path/to/db');\n * ```\n *\n * Connect to a LanceDB cloud database\n * ```ts\n * const store = await LanceStorage.create('my-storage-id', 'MyStorage', 'db://host:port');\n * ```\n *\n * Connect to a cloud database\n * ```ts\n * const store = await LanceStorage.create('my-storage-id', 'MyStorage', 's3://bucket/db', { storageOptions: { timeout: '60s' } });\n * ```\n */\n public static async create(\n id: string,\n name: string,\n uri: string,\n options?: ConnectionOptions,\n ): Promise<LanceStorage> {\n const instance = new LanceStorage(id, name);\n try {\n instance.lanceClient = await connect(uri, options);\n const operations = new StoreOperationsLance({ client: instance.lanceClient });\n instance.stores = {\n operations: new StoreOperationsLance({ client: instance.lanceClient }),\n workflows: new StoreWorkflowsLance({ client: instance.lanceClient }),\n scores: new StoreScoresLance({ client: instance.lanceClient }),\n memory: new StoreMemoryLance({ client: instance.lanceClient, operations }),\n };\n return instance;\n } catch (e: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to connect to LanceDB: ${e.message || e}`,\n details: { uri, optionsProvided: !!options },\n },\n e,\n );\n }\n }\n\n /**\n * @internal\n * Private constructor to enforce using the create factory method\n */\n private constructor(id: string, name: string) {\n super({ id, name });\n const operations = new StoreOperationsLance({ client: this.lanceClient });\n\n this.stores = {\n operations: new StoreOperationsLance({ client: this.lanceClient }),\n workflows: new StoreWorkflowsLance({ client: this.lanceClient }),\n scores: new StoreScoresLance({ client: this.lanceClient }),\n memory: new StoreMemoryLance({ client: this.lanceClient, operations }),\n };\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n return this.stores.operations.createTable({ tableName, schema });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ tableName });\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n return this.stores.operations.alterTable({ tableName, schema, ifNotExists });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert({ tableName, record });\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert({ tableName, records });\n }\n\n async load({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<any> {\n return this.stores.operations.load({ tableName, keys });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n /**\n * Saves a thread to the database. This function doesn't overwrite existing threads.\n * @param thread - The thread to save\n * @returns The saved thread\n */\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n return this.stores.memory.saveThread({ thread });\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n return this.stores.memory.updateThread({ id, title, metadata });\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n return this.stores.memory.deleteThread({ threadId });\n }\n\n public get supports() {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: true,\n createTable: true,\n deleteMessages: false,\n listScoresBySpan: true,\n };\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n return this.stores.memory.getResourceById({ resourceId });\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n return this.stores.memory.saveResource({ resource });\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n return this.stores.memory.updateResource({ resourceId, workingMemory, metadata });\n }\n\n /**\n * Processes messages to include context messages based on withPreviousMessages and withNextMessages\n * @param records - The sorted array of records to process\n * @param include - The array of include specifications with context parameters\n * @returns The processed array with context messages included\n */\n private processMessagesWithContext(\n records: any[],\n include: { id: string; withPreviousMessages?: number; withNextMessages?: number }[],\n ): any[] {\n const messagesWithContext = include.filter(item => item.withPreviousMessages || item.withNextMessages);\n\n if (messagesWithContext.length === 0) {\n return records;\n }\n\n // Create a map of message id to index in the sorted array for quick lookup\n const messageIndexMap = new Map<string, number>();\n records.forEach((message, index) => {\n messageIndexMap.set(message.id, index);\n });\n\n // Keep track of additional indices to include\n const additionalIndices = new Set<number>();\n\n for (const item of messagesWithContext) {\n const messageIndex = messageIndexMap.get(item.id);\n\n if (messageIndex !== undefined) {\n // Add previous messages if requested\n if (item.withPreviousMessages) {\n const startIdx = Math.max(0, messageIndex - item.withPreviousMessages);\n for (let i = startIdx; i < messageIndex; i++) {\n additionalIndices.add(i);\n }\n }\n\n // Add next messages if requested\n if (item.withNextMessages) {\n const endIdx = Math.min(records.length - 1, messageIndex + item.withNextMessages);\n for (let i = messageIndex + 1; i <= endIdx; i++) {\n additionalIndices.add(i);\n }\n }\n }\n }\n\n // If we need to include additional messages, create a new set of records\n if (additionalIndices.size === 0) {\n return records;\n }\n\n // Get IDs of the records that matched the original query\n const originalMatchIds = new Set(include.map(item => item.id));\n\n // Create a set of all indices we need to include\n const allIndices = new Set<number>();\n\n // Add indices of originally matched messages\n records.forEach((record, index) => {\n if (originalMatchIds.has(record.id)) {\n allIndices.add(index);\n }\n });\n\n // Add the additional context message indices\n additionalIndices.forEach(index => {\n allIndices.add(index);\n });\n\n // Create a new filtered array with only the required messages\n // while maintaining chronological order\n return Array.from(allIndices)\n .sort((a, b) => a - b)\n .map(index => records[index]);\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.listMessagesById({ messageIds });\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.saveMessages(args);\n }\n\n async updateMessages(_args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n return this.stores.memory.updateMessages(_args);\n }\n\n async listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<{\n workflowName: string;\n runId: string;\n snapshot: any;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.stores.workflows.getWorkflowRunById(args);\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, requestContext });\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n }): Promise<WorkflowRunState | undefined> {\n return this.stores.workflows.updateWorkflowState({ workflowName, runId, opts });\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot({ workflowName, runId });\n }\n\n async getScoreById({ id: _id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id: _id });\n }\n\n async listScoresByScorerId({\n scorerId,\n source,\n entityId,\n entityType,\n pagination,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n source?: ScoringSource;\n entityId?: string;\n entityType?: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByScorerId({ scorerId, source, pagination, entityId, entityType });\n }\n\n async saveScore(_score: ScoreRowData): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(_score);\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByRunId({ runId, pagination });\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByEntityId({ entityId, entityType, pagination });\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresBySpan({ traceId, spanId, pagination });\n }\n}\n","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\ntype LanceOperatorValueMap = OperatorValueMap & {\n $like: string;\n $notLike: string;\n $contains: string;\n};\n\ntype LanceBlacklisted = BlacklistedRootOperators | '$like' | '$notLike' | '$contains';\n\nexport type LanceVectorFilter = VectorFilter<\n keyof LanceOperatorValueMap,\n LanceOperatorValueMap,\n LogicalOperatorValueMap,\n LanceBlacklisted\n>;\n\nexport class LanceFilterTranslator extends BaseFilterTranslator<LanceVectorFilter, string> {\n translate(filter: LanceVectorFilter): string {\n if (!filter || Object.keys(filter).length === 0) {\n return '';\n }\n\n // Check for fields with periods that aren't nested at top level\n if (typeof filter === 'object' && filter !== null) {\n const keys = Object.keys(filter);\n for (const key of keys) {\n if (key.includes('.') && !this.isNormalNestedField(key)) {\n throw new Error(`Field names containing periods (.) are not supported: ${key}`);\n }\n }\n }\n\n return this.processFilter(filter);\n }\n\n private processFilter(filter: unknown, parentPath = ''): string {\n // Handle null case\n if (filter === null) {\n return `${parentPath} IS NULL`;\n }\n\n // Handle Date objects at top level\n if (filter instanceof Date) {\n return `${parentPath} = ${this.formatValue(filter)}`;\n }\n\n // Handle top-level operators\n if (typeof filter === 'object' && filter !== null) {\n const obj = filter as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle logical operators at top level\n if (keys.length === 1 && this.isOperator(keys[0]!)) {\n const operator = keys[0]!;\n const operatorValue = obj[operator];\n\n if (this.isLogicalOperator(operator)) {\n if (operator === '$and' || operator === '$or') {\n return this.processLogicalOperator(operator, operatorValue as unknown[]);\n }\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(operator));\n }\n\n throw new Error(BaseFilterTranslator.ErrorMessages.INVALID_TOP_LEVEL_OPERATOR(operator));\n }\n\n // Check for fields with periods that aren't nested\n for (const key of keys) {\n if (key.includes('.') && !this.isNormalNestedField(key)) {\n throw new Error(`Field names containing periods (.) are not supported: ${key}`);\n }\n }\n\n // Handle multiple fields (implicit AND)\n if (keys.length > 1) {\n const conditions = keys.map(key => {\n const value = obj[key];\n // Check if key is a nested path or a field\n if (this.isNestedObject(value) && !this.isDateObject(value)) {\n return this.processNestedObject(key, value);\n } else {\n return this.processField(key, value);\n }\n });\n return conditions.join(' AND ');\n }\n\n // Handle single field\n if (keys.length === 1) {\n const key = keys[0]!;\n const value = obj[key]!;\n\n if (this.isNestedObject(value) && !this.isDateObject(value)) {\n return this.processNestedObject(key!, value);\n } else {\n return this.processField(key!, value);\n }\n }\n }\n\n return '';\n }\n\n private processLogicalOperator(operator: string, conditions: unknown[]): string {\n if (!Array.isArray(conditions)) {\n throw new Error(`Logical operator ${operator} must have an array value`);\n }\n\n if (conditions.length === 0) {\n return operator === '$and' ? 'true' : 'false';\n }\n\n const sqlOperator = operator === '$and' ? 'AND' : 'OR';\n\n const processedConditions = conditions.map(condition => {\n if (typeof condition !== 'object' || condition === null) {\n throw new Error(BaseFilterTranslator.ErrorMessages.INVALID_LOGICAL_OPERATOR_CONTENT(operator));\n }\n\n // Check if condition is a nested logical operator\n const condObj = condition as Record<string, unknown>;\n const keys = Object.keys(condObj);\n\n if (keys.length === 1 && this.isOperator(keys[0]!)) {\n if (this.isLogicalOperator(keys[0])) {\n return `(${this.processLogicalOperator(keys[0], condObj[keys[0]] as unknown[])})`;\n } else {\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(keys[0]));\n }\n }\n\n // Handle multiple fields within a logical condition (implicit AND)\n if (keys.length > 1) {\n return `(${this.processFilter(condition)})`;\n }\n\n return this.processFilter(condition);\n });\n\n return processedConditions.join(` ${sqlOperator} `);\n }\n\n private processNestedObject(path: string, value: unknown): string {\n if (typeof value !== 'object' || value === null) {\n throw new Error(`Expected object for nested path ${path}`);\n }\n\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle empty object\n if (keys.length === 0) {\n return `${path} = {}`;\n }\n\n // Handle operators on a field\n if (keys.every(k => this.isOperator(k))) {\n return this.processOperators(path, obj);\n }\n\n // Process each nested field and join with AND\n const conditions = keys.map(key => {\n const nestedPath = key.includes('.')\n ? `${path}.${key}` // Key already contains dots (pre-dotted path)\n : `${path}.${key}`; // Normal nested field\n\n if (this.isNestedObject(obj[key]) && !this.isDateObject(obj[key])) {\n return this.processNestedObject(nestedPath, obj[key]);\n } else {\n return this.processField(nestedPath, obj[key]);\n }\n });\n\n return conditions.join(' AND ');\n }\n\n private processField(field: string, value: unknown): string {\n // Check for illegal field names\n if (field.includes('.') && !this.isNormalNestedField(field)) {\n throw new Error(`Field names containing periods (.) are not supported: ${field}`);\n }\n\n // Escape field name if needed\n const escapedField = this.escapeFieldName(field);\n\n // Handle null value\n if (value === null) {\n return `${escapedField} IS NULL`;\n }\n\n // Handle Date objects properly\n if (value instanceof Date) {\n return `${escapedField} = ${this.formatValue(value)}`;\n }\n\n // Handle arrays (convert to IN)\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return 'false'; // Empty array is usually false in SQL\n }\n const normalizedValues = this.normalizeArrayValues(value);\n return `${escapedField} IN (${this.formatArrayValues(normalizedValues)})`;\n }\n\n // Handle operator objects\n if (this.isOperatorObject(value)) {\n return this.processOperators(field, value as Record<string, unknown>);\n }\n\n // Handle basic values (normalize dates and other special values)\n return `${escapedField} = ${this.formatValue(this.normalizeComparisonValue(value))}`;\n }\n\n private processOperators(field: string, operators: Record<string, unknown>): string {\n const escapedField = this.escapeFieldName(field);\n const operatorKeys = Object.keys(operators);\n\n // Check for logical operators at field level\n if (operatorKeys.some(op => this.isLogicalOperator(op))) {\n const logicalOp = operatorKeys.find(op => this.isLogicalOperator(op)) || '';\n throw new Error(`Unsupported operator: ${logicalOp} cannot be used at field level`);\n }\n\n // Process each operator and join with AND\n return operatorKeys\n .map(op => {\n const value = operators[op];\n\n // Check if this is a supported operator\n if (!this.isFieldOperator(op) && !this.isCustomOperator(op)) {\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(op));\n }\n\n switch (op) {\n case '$eq':\n if (value === null) {\n return `${escapedField} IS NULL`;\n }\n return `${escapedField} = ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$ne':\n if (value === null) {\n return `${escapedField} IS NOT NULL`;\n }\n return `${escapedField} != ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$gt':\n return `${escapedField} > ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$gte':\n return `${escapedField} >= ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$lt':\n return `${escapedField} < ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$lte':\n return `${escapedField} <= ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$in':\n if (!Array.isArray(value)) {\n throw new Error(`$in operator requires array value for field: ${field}`);\n }\n if (value.length === 0) {\n return 'false'; // Empty IN is false\n }\n const normalizedValues = this.normalizeArrayValues(value);\n return `${escapedField} IN (${this.formatArrayValues(normalizedValues)})`;\n case '$like':\n return `${escapedField} LIKE ${this.formatValue(value)}`;\n case '$notLike':\n return `${escapedField} NOT LIKE ${this.formatValue(value)}`;\n case '$regex':\n return `regexp_match(${escapedField}, ${this.formatValue(value)})`;\n default:\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(op));\n }\n })\n .join(' AND ');\n }\n\n private formatValue(value: unknown): string {\n if (value === null) {\n return 'NULL';\n }\n\n if (typeof value === 'string') {\n // Escape single quotes in SQL strings by doubling them\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return `timestamp '${value.toISOString()}'`;\n }\n\n if (typeof value === 'object') {\n if (value instanceof Date) {\n return `timestamp '${value.toISOString()}'`;\n }\n return JSON.stringify(value);\n }\n\n return String(value);\n }\n\n private formatArrayValues(array: unknown[]): string {\n return array.map(item => this.formatValue(item)).join(', ');\n }\n\n normalizeArrayValues(array: unknown[]): unknown[] {\n return array.map(item => {\n if (item instanceof Date) {\n return item; // Keep Date objects as is to properly format them later\n }\n return this.normalizeComparisonValue(item);\n });\n }\n\n normalizeComparisonValue(value: unknown): unknown {\n // Date objects should be preserved as is, not converted to strings\n if (value instanceof Date) {\n return value;\n }\n\n return super.normalizeComparisonValue(value);\n }\n\n private isOperatorObject(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n return keys.length > 0 && keys.some(key => this.isOperator(key));\n }\n\n private isNestedObject(value: unknown): boolean {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private isNormalNestedField(field: string): boolean {\n // Check if field is a proper nested field name\n const parts = field.split('.');\n // A valid nested field shouldn't have empty parts or start/end with a dot\n return !field.startsWith('.') && !field.endsWith('.') && parts.every(part => part.trim().length > 0);\n }\n\n private escapeFieldName(field: string): string {\n // If field contains special characters or is a SQL keyword, escape with backticks\n if (field.includes(' ') || field.includes('-') || /^[A-Z]+$/.test(field) || this.isSqlKeyword(field)) {\n // For nested fields, escape each part\n if (field.includes('.')) {\n return field\n .split('.')\n .map(part => `\\`${part}\\``)\n .join('.');\n }\n return `\\`${field}\\``;\n }\n\n return field;\n }\n\n private isSqlKeyword(str: string): boolean {\n // Common SQL keywords that might need escaping\n const sqlKeywords = [\n 'SELECT',\n 'FROM',\n 'WHERE',\n 'AND',\n 'OR',\n 'NOT',\n 'INSERT',\n 'UPDATE',\n 'DELETE',\n 'CREATE',\n 'ALTER',\n 'DROP',\n 'TABLE',\n 'VIEW',\n 'INDEX',\n 'JOIN',\n 'INNER',\n 'OUTER',\n 'LEFT',\n 'RIGHT',\n 'FULL',\n 'UNION',\n 'ALL',\n 'DISTINCT',\n 'AS',\n 'ON',\n 'BETWEEN',\n 'LIKE',\n 'IN',\n 'IS',\n 'NULL',\n 'TRUE',\n 'FALSE',\n 'ASC',\n 'DESC',\n 'GROUP',\n 'ORDER',\n 'BY',\n 'HAVING',\n 'LIMIT',\n 'OFFSET',\n 'CASE',\n 'WHEN',\n 'THEN',\n 'ELSE',\n 'END',\n 'CAST',\n 'CUBE',\n ];\n\n return sqlKeywords.includes(str.toUpperCase());\n }\n\n private isDateObject(value: unknown): boolean {\n return value instanceof Date;\n }\n\n /**\n * Override getSupportedOperators to add custom operators for LanceDB\n */\n protected override getSupportedOperators() {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n custom: ['$like', '$notLike', '$regex'],\n };\n }\n}\n","import { connect, Index } from '@lancedb/lancedb';\nimport type { Connection, ConnectionOptions, CreateTableOptions, Table, TableLike } from '@lancedb/lancedb';\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n QueryVectorParams,\n UpdateVectorParams,\n UpsertVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\n\nimport { MastraVector } from '@mastra/core/vector';\nimport type { LanceVectorFilter } from './filter';\nimport { LanceFilterTranslator } from './filter';\nimport type { IndexConfig } from './types';\n\ninterface LanceCreateIndexParams extends CreateIndexParams {\n indexConfig?: LanceIndexConfig;\n tableName?: string;\n}\n\ninterface LanceIndexConfig extends IndexConfig {\n numPartitions?: number;\n numSubVectors?: number;\n}\n\ninterface LanceUpsertVectorParams extends UpsertVectorParams {\n tableName: string;\n}\n\ninterface LanceQueryVectorParams extends QueryVectorParams<LanceVectorFilter> {\n tableName: string;\n columns?: string[];\n includeAllColumns?: boolean;\n}\n\nexport class LanceVectorStore extends MastraVector<LanceVectorFilter> {\n private lanceClient!: Connection;\n\n /**\n * Creates a new instance of LanceVectorStore\n * @param uri The URI to connect to LanceDB\n * @param options connection options\n *\n * Usage:\n *\n * Connect to a local database\n * ```ts\n * const store = await LanceVectorStore.create('/path/to/db');\n * ```\n *\n * Connect to a LanceDB cloud database\n * ```ts\n * const store = await LanceVectorStore.create('db://host:port');\n * ```\n *\n * Connect to a cloud database\n * ```ts\n * const store = await LanceVectorStore.create('s3://bucket/db', { storageOptions: { timeout: '60s' } });\n * ```\n */\n public static async create(uri: string, options?: ConnectionOptions & { id: string }): Promise<LanceVectorStore> {\n const instance = new LanceVectorStore(options?.id || crypto.randomUUID());\n try {\n instance.lanceClient = await connect(uri, options);\n return instance;\n } catch (e) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { uri },\n },\n e,\n );\n }\n }\n\n /**\n * @internal\n * Private constructor to enforce using the create factory method\n */\n private constructor(id: string) {\n super({ id });\n }\n\n close() {\n if (this.lanceClient) {\n this.lanceClient.close();\n }\n }\n\n async query({\n tableName,\n queryVector,\n filter,\n includeVector = false,\n topK = 10,\n columns = [],\n includeAllColumns = false,\n }: LanceQueryVectorParams): Promise<QueryResult[]> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!tableName) {\n throw new Error('tableName is required');\n }\n\n if (!queryVector) {\n throw new Error('queryVector is required');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_QUERY_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n },\n error,\n );\n }\n\n try {\n // Open the table\n const table = await this.lanceClient.openTable(tableName);\n\n // Prepare the list of columns to select\n const selectColumns = [...columns];\n if (!selectColumns.includes('id')) {\n selectColumns.push('id');\n }\n\n // Create the query builder\n let query = table.search(queryVector);\n\n // Add filter if provided\n if (filter && Object.keys(filter).length > 0) {\n const whereClause = this.filterTranslator(filter);\n this.logger.debug(`Where clause generated: ${whereClause}`);\n query = query.where(whereClause);\n }\n\n // Apply column selection and limit\n if (!includeAllColumns && selectColumns.length > 0) {\n query = query.select(selectColumns);\n }\n query = query.limit(topK);\n\n // Execute the query\n const results = await query.toArray();\n\n return results.map(result => {\n // Collect all metadata_ prefixed fields\n const flatMetadata: Record<string, any> = {};\n\n // Get all keys from the result object\n Object.keys(result).forEach(key => {\n // Skip reserved keys (id, score, and the vector column)\n if (key !== 'id' && key !== 'score' && key !== 'vector' && key !== '_distance') {\n if (key.startsWith('metadata_')) {\n // Remove the prefix and add to flat metadata\n const metadataKey = key.substring('metadata_'.length);\n flatMetadata[metadataKey] = result[key];\n }\n }\n });\n\n // Reconstruct nested metadata object\n const metadata = this.unflattenObject(flatMetadata);\n\n return {\n id: String(result.id || ''),\n metadata,\n vector:\n includeVector && result.vector\n ? Array.isArray(result.vector)\n ? result.vector\n : Array.from(result.vector as any[])\n : undefined,\n document: result.document,\n score: result._distance,\n };\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, includeVector, columnsCount: columns?.length, includeAllColumns },\n },\n error,\n );\n }\n }\n\n private filterTranslator(filter: LanceVectorFilter): string {\n // Add metadata_ prefix to filter keys if they don't already have it\n const processFilterKeys = (filterObj: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n Object.entries(filterObj).forEach(([key, value]) => {\n // Don't add prefix to logical operators\n if (key === '$or' || key === '$and' || key === '$not' || key === '$in') {\n // For logical operators, process their array contents\n if (Array.isArray(value)) {\n result[key] = value.map(item =>\n typeof item === 'object' && item !== null ? processFilterKeys(item as Record<string, any>) : item,\n );\n } else {\n result[key] = value;\n }\n }\n // Don't add prefix if it already has metadata_ prefix\n else if (key.startsWith('metadata_')) {\n result[key] = value;\n }\n // Add metadata_ prefix to regular field keys\n else {\n // Convert dot notation to underscore notation for nested fields\n if (key.includes('.')) {\n const convertedKey = `metadata_${key.replace(/\\./g, '_')}`;\n result[convertedKey] = value;\n } else {\n result[`metadata_${key}`] = value;\n }\n }\n });\n\n return result;\n };\n\n const prefixedFilter = filter && typeof filter === 'object' ? processFilterKeys(filter as Record<string, any>) : {};\n\n const translator = new LanceFilterTranslator();\n return translator.translate(prefixedFilter);\n }\n\n async upsert({ tableName, vectors, metadata = [], ids = [] }: LanceUpsertVectorParams): Promise<string[]> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!tableName) {\n throw new Error('tableName is required');\n }\n\n if (!vectors || !Array.isArray(vectors) || vectors.length === 0) {\n throw new Error('vectors array is required and must not be empty');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_UPSERT_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n },\n error,\n );\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} does not exist`);\n }\n\n const table = await this.lanceClient.openTable(tableName);\n\n // Generate IDs if not provided\n const vectorIds = ids.length === vectors.length ? ids : vectors.map((_, i) => ids[i] || crypto.randomUUID());\n\n // Create data with metadata fields expanded at the top level\n const data = vectors.map((vector, i) => {\n const id = String(vectorIds[i]);\n const metadataItem = metadata[i] || {};\n\n // Create the base object with id and vector\n const rowData: Record<string, any> = {\n id,\n vector: vector,\n };\n\n // Flatten the metadata object and prefix all keys with 'metadata_'\n if (Object.keys(metadataItem).length > 0) {\n const flattenedMetadata = this.flattenObject(metadataItem, 'metadata');\n // Add all flattened metadata properties to the row data object\n Object.entries(flattenedMetadata).forEach(([key, value]) => {\n rowData[key] = value;\n });\n }\n\n return rowData;\n });\n\n await table.add(data, { mode: 'overwrite' });\n\n return vectorIds;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, vectorCount: vectors.length, metadataCount: metadata.length, idsCount: ids.length },\n },\n error,\n );\n }\n }\n\n /**\n * Flattens a nested object, creating new keys with underscores for nested properties.\n * Example: { metadata: { text: 'test' } } → { metadata_text: 'test' }\n */\n private flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n return Object.keys(obj).reduce((acc: Record<string, unknown>, k: string) => {\n const pre = prefix.length ? `${prefix}_` : '';\n if (typeof obj[k] === 'object' && obj[k] !== null && !Array.isArray(obj[k])) {\n Object.assign(acc, this.flattenObject(obj[k] as Record<string, unknown>, pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {});\n }\n\n async createTable(\n tableName: string,\n data: Record<string, unknown>[] | TableLike,\n options?: Partial<CreateTableOptions>,\n ): Promise<Table> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_CREATE_TABLE_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n });\n }\n\n // Flatten nested objects if data is an array of records\n if (Array.isArray(data)) {\n data = data.map(record => this.flattenObject(record));\n }\n\n try {\n return await this.lanceClient.createTable(tableName, data, options);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async listTables(): Promise<string[]> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_LIST_TABLES_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { methodName: 'listTables' },\n });\n }\n try {\n return await this.lanceClient.tableNames();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_LIST_TABLES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getTableSchema(tableName: string): Promise<any> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_GET_TABLE_SCHEMA_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n });\n }\n\n try {\n const table = await this.lanceClient.openTable(tableName);\n return await table.schema();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_GET_TABLE_SCHEMA_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * indexName is actually a column name in a table in lanceDB\n */\n async createIndex({\n tableName,\n indexName,\n dimension,\n metric = 'cosine',\n indexConfig = {},\n }: LanceCreateIndexParams): Promise<void> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!tableName) {\n throw new Error('tableName is required');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n if (typeof dimension !== 'number' || dimension <= 0) {\n throw new Error('dimension must be a positive number');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CREATE_INDEX_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { tableName: tableName || '', indexName, dimension, metric },\n },\n err,\n );\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n if (!tables.includes(tableName)) {\n throw new Error(\n `Table ${tableName} does not exist. Please create the table first by calling createTable() method.`,\n );\n }\n\n const table = await this.lanceClient.openTable(tableName);\n\n // Convert metric to LanceDB metric\n type LanceMetric = 'cosine' | 'l2' | 'dot';\n let metricType: LanceMetric | undefined;\n if (metric === 'euclidean') {\n metricType = 'l2';\n } else if (metric === 'dotproduct') {\n metricType = 'dot';\n } else if (metric === 'cosine') {\n metricType = 'cosine';\n }\n\n if (indexConfig.type === 'ivfflat') {\n await table.createIndex(indexName, {\n config: Index.ivfPq({\n numPartitions: indexConfig.numPartitions || 128,\n numSubVectors: indexConfig.numSubVectors || 16,\n distanceType: metricType,\n }),\n });\n } else {\n // Default to HNSW PQ index\n this.logger.debug('Creating HNSW PQ index with config:', indexConfig);\n await table.createIndex(indexName, {\n config: Index.hnswPq({\n m: indexConfig?.hnsw?.m || 16,\n efConstruction: indexConfig?.hnsw?.efConstruction || 100,\n distanceType: metricType,\n }),\n });\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName: tableName || '', indexName, dimension },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_LIST_INDEXES_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { methodName: 'listIndexes' },\n });\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n const allIndices: string[] = [];\n\n for (const tableName of tables) {\n const table = await this.lanceClient.openTable(tableName);\n const tableIndices = await table.listIndices();\n allIndices.push(...tableIndices.map(index => index.name));\n }\n\n return allIndices;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DESCRIBE_INDEX_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n err,\n );\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n const tableIndices = await table.listIndices();\n const foundIndex = tableIndices.find(index => index.name === indexName);\n\n if (foundIndex) {\n const stats = await table.indexStats(foundIndex.name);\n\n if (!stats) {\n throw new Error(`Index stats not found for index: ${indexName}`);\n }\n\n const schema = await table.schema();\n const vectorCol = foundIndex.columns[0] || 'vector';\n\n // Find the vector column in the schema\n const vectorField = schema.fields.find(field => field.name === vectorCol);\n const dimension = vectorField?.type?.['listSize'] || 0;\n\n return {\n dimension: dimension,\n metric: stats.distanceType as 'cosine' | 'euclidean' | 'dotproduct' | undefined,\n count: stats.numIndexedRows,\n };\n }\n }\n\n throw new Error(`IndexName: ${indexName} not found`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_INDEX_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n err,\n );\n }\n try {\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n const table = await this.lanceClient.openTable(tableName);\n const tableIndices = await table.listIndices();\n const foundIndex = tableIndices.find(index => index.name === indexName);\n\n if (foundIndex) {\n await table.dropIndex(indexName);\n return;\n }\n }\n\n throw new Error(`Index ${indexName} not found`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes all tables in the database\n */\n async deleteAllTables(): Promise<void> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_ALL_TABLES_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { methodName: 'deleteAllTables' },\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n });\n }\n try {\n await this.lanceClient.dropAllTables();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_ALL_TABLES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { methodName: 'deleteAllTables' },\n },\n error,\n );\n }\n }\n\n async deleteTable(tableName: string): Promise<void> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_TABLE_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { tableName },\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n });\n }\n\n try {\n await this.lanceClient.dropTable(tableName);\n } catch (error: any) {\n // throw new Error(`Failed to delete tables: ${error.message}`);\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async updateVector(params: UpdateVectorParams<LanceVectorFilter>): Promise<void> {\n const { indexName, update } = params;\n\n // Validate mutually exclusive parameters\n if ('id' in params && 'filter' in params && params.id && params.filter) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'id and filter are mutually exclusive',\n details: { indexName },\n });\n }\n\n if (!('id' in params || 'filter' in params) || (!params.id && !params.filter)) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Either id or filter must be provided',\n details: { indexName },\n });\n }\n\n if ('filter' in params && params.filter && Object.keys(params.filter).length === 0) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot update with empty filter',\n details: { indexName },\n });\n }\n\n if (!update.vector && !update.metadata) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'No updates provided',\n details: { indexName },\n });\n }\n\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n // In LanceDB, the indexName is actually a column name in a table\n // We need to find which table has this column as an index\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n\n try {\n const schema = await table.schema();\n const hasColumn = schema.fields.some(field => field.name === indexName);\n\n if (hasColumn) {\n this.logger.debug(`Found column ${indexName} in table ${tableName}`);\n\n let whereClause: string;\n if ('id' in params && params.id) {\n whereClause = `id = '${params.id}'`;\n } else if ('filter' in params && params.filter) {\n // Use filter translator to build SQL WHERE clause\n const translator = new LanceFilterTranslator();\n const processFilterKeys = (filter: Record<string, any>): Record<string, any> => {\n const processedFilter: Record<string, any> = {};\n Object.entries(filter).forEach(([key, value]) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.entries(value).forEach(([nestedKey, nestedValue]) => {\n processedFilter[`metadata_${key}_${nestedKey}`] = nestedValue;\n });\n } else {\n processedFilter[`metadata_${key}`] = value;\n }\n });\n return processedFilter;\n };\n\n const prefixedFilter = processFilterKeys(params.filter as Record<string, any>);\n whereClause = translator.translate(prefixedFilter) || '';\n\n if (!whereClause) {\n throw new Error('Failed to translate filter to SQL');\n }\n } else {\n throw new Error('Either id or filter must be provided');\n }\n\n // Query for existing records that match\n const existingRecords = await table\n .query()\n .where(whereClause)\n .select(schema.fields.map(field => field.name))\n .toArray();\n\n if (existingRecords.length === 0) {\n this.logger.info(`No records found matching criteria in table ${tableName}`);\n return;\n }\n\n // Update each matching record\n const updatedRecords = existingRecords.map(record => {\n const rowData: Record<string, any> = {};\n\n // Copy all existing field values except special fields\n Object.entries(record).forEach(([key, value]) => {\n // Skip special fields\n if (key !== '_distance') {\n // Handle vector field specially to avoid nested properties\n if (key === indexName) {\n // If we're about to update this vector anyway, use the new value\n if (update.vector) {\n rowData[key] = update.vector;\n } else {\n // Ensure vector is a plain array\n if (Array.isArray(value)) {\n rowData[key] = [...value];\n } else if (typeof value === 'object' && value !== null) {\n // Handle vector objects by converting to array if needed\n rowData[key] = Array.from(value as any[]);\n } else {\n rowData[key] = value;\n }\n }\n } else {\n rowData[key] = value;\n }\n }\n });\n\n // Apply metadata updates if provided\n if (update.metadata) {\n Object.entries(update.metadata).forEach(([key, value]) => {\n rowData[`metadata_${key}`] = value;\n });\n }\n\n return rowData;\n });\n\n // Update all records\n await table.add(updatedRecords, { mode: 'overwrite' });\n return;\n }\n } catch (err) {\n this.logger.error(`Error checking schema for table ${tableName}:` + err);\n // Continue to the next table if there's an error\n continue;\n }\n }\n\n throw new Error(`No table found with column/index '${indexName}'`);\n } catch (error: any) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...('id' in params && params.id && { id: params.id }),\n ...('filter' in params && params.filter && { filter: JSON.stringify(params.filter) }),\n hasVector: !!update.vector,\n hasMetadata: !!update.metadata,\n },\n },\n error,\n );\n }\n }\n\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n if (!id) {\n throw new Error('id is required');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTOR_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n err,\n );\n }\n\n try {\n // In LanceDB, the indexName is actually a column name in a table\n // We need to find which table has this column as an index\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n\n try {\n // Try to get the schema to check if this table has the column we're looking for\n const schema = await table.schema();\n const hasColumn = schema.fields.some(field => field.name === indexName);\n\n if (hasColumn) {\n this.logger.debug(`Found column ${indexName} in table ${tableName}`);\n await table.delete(`id = '${id}'`);\n return;\n }\n } catch (err) {\n this.logger.error(`Error checking schema for table ${tableName}:` + err);\n // Continue to the next table if there's an error\n continue;\n }\n }\n\n throw new Error(`No table found with column/index '${indexName}'`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Converts a flattened object with keys using underscore notation back to a nested object.\n * Example: { name: 'test', details_text: 'test' } → { name: 'test', details: { text: 'test' } }\n */\n private unflattenObject(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n Object.keys(obj).forEach(key => {\n const value = obj[key];\n const parts = key.split('_');\n\n // Start with the result object\n let current = result;\n\n // Process all parts except the last one\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n // Skip empty parts\n if (!part) continue;\n\n // Create nested object if it doesn't exist\n if (!current[part] || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part];\n }\n\n // Set the value at the last part\n const lastPart = parts[parts.length - 1];\n if (lastPart) {\n current[lastPart] = value;\n }\n });\n\n return result;\n }\n\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams<LanceVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (ids && filter) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'ids and filter are mutually exclusive',\n details: { indexName },\n });\n }\n\n if (!ids && !filter) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Either filter or ids must be provided',\n details: { indexName },\n });\n }\n\n // Validate non-empty arrays and objects\n if (ids && ids.length === 0) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot delete with empty ids array',\n details: { indexName },\n });\n }\n\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot delete with empty filter',\n details: { indexName },\n });\n }\n\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n // In LanceDB, the indexName is actually a column name in a table\n // We need to find which table has this column as an index\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n\n try {\n const schema = await table.schema();\n const hasColumn = schema.fields.some(field => field.name === indexName);\n\n if (hasColumn) {\n this.logger.debug(`Found column ${indexName} in table ${tableName}`);\n\n if (ids) {\n // Delete by IDs\n const idsConditions = ids.map(id => `id = '${id}'`).join(' OR ');\n await table.delete(idsConditions);\n } else if (filter) {\n // Delete by filter using SQL WHERE clause\n const translator = new LanceFilterTranslator();\n const processFilterKeys = (filter: Record<string, any>): Record<string, any> => {\n const processedFilter: Record<string, any> = {};\n Object.entries(filter).forEach(([key, value]) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.entries(value).forEach(([nestedKey, nestedValue]) => {\n processedFilter[`metadata_${key}_${nestedKey}`] = nestedValue;\n });\n } else {\n processedFilter[`metadata_${key}`] = value;\n }\n });\n return processedFilter;\n };\n\n const prefixedFilter = processFilterKeys(filter as Record<string, any>);\n const whereClause = translator.translate(prefixedFilter);\n\n if (!whereClause) {\n throw new Error('Failed to translate filter to SQL');\n }\n\n await table.delete(whereClause);\n }\n\n return;\n }\n } catch (err) {\n this.logger.error(`Error checking schema for table ${tableName}:` + err);\n // Continue to the next table if there's an error\n continue;\n }\n }\n\n throw new Error(`No table found with column/index '${indexName}'`);\n } catch (error: any) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/filter.ts","../src/vector/index.ts"],"names":["TABLE_WORKFLOW_SNAPSHOT","MastraError","ErrorDomain","ErrorCategory","error","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","MessageList","normalizePerPage","calculatePagination","threadIds","threadId","TABLE_RESOURCES","StoreOperations","Utf8","Int32","Float64","Float32","Binary","Field","Schema","ScoresStorage","saveScorePayloadSchema","TABLE_SCORERS","ensureDate","WorkflowsStorage","MastraStorage","connect","BaseFilterTranslator","filter","MastraVector","Index"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Connection, FieldLike, SchemaLike } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\n\nexport function getPrimaryKeys(tableName: TABLE_NAMES): string[] {\n let primaryId: string[] = ['id'];\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n primaryId = ['workflow_name', 'run_id'];\n }\n\n return primaryId;\n}\n\nexport function validateKeyTypes(keys: Record<string, any>, tableSchema: SchemaLike): void {\n // Create a map of field names to their expected types\n const fieldTypes = new Map(\n tableSchema.fields.map((field: any) => [field.name, field.type?.toString().toLowerCase()]),\n );\n\n for (const [key, value] of Object.entries(keys)) {\n const fieldType = fieldTypes.get(key);\n\n if (!fieldType) {\n throw new Error(`Field '${key}' does not exist in table schema`);\n }\n\n // Type validation\n if (value !== null) {\n if ((fieldType.includes('int') || fieldType.includes('bigint')) && typeof value !== 'number') {\n throw new Error(`Expected numeric value for field '${key}', got ${typeof value}`);\n }\n\n if (fieldType.includes('utf8') && typeof value !== 'string') {\n throw new Error(`Expected string value for field '${key}', got ${typeof value}`);\n }\n\n if (fieldType.includes('timestamp') && !(value instanceof Date) && typeof value !== 'string') {\n throw new Error(`Expected Date or string value for field '${key}', got ${typeof value}`);\n }\n }\n }\n}\n\nexport function processResultWithTypeConversion(\n rawResult: Record<string, any> | Record<string, any>[],\n tableSchema: SchemaLike,\n): Record<string, any> | Record<string, any>[] {\n // Build a map of field names to their schema types\n const fieldTypeMap = new Map();\n tableSchema.fields.forEach((field: any) => {\n const fieldName = field.name;\n const fieldTypeStr = field.type.toString().toLowerCase();\n fieldTypeMap.set(fieldName, fieldTypeStr);\n });\n\n // Handle array case\n if (Array.isArray(rawResult)) {\n return rawResult.map(item => processResultWithTypeConversion(item, tableSchema));\n }\n\n // Handle single record case\n const processedResult = { ...rawResult };\n\n // Convert each field according to its schema type\n for (const key in processedResult) {\n const fieldTypeStr = fieldTypeMap.get(key);\n if (!fieldTypeStr) continue;\n\n // Skip conversion for ID fields - preserve their original format\n // if (key === 'id') {\n // continue;\n // }\n\n // Only try to convert string values\n if (typeof processedResult[key] === 'string') {\n // Numeric types\n if (fieldTypeStr.includes('int32') || fieldTypeStr.includes('float32')) {\n if (!isNaN(Number(processedResult[key]))) {\n processedResult[key] = Number(processedResult[key]);\n }\n } else if (fieldTypeStr.includes('int64')) {\n processedResult[key] = Number(processedResult[key]);\n } else if (fieldTypeStr.includes('utf8') && key !== 'id') {\n try {\n const parsed = JSON.parse(processedResult[key]);\n if (typeof parsed === 'object') {\n processedResult[key] = JSON.parse(processedResult[key]);\n }\n } catch {}\n }\n } else if (typeof processedResult[key] === 'bigint') {\n // Convert BigInt values to regular numbers for application layer\n processedResult[key] = Number(processedResult[key]);\n } else if (fieldTypeStr.includes('float64') && ['createdAt', 'updatedAt'].includes(key)) {\n processedResult[key] = new Date(processedResult[key]);\n }\n }\n\n return processedResult;\n}\n\nexport async function getTableSchema({\n tableName,\n client,\n}: {\n tableName: TABLE_NAMES;\n client: Connection;\n}): Promise<SchemaLike> {\n try {\n if (!client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for getTableSchema.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_GET_TABLE_SCHEMA_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await client.openTable(tableName);\n const rawSchema = await table.schema();\n const fields = rawSchema.fields as FieldLike[];\n\n // Convert schema to SchemaLike format\n return {\n fields,\n metadata: new Map<string, string>(),\n get names() {\n return fields.map((field: FieldLike) => field.name);\n },\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_GET_TABLE_SCHEMA_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n} from '@mastra/core/storage';\nimport type { StoreOperationsLance } from '../operations';\nimport { getTableSchema, processResultWithTypeConversion } from '../utils';\n\nexport class StoreMemoryLance extends MemoryStorage {\n private client: Connection;\n private operations: StoreOperationsLance;\n constructor({ client, operations }: { client: Connection; operations: StoreOperationsLance }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n // Utility to escape single quotes in SQL strings\n private escapeSql(str: string): string {\n return str.replace(/'/g, \"''\");\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const thread = await this.operations.load({ tableName: TABLE_THREADS, keys: { id: threadId } });\n\n if (!thread) {\n return null;\n }\n\n return {\n ...thread,\n createdAt: new Date(thread.createdAt),\n updatedAt: new Date(thread.updatedAt),\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Saves a thread to the database. This function doesn't overwrite existing threads.\n * @param thread - The thread to save\n * @returns The saved thread\n */\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n const record = { ...thread, metadata: JSON.stringify(thread.metadata) };\n const table = await this.client.openTable(TABLE_THREADS);\n await table.add([record], { mode: 'append' });\n\n return thread;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const maxRetries = 5;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n // Get current state atomically\n const current = await this.getThreadById({ threadId: id });\n if (!current) {\n throw new Error(`Thread with id ${id} not found`);\n }\n\n // Merge metadata\n const mergedMetadata = { ...current.metadata, ...metadata };\n\n // Update atomically\n const record = {\n id,\n title,\n metadata: JSON.stringify(mergedMetadata),\n updatedAt: new Date().getTime(),\n };\n\n const table = await this.client.openTable(TABLE_THREADS);\n await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([record]);\n\n const updatedThread = await this.getThreadById({ threadId: id });\n if (!updatedThread) {\n throw new Error(`Failed to retrieve updated thread ${id}`);\n }\n return updatedThread;\n } catch (error: any) {\n if (error.message?.includes('Commit conflict') && attempt < maxRetries - 1) {\n // Wait with exponential backoff before retrying\n const delay = Math.pow(2, attempt) * 10; // 10ms, 20ms, 40ms\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // If it's not a commit conflict or we've exhausted retries, throw the error\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // This should never be reached, but just in case\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n new Error('All retries exhausted'),\n );\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n // Delete the thread\n const table = await this.client.openTable(TABLE_THREADS);\n await table.delete(`id = '${threadId}'`);\n\n // Delete all messages with the matching thread_id\n const messagesTable = await this.client.openTable(TABLE_MESSAGES);\n await messagesTable.delete(`thread_id = '${threadId}'`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private normalizeMessage(message: any): MastraMessageV1 | MastraDBMessage {\n const { thread_id, ...rest } = message;\n return {\n ...rest,\n threadId: thread_id,\n content:\n typeof message.content === 'string'\n ? (() => {\n try {\n return JSON.parse(message.content);\n } catch {\n return message.content;\n }\n })()\n : message.content,\n };\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n try {\n const table = await this.client.openTable(TABLE_MESSAGES);\n\n const quotedIds = messageIds.map(id => `'${id}'`).join(', ');\n const allRecords = await table.query().where(`id IN (${quotedIds})`).toArray();\n\n const messages = processResultWithTypeConversion(\n allRecords,\n await getTableSchema({ tableName: TABLE_MESSAGES, client: this.client }),\n );\n\n const list = new MessageList().add(\n messages.map(this.normalizeMessage) as (MastraMessageV1 | MastraDBMessage)[],\n 'memory',\n );\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: JSON.stringify(messageIds),\n },\n },\n error,\n );\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_LIST_MESSAGES_INVALID_THREAD_ID',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? threadId.join(',') : threadId },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n // When perPage is false (get all), ignore page offset\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_LIST_MESSAGES_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // Determine sort field and direction\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n const table = await this.client.openTable(TABLE_MESSAGES);\n\n // Build query conditions for multiple threads\n const threadCondition =\n threadIds.length === 1\n ? `thread_id = '${this.escapeSql(threadIds[0]!)}'`\n : `thread_id IN (${threadIds.map(t => `'${this.escapeSql(t)}'`).join(', ')})`;\n const conditions: string[] = [threadCondition];\n\n if (resourceId) {\n conditions.push(`\\`resourceId\\` = '${this.escapeSql(resourceId)}'`);\n }\n\n if (filter?.dateRange?.start) {\n const startTime =\n filter.dateRange.start instanceof Date\n ? filter.dateRange.start.getTime()\n : new Date(filter.dateRange.start).getTime();\n conditions.push(`\\`createdAt\\` >= ${startTime}`);\n }\n\n if (filter?.dateRange?.end) {\n const endTime =\n filter.dateRange.end instanceof Date\n ? filter.dateRange.end.getTime()\n : new Date(filter.dateRange.end).getTime();\n conditions.push(`\\`createdAt\\` <= ${endTime}`);\n }\n\n const whereClause = conditions.join(' AND ');\n\n // Get total count\n const total = await table.countRows(whereClause);\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n const query = table.query().where(whereClause);\n let allRecords = await query.toArray();\n\n // Sort records\n allRecords.sort((a, b) => {\n const aValue = field === 'createdAt' ? a.createdAt : a[field];\n const bValue = field === 'createdAt' ? b.createdAt : b[field];\n\n // Handle null/undefined - treat as \"smallest\" values\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return direction === 'ASC' ? -1 : 1;\n if (bValue == null) return direction === 'ASC' ? 1 : -1;\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'ASC' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n }\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n // Apply pagination\n const paginatedRecords = allRecords.slice(offset, offset + perPage);\n const messages: any[] = paginatedRecords.map((row: any) => this.normalizeMessage(row));\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n // Get all unique thread IDs from include items\n const threadIds = [...new Set(include.map(item => item.threadId || threadId))];\n\n // Fetch all messages from all relevant threads\n const allThreadMessages: any[] = [];\n for (const tid of threadIds) {\n const threadQuery = table.query().where(`thread_id = '${tid}'`);\n let threadRecords = await threadQuery.toArray();\n allThreadMessages.push(...threadRecords);\n }\n\n // Sort all messages by createdAt\n allThreadMessages.sort((a, b) => a.createdAt - b.createdAt);\n\n // Apply processMessagesWithContext to get included messages with context\n const contextMessages = this.processMessagesWithContext(allThreadMessages, include);\n const includedMessages = contextMessages.map((row: any) => this.normalizeMessage(row));\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includedMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(messages, 'memory');\n let finalMessages = list.get.all.db();\n\n // Sort all messages (paginated + included) for final output\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n // Handle null/undefined - treat as \"smallest\" values\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return direction === 'ASC' ? -1 : 1;\n if (bValue == null) return direction === 'ASC' ? 1 : -1;\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'ASC' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n }\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const returnedThreadMessageIds = new Set(finalMessages.filter(m => m.threadId === threadId).map(m => m.id));\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const fetchedAll = perPageInput === false || allThreadMessagesReturned;\n const hasMore = !fetchedAll && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: 'LANCE_STORE_LIST_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n try {\n const { messages } = args;\n if (messages.length === 0) {\n return { messages: [] };\n }\n\n const threadId = messages[0]?.threadId;\n\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Validate all messages before saving\n for (const message of messages) {\n if (!message.id) {\n throw new Error('Message ID is required');\n }\n if (!message.threadId) {\n throw new Error('Thread ID is required for all messages');\n }\n if (message.resourceId === null || message.resourceId === undefined) {\n throw new Error('Resource ID cannot be null or undefined');\n }\n if (!message.content) {\n throw new Error('Message content is required');\n }\n }\n\n const transformedMessages = messages.map((message: MastraDBMessage | MastraMessageV1) => {\n const { threadId, type, ...rest } = message;\n return {\n ...rest,\n thread_id: threadId,\n type: type ?? 'v2',\n content: JSON.stringify(message.content),\n };\n });\n\n const table = await this.client.openTable(TABLE_MESSAGES);\n await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(transformedMessages);\n\n // Update the thread's updatedAt timestamp\n const threadsTable = await this.client.openTable(TABLE_THREADS);\n const currentTime = new Date().getTime();\n const updateRecord = { id: threadId, updatedAt: currentTime };\n await threadsTable.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([updateRecord]);\n\n const list = new MessageList().add(messages as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n try {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n const perPage = normalizePerPage(perPageInput, 100);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_LIST_THREADS_BY_RESOURCE_ID_INVALID_PAGE',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n // When perPage is false (get all), ignore page offset\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n const table = await this.client.openTable(TABLE_THREADS);\n\n // Get total count\n const total = await table.countRows(`\\`resourceId\\` = '${this.escapeSql(resourceId)}'`);\n\n // Get ALL matching records (no limit/offset yet - need to sort first)\n const query = table.query().where(`\\`resourceId\\` = '${this.escapeSql(resourceId)}'`);\n const records = await query.toArray();\n\n // Apply dynamic sorting BEFORE pagination\n records.sort((a, b) => {\n const aValue = ['createdAt', 'updatedAt'].includes(field) ? new Date(a[field]).getTime() : a[field];\n const bValue = ['createdAt', 'updatedAt'].includes(field) ? new Date(b[field]).getTime() : b[field];\n\n // Handle null/undefined - treat as \"smallest\" values\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return direction === 'ASC' ? -1 : 1;\n if (bValue == null) return direction === 'ASC' ? 1 : -1;\n\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n return direction === 'ASC' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n }\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n });\n\n // Apply pagination AFTER sorting\n const paginatedRecords = records.slice(offset, offset + perPage);\n\n const schema = await getTableSchema({ tableName: TABLE_THREADS, client: this.client });\n const threads = paginatedRecords.map(record =>\n processResultWithTypeConversion(record, schema),\n ) as StorageThreadType[];\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LIST_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Processes messages to include context messages based on withPreviousMessages and withNextMessages\n * @param records - The sorted array of records to process\n * @param include - The array of include specifications with context parameters\n * @returns The processed array with context messages included\n */\n private processMessagesWithContext(\n records: any[],\n include: { id: string; withPreviousMessages?: number; withNextMessages?: number }[],\n ): any[] {\n const messagesWithContext = include.filter(item => item.withPreviousMessages || item.withNextMessages);\n\n if (messagesWithContext.length === 0) {\n return records;\n }\n\n // Create a map of message id to index in the sorted array for quick lookup\n const messageIndexMap = new Map<string, number>();\n records.forEach((message, index) => {\n messageIndexMap.set(message.id, index);\n });\n\n // Keep track of additional indices to include\n const additionalIndices = new Set<number>();\n\n for (const item of messagesWithContext) {\n const messageIndex = messageIndexMap.get(item.id);\n\n if (messageIndex !== undefined) {\n // Add previous messages if requested\n if (item.withPreviousMessages) {\n const startIdx = Math.max(0, messageIndex - item.withPreviousMessages);\n for (let i = startIdx; i < messageIndex; i++) {\n additionalIndices.add(i);\n }\n }\n\n // Add next messages if requested\n if (item.withNextMessages) {\n const endIdx = Math.min(records.length - 1, messageIndex + item.withNextMessages);\n for (let i = messageIndex + 1; i <= endIdx; i++) {\n additionalIndices.add(i);\n }\n }\n }\n }\n\n // If we need to include additional messages, create a new set of records\n if (additionalIndices.size === 0) {\n return records;\n }\n\n // Get IDs of the records that matched the original query\n const originalMatchIds = new Set(include.map(item => item.id));\n\n // Create a set of all indices we need to include\n const allIndices = new Set<number>();\n\n // Add indices of originally matched messages\n records.forEach((record, index) => {\n if (originalMatchIds.has(record.id)) {\n allIndices.add(index);\n }\n });\n\n // Add the additional context message indices\n additionalIndices.forEach(index => {\n allIndices.add(index);\n });\n\n // Create a new filtered array with only the required messages\n // while maintaining chronological order\n return Array.from(allIndices)\n .sort((a, b) => a - b)\n .map(index => records[index]);\n }\n\n /**\n * Parse message data from LanceDB record format to MastraDBMessage format\n */\n private parseMessageData(data: any): MastraDBMessage {\n const { thread_id, ...rest } = data;\n return {\n ...rest,\n threadId: thread_id,\n content:\n typeof data.content === 'string'\n ? (() => {\n try {\n return JSON.parse(data.content);\n } catch {\n return data.content;\n }\n })()\n : data.content,\n createdAt: new Date(data.createdAt),\n updatedAt: new Date(data.updatedAt),\n } as MastraDBMessage;\n }\n\n async updateMessages(args: {\n messages: Partial<Omit<MastraDBMessage, 'createdAt'>> &\n {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n }[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n this.logger.debug('Updating messages', { count: messages.length });\n\n if (!messages.length) {\n return [];\n }\n\n const updatedMessages: MastraDBMessage[] = [];\n const affectedThreadIds = new Set<string>();\n\n try {\n for (const updateData of messages) {\n const { id, ...updates } = updateData;\n\n // Get the existing message\n const existingMessage = await this.operations.load({ tableName: TABLE_MESSAGES, keys: { id } });\n if (!existingMessage) {\n this.logger.warn('Message not found for update', { id });\n continue;\n }\n\n const existingMsg = this.parseMessageData(existingMessage);\n const originalThreadId = existingMsg.threadId;\n affectedThreadIds.add(originalThreadId!);\n\n // Prepare the update payload\n const updatePayload: any = {};\n\n // Handle basic field updates\n if ('role' in updates && updates.role !== undefined) updatePayload.role = updates.role;\n if ('type' in updates && updates.type !== undefined) updatePayload.type = updates.type;\n if ('resourceId' in updates && updates.resourceId !== undefined) updatePayload.resourceId = updates.resourceId;\n if ('threadId' in updates && updates.threadId !== undefined && updates.threadId !== null) {\n updatePayload.thread_id = updates.threadId;\n affectedThreadIds.add(updates.threadId as string);\n }\n\n // Handle content updates\n if (updates.content) {\n const existingContent = existingMsg.content;\n let newContent = { ...existingContent };\n\n // Deep merge metadata if provided\n if (updates.content.metadata !== undefined) {\n newContent.metadata = {\n ...(existingContent.metadata || {}),\n ...(updates.content.metadata || {}),\n };\n }\n\n // Update content string if provided\n if (updates.content.content !== undefined) {\n newContent.content = updates.content.content;\n }\n\n // Update parts if provided (only if it exists in the content type)\n if ('parts' in updates.content && updates.content.parts !== undefined) {\n (newContent as any).parts = updates.content.parts;\n }\n\n updatePayload.content = JSON.stringify(newContent);\n }\n\n // Update the message using merge insert\n await this.operations.insert({ tableName: TABLE_MESSAGES, record: { id, ...updatePayload } });\n\n // Get the updated message\n const updatedMessage = await this.operations.load({ tableName: TABLE_MESSAGES, keys: { id } });\n if (updatedMessage) {\n updatedMessages.push(this.parseMessageData(updatedMessage));\n }\n }\n\n // Update timestamps for all affected threads\n for (const threadId of affectedThreadIds) {\n await this.operations.insert({\n tableName: TABLE_THREADS,\n record: { id: threadId, updatedAt: Date.now() },\n });\n }\n\n return updatedMessages;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messages.length },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const resource = await this.operations.load({ tableName: TABLE_RESOURCES, keys: { id: resourceId } });\n\n if (!resource) {\n return null;\n }\n\n // Handle date conversion - LanceDB stores timestamps as numbers\n let createdAt: Date;\n let updatedAt: Date;\n\n // Convert ISO strings back to Date objects with error handling\n try {\n // If createdAt is already a Date object, use it directly\n if (resource.createdAt instanceof Date) {\n createdAt = resource.createdAt;\n } else if (typeof resource.createdAt === 'string') {\n // If it's an ISO string, parse it\n createdAt = new Date(resource.createdAt);\n } else if (typeof resource.createdAt === 'number') {\n // If it's a timestamp, convert it to Date\n createdAt = new Date(resource.createdAt);\n } else {\n // If it's null or undefined, use current date\n createdAt = new Date();\n }\n if (isNaN(createdAt.getTime())) {\n createdAt = new Date(); // Fallback to current date if invalid\n }\n } catch {\n createdAt = new Date(); // Fallback to current date if conversion fails\n }\n\n try {\n // If updatedAt is already a Date object, use it directly\n if (resource.updatedAt instanceof Date) {\n updatedAt = resource.updatedAt;\n } else if (typeof resource.updatedAt === 'string') {\n // If it's an ISO string, parse it\n updatedAt = new Date(resource.updatedAt);\n } else if (typeof resource.updatedAt === 'number') {\n // If it's a timestamp, convert it to Date\n updatedAt = new Date(resource.updatedAt);\n } else {\n // If it's null or undefined, use current date\n updatedAt = new Date();\n }\n if (isNaN(updatedAt.getTime())) {\n updatedAt = new Date(); // Fallback to current date if invalid\n }\n } catch {\n updatedAt = new Date(); // Fallback to current date if conversion fails\n }\n\n // Handle workingMemory - return undefined for null/undefined, empty string for empty string\n let workingMemory = resource.workingMemory;\n if (workingMemory === null || workingMemory === undefined) {\n workingMemory = undefined;\n } else if (workingMemory === '') {\n workingMemory = ''; // Return empty string for empty strings to match test expectations\n } else if (typeof workingMemory === 'object') {\n workingMemory = JSON.stringify(workingMemory);\n }\n\n // Handle metadata - return undefined for empty strings, parse JSON safely\n let metadata = resource.metadata;\n if (metadata === '' || metadata === null || metadata === undefined) {\n metadata = undefined;\n } else if (typeof metadata === 'string') {\n try {\n metadata = JSON.parse(metadata);\n } catch {\n // If JSON parsing fails, return the original string\n metadata = metadata;\n }\n }\n\n return {\n ...resource,\n createdAt,\n updatedAt,\n workingMemory,\n metadata,\n } as StorageResourceType;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_GET_RESOURCE_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n const record = {\n ...resource,\n metadata: resource.metadata ? JSON.stringify(resource.metadata) : '',\n createdAt: resource.createdAt.getTime(), // Store as timestamp (milliseconds)\n updatedAt: resource.updatedAt.getTime(), // Store as timestamp (milliseconds)\n };\n\n const table = await this.client.openTable(TABLE_RESOURCES);\n await table.add([record], { mode: 'append' });\n\n return resource;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_SAVE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const maxRetries = 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n const record = {\n id: resourceId,\n workingMemory: updatedResource.workingMemory || '',\n metadata: updatedResource.metadata ? JSON.stringify(updatedResource.metadata) : '',\n updatedAt: updatedResource.updatedAt.getTime(), // Store as timestamp (milliseconds)\n };\n\n const table = await this.client.openTable(TABLE_RESOURCES);\n await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([record]);\n\n return updatedResource;\n } catch (error: any) {\n if (error.message?.includes('Commit conflict') && attempt < maxRetries - 1) {\n // Wait with exponential backoff before retrying\n const delay = Math.pow(2, attempt) * 10; // 10ms, 20ms, 40ms\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // If it's not a commit conflict or we've exhausted retries, throw the error\n throw new MastraError(\n {\n id: 'LANCE_STORE_UPDATE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // This should never be reached, but TypeScript requires it\n throw new Error('Unexpected end of retry loop');\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { StoreOperations } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport { Utf8, Int32, Float32, Binary, Schema, Field, Float64 } from 'apache-arrow';\nimport type { DataType } from 'apache-arrow';\nimport { getPrimaryKeys, getTableSchema, processResultWithTypeConversion, validateKeyTypes } from '../utils';\n\nexport class StoreOperationsLance extends StoreOperations {\n client: Connection;\n constructor({ client }: { client: Connection }) {\n super();\n this.client = client;\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return \"''\";\n case 'timestamp':\n return 'CURRENT_TIMESTAMP';\n case 'integer':\n case 'bigint':\n return '0';\n case 'jsonb':\n return \"'{}'\";\n case 'uuid':\n return \"''\";\n default:\n return super.getDefaultValue(type);\n }\n }\n\n async hasColumn(tableName: TABLE_NAMES, columnName: string): Promise<boolean> {\n const table = await this.client.openTable(tableName);\n const schema = await table.schema();\n return schema.fields.some(field => field.name === columnName);\n }\n\n private translateSchema(schema: Record<string, StorageColumn>): Schema {\n const fields = Object.entries(schema).map(([name, column]) => {\n // Convert string type to Arrow DataType\n let arrowType: DataType;\n switch (column.type.toLowerCase()) {\n case 'text':\n case 'uuid':\n arrowType = new Utf8();\n break;\n case 'int':\n case 'integer':\n arrowType = new Int32();\n break;\n case 'bigint':\n arrowType = new Float64();\n break;\n case 'float':\n arrowType = new Float32();\n break;\n case 'jsonb':\n case 'json':\n arrowType = new Utf8();\n break;\n case 'binary':\n arrowType = new Binary();\n break;\n case 'timestamp':\n arrowType = new Float64();\n break;\n default:\n // Default to string for unknown types\n arrowType = new Utf8();\n }\n\n // Create a field with the appropriate arrow type\n return new Field(name, arrowType, column.nullable ?? true);\n });\n\n return new Schema(fields);\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for createTable.');\n }\n if (!schema) {\n throw new Error('schema is required for createTable.');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CREATE_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { tableName },\n },\n error,\n );\n }\n\n try {\n const arrowSchema = this.translateSchema(schema);\n await this.client.createEmptyTable(tableName, arrowSchema);\n } catch (error: any) {\n if (error.message?.includes('already exists')) {\n this.logger.debug(`Table '${tableName}' already exists, skipping create`);\n return;\n }\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for dropTable.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_DROP_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n await this.client.dropTable(tableName);\n } catch (error: any) {\n if (error.toString().includes('was not found') || error.message?.includes('Table not found')) {\n this.logger.debug(`Table '${tableName}' does not exist, skipping drop`);\n return;\n }\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: string;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for alterTable.');\n }\n if (!schema) {\n throw new Error('schema is required for alterTable.');\n }\n if (!ifNotExists || ifNotExists.length === 0) {\n this.logger.debug('No columns specified to add in alterTable, skipping.');\n return;\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_ALTER_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n const currentSchema = await table.schema();\n const existingFields = new Set(currentSchema.fields.map((f: any) => f.name));\n\n const typeMap: Record<string, string> = {\n text: 'string',\n integer: 'int',\n bigint: 'bigint',\n timestamp: 'timestamp',\n jsonb: 'string',\n uuid: 'string',\n };\n\n // Find columns to add\n const columnsToAdd = ifNotExists\n .filter(col => schema[col] && !existingFields.has(col))\n .map(col => {\n const colDef = schema[col];\n return {\n name: col,\n valueSql: colDef?.nullable\n ? `cast(NULL as ${typeMap[colDef.type ?? 'text']})`\n : `cast(${this.getDefaultValue(colDef?.type ?? 'text')} as ${typeMap[colDef?.type ?? 'text']})`,\n };\n });\n\n if (columnsToAdd.length > 0) {\n await table.addColumns(columnsToAdd);\n this.logger?.info?.(`Added columns [${columnsToAdd.map(c => c.name).join(', ')}] to table ${tableName}`);\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_ALTER_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for clearTable.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CLEAR_TABLE_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n\n // delete function always takes a predicate as an argument, so we use '1=1' to delete all records because it is always true.\n await table.delete('1=1');\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async insert({ tableName, record }: { tableName: string; record: Record<string, any> }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for insert.');\n }\n if (!record || Object.keys(record).length === 0) {\n throw new Error('record is required and cannot be empty for insert.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_INSERT_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n\n const primaryId = getPrimaryKeys(tableName as TABLE_NAMES);\n\n const processedRecord = { ...record };\n\n for (const key in processedRecord) {\n if (\n processedRecord[key] !== null &&\n typeof processedRecord[key] === 'object' &&\n !(processedRecord[key] instanceof Date)\n ) {\n this.logger.debug('Converting object to JSON string: ', processedRecord[key]);\n processedRecord[key] = JSON.stringify(processedRecord[key]);\n }\n }\n console.info(await table.schema());\n\n await table.mergeInsert(primaryId).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute([processedRecord]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: string; records: Record<string, any>[] }): Promise<void> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for batchInsert.');\n }\n if (!records || records.length === 0) {\n throw new Error('records array is required and cannot be empty for batchInsert.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_BATCH_INSERT_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n\n const primaryId = getPrimaryKeys(tableName as TABLE_NAMES);\n\n const processedRecords = records.map(record => {\n const processedRecord = { ...record };\n\n // Convert values based on schema type\n for (const key in processedRecord) {\n // Skip null/undefined values\n if (processedRecord[key] == null) continue;\n\n if (\n processedRecord[key] !== null &&\n typeof processedRecord[key] === 'object' &&\n !(processedRecord[key] instanceof Date)\n ) {\n processedRecord[key] = JSON.stringify(processedRecord[key]);\n }\n }\n\n return processedRecord;\n });\n\n await table.mergeInsert(primaryId).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(processedRecords);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<any> {\n try {\n if (!this.client) {\n throw new Error('LanceDB client not initialized. Call LanceStorage.create() first.');\n }\n if (!tableName) {\n throw new Error('tableName is required for load.');\n }\n if (!keys || Object.keys(keys).length === 0) {\n throw new Error('keys are required and cannot be empty for load.');\n }\n } catch (validationError: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_LOAD_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: validationError.message,\n details: { tableName },\n },\n validationError,\n );\n }\n\n try {\n const table = await this.client.openTable(tableName);\n const tableSchema = await getTableSchema({ tableName, client: this.client });\n const query = table.query();\n\n // Build filter condition with 'and' between all conditions\n if (Object.keys(keys).length > 0) {\n // Validate key types against schema\n validateKeyTypes(keys, tableSchema);\n\n const filterConditions = Object.entries(keys)\n .map(([key, value]) => {\n // Check if key is in camelCase and wrap it in backticks if it is\n const isCamelCase = /^[a-z][a-zA-Z]*$/.test(key) && /[A-Z]/.test(key);\n const quotedKey = isCamelCase ? `\\`${key}\\`` : key;\n\n // Handle different types appropriately\n if (typeof value === 'string') {\n return `${quotedKey} = '${value}'`;\n } else if (value === null) {\n return `${quotedKey} IS NULL`;\n } else {\n // For numbers, booleans, etc.\n return `${quotedKey} = ${value}`;\n }\n })\n .join(' AND ');\n\n this.logger.debug('where clause generated: ' + filterConditions);\n query.where(filterConditions);\n }\n\n const result = await query.limit(1).toArray();\n\n if (result.length === 0) {\n this.logger.debug('No record found');\n return null;\n }\n // Process the result with type conversions\n return processResultWithTypeConversion(result[0], tableSchema);\n } catch (error: any) {\n // If it's already a MastraError (e.g. from validateKeyTypes if we change it later), rethrow\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, keyCount: Object.keys(keys).length, firstKey: Object.keys(keys)[0] ?? '' },\n },\n error,\n );\n }\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport { ScoresStorage, TABLE_SCORERS, calculatePagination, normalizePerPage } from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport { getTableSchema, processResultWithTypeConversion } from '../utils';\n\nexport class StoreScoresLance extends ScoresStorage {\n private client: Connection;\n constructor({ client }: { client: Connection }) {\n super();\n this.client = client;\n }\n\n async saveScore(score: ScoreRowData): Promise<{ score: ScoreRowData }> {\n let validatedScore: ValidatedSaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_SAVE_SCORE_FAILED',\n text: 'Failed to save score in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n try {\n const id = crypto.randomUUID();\n const table = await this.client.openTable(TABLE_SCORERS);\n // Fetch schema fields for mastra_scorers\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const allowedFields = new Set(schema.fields.map((f: any) => f.name));\n // Filter out fields not in schema\n const filteredScore: Record<string, any> = {};\n (Object.keys(validatedScore) as (keyof ScoreRowData)[]).forEach(key => {\n if (allowedFields.has(key)) {\n filteredScore[key] = score[key];\n }\n });\n // Convert any object fields to JSON strings for storage\n for (const key in filteredScore) {\n if (\n filteredScore[key] !== null &&\n typeof filteredScore[key] === 'object' &&\n !(filteredScore[key] instanceof Date)\n ) {\n filteredScore[key] = JSON.stringify(filteredScore[key]);\n }\n }\n\n filteredScore.createdAt = new Date();\n filteredScore.updatedAt = new Date();\n\n filteredScore.id = id;\n await table.add([filteredScore], { mode: 'append' });\n return { score };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_SAVE_SCORE_FAILED',\n text: 'Failed to save score in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const table = await this.client.openTable(TABLE_SCORERS);\n\n const query = table.query().where(`id = '${id}'`).limit(1);\n\n const records = await query.toArray();\n\n if (records.length === 0) return null;\n return await this.transformScoreRow(records[0]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORE_BY_ID_FAILED',\n text: 'Failed to get score by id in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n /**\n * LanceDB-specific score row transformation.\n *\n * Note: This implementation does NOT use coreTransformScoreRow because:\n * 1. LanceDB stores schema information in the table itself (requires async fetch)\n * 2. Uses processResultWithTypeConversion utility for LanceDB-specific type handling\n */\n private async transformScoreRow(row: Record<string, any>): Promise<ScoreRowData> {\n const schema = await getTableSchema({ tableName: TABLE_SCORERS, client: this.client });\n const transformed = processResultWithTypeConversion(row, schema) as ScoreRowData;\n return {\n ...transformed,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n let query = table.query().where(`\\`scorerId\\` = '${scorerId}'`);\n\n if (source) {\n query = query.where(`\\`source\\` = '${source}'`);\n }\n\n if (entityId) {\n query = query.where(`\\`entityId\\` = '${entityId}'`);\n }\n if (entityType) {\n query = query.where(`\\`entityType\\` = '${entityType}'`);\n }\n\n // Get total count first\n let totalQuery = table.query().where(`\\`scorerId\\` = '${scorerId}'`);\n if (source) {\n totalQuery = totalQuery.where(`\\`source\\` = '${source}'`);\n }\n if (entityId) {\n totalQuery = totalQuery.where(`\\`entityId\\` = '${entityId}'`);\n }\n if (entityType) {\n totalQuery = totalQuery.where(`\\`entityType\\` = '${entityType}'`);\n }\n const allRecords = await totalQuery.toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // For perPage: false, don't use limit/offset, just get all records\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const scores = await Promise.all(records.map(async record => await this.transformScoreRow(record)));\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_SCORER_ID_FAILED',\n text: 'Failed to get scores by scorerId in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n // Get total count for pagination\n const allRecords = await table.query().where(`\\`runId\\` = '${runId}'`).toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Query for scores with the given runId\n let query = table.query().where(`\\`runId\\` = '${runId}'`);\n\n // For perPage: false, don't use limit/offset\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const scores = await Promise.all(records.map(async record => await this.transformScoreRow(record)));\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_RUN_ID_FAILED',\n text: 'Failed to get scores by runId in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n // Get total count for pagination\n const allRecords = await table\n .query()\n .where(`\\`entityId\\` = '${entityId}' AND \\`entityType\\` = '${entityType}'`)\n .toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Query for scores with the given entityId and entityType\n let query = table.query().where(`\\`entityId\\` = '${entityId}' AND \\`entityType\\` = '${entityType}'`);\n\n // For perPage: false, don't use limit/offset\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const scores = await Promise.all(records.map(async record => await this.transformScoreRow(record)));\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_ENTITY_ID_FAILED',\n text: 'Failed to get scores by entityId and entityType in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const table = await this.client.openTable(TABLE_SCORERS);\n\n // Get total count for pagination\n const allRecords = await table.query().where(`\\`traceId\\` = '${traceId}' AND \\`spanId\\` = '${spanId}'`).toArray();\n const total = allRecords.length;\n\n const end = perPageInput === false ? total : start + perPage;\n\n // Query for scores with the given traceId and spanId\n let query = table.query().where(`\\`traceId\\` = '${traceId}' AND \\`spanId\\` = '${spanId}'`);\n\n // For perPage: false, don't use limit/offset\n if (perPageInput !== false) {\n query = query.limit(perPage);\n if (start > 0) query = query.offset(start);\n }\n\n const records = await query.toArray();\n const scores = await Promise.all(records.map(async record => await this.transformScoreRow(record)));\n\n return {\n pagination: {\n page,\n perPage: perPageForResponse,\n total,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORAGE_GET_SCORES_BY_SPAN_FAILED',\n text: 'Failed to get scores by traceId and spanId in LanceStorage',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { error: error?.message },\n },\n error,\n );\n }\n }\n}\n","import type { Connection } from '@lancedb/lancedb';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { WorkflowRun, StorageListWorkflowRunsInput, WorkflowRuns } from '@mastra/core/storage';\nimport { ensureDate, normalizePerPage, TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\n\nfunction parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n console.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n resourceId: row.resourceId,\n };\n}\n\nexport class StoreWorkflowsLance extends WorkflowsStorage {\n client: Connection;\n constructor({ client }: { client: Connection }) {\n super();\n this.client = client;\n }\n\n updateWorkflowResults(\n {\n // workflowName,\n // runId,\n // stepId,\n // result,\n // requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n\n // Try to find the existing record\n const query = table.query().where(`workflow_name = '${workflowName}' AND run_id = '${runId}'`);\n const records = await query.toArray();\n let createdAt: number;\n const now = Date.now();\n\n if (records.length > 0) {\n createdAt = records[0].createdAt ?? now;\n } else {\n createdAt = now;\n }\n\n const { status, value, ...rest } = snapshot;\n\n const record = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: JSON.stringify({ status, value, ...rest }), // this is to ensure status is always just before value, for when querying the db by status\n createdAt,\n updatedAt: now,\n };\n\n await table\n .mergeInsert(['workflow_name', 'run_id'])\n .whenMatchedUpdateAll()\n .whenNotMatchedInsertAll()\n .execute([record]);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_PERSIST_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n const query = table.query().where(`workflow_name = '${workflowName}' AND run_id = '${runId}'`);\n const records = await query.toArray();\n return records.length > 0 ? JSON.parse(records[0].snapshot) : null;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LOAD_WORKFLOW_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<{\n workflowName: string;\n runId: string;\n snapshot: any;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n let whereClause = `run_id = '${args.runId}'`;\n if (args.workflowName) {\n whereClause += ` AND workflow_name = '${args.workflowName}'`;\n }\n const query = table.query().where(whereClause);\n const records = await query.toArray();\n if (records.length === 0) return null;\n const record = records[0];\n return parseWorkflowRun(record);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: args.runId, workflowName: args.workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n try {\n const table = await this.client.openTable(TABLE_WORKFLOW_SNAPSHOT);\n\n let query = table.query();\n\n const conditions: string[] = [];\n\n if (args?.workflowName) {\n conditions.push(`workflow_name = '${args.workflowName.replace(/'/g, \"''\")}'`);\n }\n\n if (args?.status) {\n const escapedStatus = args.status\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"''\")\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_');\n // Note: Using LIKE pattern since LanceDB doesn't support JSON extraction on string columns\n // The pattern ensures we match the workflow status (which appears before \"value\") and not step status\n conditions.push(`\\`snapshot\\` LIKE '%\"status\":\"${escapedStatus}\",\"value\"%'`);\n }\n\n if (args?.resourceId) {\n conditions.push(`\\`resourceId\\` = '${args.resourceId}'`);\n }\n\n if (args?.fromDate instanceof Date) {\n conditions.push(`\\`createdAt\\` >= ${args.fromDate.getTime()}`);\n }\n\n if (args?.toDate instanceof Date) {\n conditions.push(`\\`createdAt\\` <= ${args.toDate.getTime()}`);\n }\n\n let total = 0;\n\n // Apply all conditions\n if (conditions.length > 0) {\n query = query.where(conditions.join(' AND '));\n total = await table.countRows(conditions.join(' AND '));\n } else {\n total = await table.countRows();\n }\n\n if (args?.perPage !== undefined && args?.page !== undefined) {\n const normalizedPerPage = normalizePerPage(args.perPage, Number.MAX_SAFE_INTEGER);\n\n if (args.page < 0 || !Number.isInteger(args.page)) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_INVALID_PAGINATION_PARAMS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page: args.page, perPage: args.perPage },\n },\n new Error(`Invalid pagination parameters: page=${args.page}, perPage=${args.perPage}`),\n );\n }\n const offset = args.page * normalizedPerPage;\n query.limit(normalizedPerPage);\n query.offset(offset);\n }\n\n const records = await query.toArray();\n\n return {\n runs: records.map(record => parseWorkflowRun(record)),\n total: total || records.length,\n };\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LANCE_STORE_LIST_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: args?.resourceId ?? '', workflowName: args?.workflowName ?? '' },\n },\n error,\n );\n }\n }\n}\n","import { connect } from '@lancedb/lancedb';\nimport type { Connection, ConnectionOptions } from '@lancedb/lancedb';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n TABLE_NAMES,\n PaginationInfo,\n StorageColumn,\n WorkflowRuns,\n StoragePagination,\n StorageDomains,\n StorageResourceType,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { StoreMemoryLance } from './domains/memory';\nimport { StoreOperationsLance } from './domains/operations';\nimport { StoreScoresLance } from './domains/scores';\nimport { StoreWorkflowsLance } from './domains/workflows';\n\nexport class LanceStorage extends MastraStorage {\n stores: StorageDomains;\n private lanceClient!: Connection;\n /**\n * Creates a new instance of LanceStorage\n * @param id The unique identifier for this storage instance\n * @param name The name for this storage instance\n * @param uri The URI to connect to LanceDB\n * @param options connection options\n *\n * Usage:\n *\n * Connect to a local database\n * ```ts\n * const store = await LanceStorage.create('my-storage-id', 'MyStorage', '/path/to/db');\n * ```\n *\n * Connect to a LanceDB cloud database\n * ```ts\n * const store = await LanceStorage.create('my-storage-id', 'MyStorage', 'db://host:port');\n * ```\n *\n * Connect to a cloud database\n * ```ts\n * const store = await LanceStorage.create('my-storage-id', 'MyStorage', 's3://bucket/db', { storageOptions: { timeout: '60s' } });\n * ```\n */\n public static async create(\n id: string,\n name: string,\n uri: string,\n options?: ConnectionOptions,\n ): Promise<LanceStorage> {\n const instance = new LanceStorage(id, name);\n try {\n instance.lanceClient = await connect(uri, options);\n const operations = new StoreOperationsLance({ client: instance.lanceClient });\n instance.stores = {\n operations: new StoreOperationsLance({ client: instance.lanceClient }),\n workflows: new StoreWorkflowsLance({ client: instance.lanceClient }),\n scores: new StoreScoresLance({ client: instance.lanceClient }),\n memory: new StoreMemoryLance({ client: instance.lanceClient, operations }),\n };\n return instance;\n } catch (e: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_STORAGE_CONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to connect to LanceDB: ${e.message || e}`,\n details: { uri, optionsProvided: !!options },\n },\n e,\n );\n }\n }\n\n /**\n * @internal\n * Private constructor to enforce using the create factory method\n */\n private constructor(id: string, name: string) {\n super({ id, name });\n const operations = new StoreOperationsLance({ client: this.lanceClient });\n\n this.stores = {\n operations: new StoreOperationsLance({ client: this.lanceClient }),\n workflows: new StoreWorkflowsLance({ client: this.lanceClient }),\n scores: new StoreScoresLance({ client: this.lanceClient }),\n memory: new StoreMemoryLance({ client: this.lanceClient, operations }),\n };\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n return this.stores.operations.createTable({ tableName, schema });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.dropTable({ tableName });\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n return this.stores.operations.alterTable({ tableName, schema, ifNotExists });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.stores.operations.clearTable({ tableName });\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert({ tableName, record });\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert({ tableName, records });\n }\n\n async load({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<any> {\n return this.stores.operations.load({ tableName, keys });\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n return this.stores.memory.getThreadById({ threadId });\n }\n\n /**\n * Saves a thread to the database. This function doesn't overwrite existing threads.\n * @param thread - The thread to save\n * @returns The saved thread\n */\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n return this.stores.memory.saveThread({ thread });\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n return this.stores.memory.updateThread({ id, title, metadata });\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n return this.stores.memory.deleteThread({ threadId });\n }\n\n public get supports() {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: true,\n createTable: true,\n deleteMessages: false,\n listScoresBySpan: true,\n };\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n return this.stores.memory.getResourceById({ resourceId });\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n return this.stores.memory.saveResource({ resource });\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n return this.stores.memory.updateResource({ resourceId, workingMemory, metadata });\n }\n\n /**\n * Processes messages to include context messages based on withPreviousMessages and withNextMessages\n * @param records - The sorted array of records to process\n * @param include - The array of include specifications with context parameters\n * @returns The processed array with context messages included\n */\n private processMessagesWithContext(\n records: any[],\n include: { id: string; withPreviousMessages?: number; withNextMessages?: number }[],\n ): any[] {\n const messagesWithContext = include.filter(item => item.withPreviousMessages || item.withNextMessages);\n\n if (messagesWithContext.length === 0) {\n return records;\n }\n\n // Create a map of message id to index in the sorted array for quick lookup\n const messageIndexMap = new Map<string, number>();\n records.forEach((message, index) => {\n messageIndexMap.set(message.id, index);\n });\n\n // Keep track of additional indices to include\n const additionalIndices = new Set<number>();\n\n for (const item of messagesWithContext) {\n const messageIndex = messageIndexMap.get(item.id);\n\n if (messageIndex !== undefined) {\n // Add previous messages if requested\n if (item.withPreviousMessages) {\n const startIdx = Math.max(0, messageIndex - item.withPreviousMessages);\n for (let i = startIdx; i < messageIndex; i++) {\n additionalIndices.add(i);\n }\n }\n\n // Add next messages if requested\n if (item.withNextMessages) {\n const endIdx = Math.min(records.length - 1, messageIndex + item.withNextMessages);\n for (let i = messageIndex + 1; i <= endIdx; i++) {\n additionalIndices.add(i);\n }\n }\n }\n }\n\n // If we need to include additional messages, create a new set of records\n if (additionalIndices.size === 0) {\n return records;\n }\n\n // Get IDs of the records that matched the original query\n const originalMatchIds = new Set(include.map(item => item.id));\n\n // Create a set of all indices we need to include\n const allIndices = new Set<number>();\n\n // Add indices of originally matched messages\n records.forEach((record, index) => {\n if (originalMatchIds.has(record.id)) {\n allIndices.add(index);\n }\n });\n\n // Add the additional context message indices\n additionalIndices.forEach(index => {\n allIndices.add(index);\n });\n\n // Create a new filtered array with only the required messages\n // while maintaining chronological order\n return Array.from(allIndices)\n .sort((a, b) => a - b)\n .map(index => records[index]);\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.listMessagesById({ messageIds });\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n return this.stores.memory.saveMessages(args);\n }\n\n async updateMessages(_args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n return this.stores.memory.updateMessages(_args);\n }\n\n async listWorkflowRuns(args?: StorageListWorkflowRunsInput): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById(args: { runId: string; workflowName?: string }): Promise<{\n workflowName: string;\n runId: string;\n snapshot: any;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.stores.workflows.getWorkflowRunById(args);\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n return this.stores.workflows.updateWorkflowResults({ workflowName, runId, stepId, result, requestContext });\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: {\n status: string;\n result?: StepResult<any, any, any, any>;\n error?: string;\n suspendedPaths?: Record<string, number[]>;\n waitingPaths?: Record<string, number[]>;\n };\n }): Promise<WorkflowRunState | undefined> {\n return this.stores.workflows.updateWorkflowState({ workflowName, runId, opts });\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n }): Promise<void> {\n return this.stores.workflows.persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n return this.stores.workflows.loadWorkflowSnapshot({ workflowName, runId });\n }\n\n async getScoreById({ id: _id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id: _id });\n }\n\n async listScoresByScorerId({\n scorerId,\n source,\n entityId,\n entityType,\n pagination,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n source?: ScoringSource;\n entityId?: string;\n entityType?: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByScorerId({ scorerId, source, pagination, entityId, entityType });\n }\n\n async saveScore(_score: ScoreRowData): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(_score);\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByRunId({ runId, pagination });\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByEntityId({ entityId, entityType, pagination });\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresBySpan({ traceId, spanId, pagination });\n }\n}\n","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\ntype LanceOperatorValueMap = OperatorValueMap & {\n $like: string;\n $notLike: string;\n $contains: string;\n};\n\ntype LanceBlacklisted = BlacklistedRootOperators | '$like' | '$notLike' | '$contains';\n\nexport type LanceVectorFilter = VectorFilter<\n keyof LanceOperatorValueMap,\n LanceOperatorValueMap,\n LogicalOperatorValueMap,\n LanceBlacklisted\n>;\n\nexport class LanceFilterTranslator extends BaseFilterTranslator<LanceVectorFilter, string> {\n translate(filter: LanceVectorFilter): string {\n if (!filter || Object.keys(filter).length === 0) {\n return '';\n }\n\n // Check for fields with periods that aren't nested at top level\n if (typeof filter === 'object' && filter !== null) {\n const keys = Object.keys(filter);\n for (const key of keys) {\n if (key.includes('.') && !this.isNormalNestedField(key)) {\n throw new Error(`Field names containing periods (.) are not supported: ${key}`);\n }\n }\n }\n\n return this.processFilter(filter);\n }\n\n private processFilter(filter: unknown, parentPath = ''): string {\n // Handle null case\n if (filter === null) {\n return `${parentPath} IS NULL`;\n }\n\n // Handle Date objects at top level\n if (filter instanceof Date) {\n return `${parentPath} = ${this.formatValue(filter)}`;\n }\n\n // Handle top-level operators\n if (typeof filter === 'object' && filter !== null) {\n const obj = filter as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle logical operators at top level\n if (keys.length === 1 && this.isOperator(keys[0]!)) {\n const operator = keys[0]!;\n const operatorValue = obj[operator];\n\n if (this.isLogicalOperator(operator)) {\n if (operator === '$and' || operator === '$or') {\n return this.processLogicalOperator(operator, operatorValue as unknown[]);\n }\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(operator));\n }\n\n throw new Error(BaseFilterTranslator.ErrorMessages.INVALID_TOP_LEVEL_OPERATOR(operator));\n }\n\n // Check for fields with periods that aren't nested\n for (const key of keys) {\n if (key.includes('.') && !this.isNormalNestedField(key)) {\n throw new Error(`Field names containing periods (.) are not supported: ${key}`);\n }\n }\n\n // Handle multiple fields (implicit AND)\n if (keys.length > 1) {\n const conditions = keys.map(key => {\n const value = obj[key];\n // Check if key is a nested path or a field\n if (this.isNestedObject(value) && !this.isDateObject(value)) {\n return this.processNestedObject(key, value);\n } else {\n return this.processField(key, value);\n }\n });\n return conditions.join(' AND ');\n }\n\n // Handle single field\n if (keys.length === 1) {\n const key = keys[0]!;\n const value = obj[key]!;\n\n if (this.isNestedObject(value) && !this.isDateObject(value)) {\n return this.processNestedObject(key!, value);\n } else {\n return this.processField(key!, value);\n }\n }\n }\n\n return '';\n }\n\n private processLogicalOperator(operator: string, conditions: unknown[]): string {\n if (!Array.isArray(conditions)) {\n throw new Error(`Logical operator ${operator} must have an array value`);\n }\n\n if (conditions.length === 0) {\n return operator === '$and' ? 'true' : 'false';\n }\n\n const sqlOperator = operator === '$and' ? 'AND' : 'OR';\n\n const processedConditions = conditions.map(condition => {\n if (typeof condition !== 'object' || condition === null) {\n throw new Error(BaseFilterTranslator.ErrorMessages.INVALID_LOGICAL_OPERATOR_CONTENT(operator));\n }\n\n // Check if condition is a nested logical operator\n const condObj = condition as Record<string, unknown>;\n const keys = Object.keys(condObj);\n\n if (keys.length === 1 && this.isOperator(keys[0]!)) {\n if (this.isLogicalOperator(keys[0])) {\n return `(${this.processLogicalOperator(keys[0], condObj[keys[0]] as unknown[])})`;\n } else {\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(keys[0]));\n }\n }\n\n // Handle multiple fields within a logical condition (implicit AND)\n if (keys.length > 1) {\n return `(${this.processFilter(condition)})`;\n }\n\n return this.processFilter(condition);\n });\n\n return processedConditions.join(` ${sqlOperator} `);\n }\n\n private processNestedObject(path: string, value: unknown): string {\n if (typeof value !== 'object' || value === null) {\n throw new Error(`Expected object for nested path ${path}`);\n }\n\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n // Handle empty object\n if (keys.length === 0) {\n return `${path} = {}`;\n }\n\n // Handle operators on a field\n if (keys.every(k => this.isOperator(k))) {\n return this.processOperators(path, obj);\n }\n\n // Process each nested field and join with AND\n const conditions = keys.map(key => {\n const nestedPath = key.includes('.')\n ? `${path}.${key}` // Key already contains dots (pre-dotted path)\n : `${path}.${key}`; // Normal nested field\n\n if (this.isNestedObject(obj[key]) && !this.isDateObject(obj[key])) {\n return this.processNestedObject(nestedPath, obj[key]);\n } else {\n return this.processField(nestedPath, obj[key]);\n }\n });\n\n return conditions.join(' AND ');\n }\n\n private processField(field: string, value: unknown): string {\n // Check for illegal field names\n if (field.includes('.') && !this.isNormalNestedField(field)) {\n throw new Error(`Field names containing periods (.) are not supported: ${field}`);\n }\n\n // Escape field name if needed\n const escapedField = this.escapeFieldName(field);\n\n // Handle null value\n if (value === null) {\n return `${escapedField} IS NULL`;\n }\n\n // Handle Date objects properly\n if (value instanceof Date) {\n return `${escapedField} = ${this.formatValue(value)}`;\n }\n\n // Handle arrays (convert to IN)\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return 'false'; // Empty array is usually false in SQL\n }\n const normalizedValues = this.normalizeArrayValues(value);\n return `${escapedField} IN (${this.formatArrayValues(normalizedValues)})`;\n }\n\n // Handle operator objects\n if (this.isOperatorObject(value)) {\n return this.processOperators(field, value as Record<string, unknown>);\n }\n\n // Handle basic values (normalize dates and other special values)\n return `${escapedField} = ${this.formatValue(this.normalizeComparisonValue(value))}`;\n }\n\n private processOperators(field: string, operators: Record<string, unknown>): string {\n const escapedField = this.escapeFieldName(field);\n const operatorKeys = Object.keys(operators);\n\n // Check for logical operators at field level\n if (operatorKeys.some(op => this.isLogicalOperator(op))) {\n const logicalOp = operatorKeys.find(op => this.isLogicalOperator(op)) || '';\n throw new Error(`Unsupported operator: ${logicalOp} cannot be used at field level`);\n }\n\n // Process each operator and join with AND\n return operatorKeys\n .map(op => {\n const value = operators[op];\n\n // Check if this is a supported operator\n if (!this.isFieldOperator(op) && !this.isCustomOperator(op)) {\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(op));\n }\n\n switch (op) {\n case '$eq':\n if (value === null) {\n return `${escapedField} IS NULL`;\n }\n return `${escapedField} = ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$ne':\n if (value === null) {\n return `${escapedField} IS NOT NULL`;\n }\n return `${escapedField} != ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$gt':\n return `${escapedField} > ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$gte':\n return `${escapedField} >= ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$lt':\n return `${escapedField} < ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$lte':\n return `${escapedField} <= ${this.formatValue(this.normalizeComparisonValue(value))}`;\n case '$in':\n if (!Array.isArray(value)) {\n throw new Error(`$in operator requires array value for field: ${field}`);\n }\n if (value.length === 0) {\n return 'false'; // Empty IN is false\n }\n const normalizedValues = this.normalizeArrayValues(value);\n return `${escapedField} IN (${this.formatArrayValues(normalizedValues)})`;\n case '$like':\n return `${escapedField} LIKE ${this.formatValue(value)}`;\n case '$notLike':\n return `${escapedField} NOT LIKE ${this.formatValue(value)}`;\n case '$regex':\n return `regexp_match(${escapedField}, ${this.formatValue(value)})`;\n default:\n throw new Error(BaseFilterTranslator.ErrorMessages.UNSUPPORTED_OPERATOR(op));\n }\n })\n .join(' AND ');\n }\n\n private formatValue(value: unknown): string {\n if (value === null) {\n return 'NULL';\n }\n\n if (typeof value === 'string') {\n // Escape single quotes in SQL strings by doubling them\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return `timestamp '${value.toISOString()}'`;\n }\n\n if (typeof value === 'object') {\n if (value instanceof Date) {\n return `timestamp '${value.toISOString()}'`;\n }\n return JSON.stringify(value);\n }\n\n return String(value);\n }\n\n private formatArrayValues(array: unknown[]): string {\n return array.map(item => this.formatValue(item)).join(', ');\n }\n\n normalizeArrayValues(array: unknown[]): unknown[] {\n return array.map(item => {\n if (item instanceof Date) {\n return item; // Keep Date objects as is to properly format them later\n }\n return this.normalizeComparisonValue(item);\n });\n }\n\n normalizeComparisonValue(value: unknown): unknown {\n // Date objects should be preserved as is, not converted to strings\n if (value instanceof Date) {\n return value;\n }\n\n return super.normalizeComparisonValue(value);\n }\n\n private isOperatorObject(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n\n return keys.length > 0 && keys.some(key => this.isOperator(key));\n }\n\n private isNestedObject(value: unknown): boolean {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private isNormalNestedField(field: string): boolean {\n // Check if field is a proper nested field name\n const parts = field.split('.');\n // A valid nested field shouldn't have empty parts or start/end with a dot\n return !field.startsWith('.') && !field.endsWith('.') && parts.every(part => part.trim().length > 0);\n }\n\n private escapeFieldName(field: string): string {\n // If field contains special characters or is a SQL keyword, escape with backticks\n if (field.includes(' ') || field.includes('-') || /^[A-Z]+$/.test(field) || this.isSqlKeyword(field)) {\n // For nested fields, escape each part\n if (field.includes('.')) {\n return field\n .split('.')\n .map(part => `\\`${part}\\``)\n .join('.');\n }\n return `\\`${field}\\``;\n }\n\n return field;\n }\n\n private isSqlKeyword(str: string): boolean {\n // Common SQL keywords that might need escaping\n const sqlKeywords = [\n 'SELECT',\n 'FROM',\n 'WHERE',\n 'AND',\n 'OR',\n 'NOT',\n 'INSERT',\n 'UPDATE',\n 'DELETE',\n 'CREATE',\n 'ALTER',\n 'DROP',\n 'TABLE',\n 'VIEW',\n 'INDEX',\n 'JOIN',\n 'INNER',\n 'OUTER',\n 'LEFT',\n 'RIGHT',\n 'FULL',\n 'UNION',\n 'ALL',\n 'DISTINCT',\n 'AS',\n 'ON',\n 'BETWEEN',\n 'LIKE',\n 'IN',\n 'IS',\n 'NULL',\n 'TRUE',\n 'FALSE',\n 'ASC',\n 'DESC',\n 'GROUP',\n 'ORDER',\n 'BY',\n 'HAVING',\n 'LIMIT',\n 'OFFSET',\n 'CASE',\n 'WHEN',\n 'THEN',\n 'ELSE',\n 'END',\n 'CAST',\n 'CUBE',\n ];\n\n return sqlKeywords.includes(str.toUpperCase());\n }\n\n private isDateObject(value: unknown): boolean {\n return value instanceof Date;\n }\n\n /**\n * Override getSupportedOperators to add custom operators for LanceDB\n */\n protected override getSupportedOperators() {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n custom: ['$like', '$notLike', '$regex'],\n };\n }\n}\n","import { connect, Index } from '@lancedb/lancedb';\nimport type { Connection, ConnectionOptions, CreateTableOptions, Table, TableLike } from '@lancedb/lancedb';\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n QueryVectorParams,\n UpdateVectorParams,\n UpsertVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\n\nimport { MastraVector } from '@mastra/core/vector';\nimport type { LanceVectorFilter } from './filter';\nimport { LanceFilterTranslator } from './filter';\nimport type { IndexConfig } from './types';\n\ninterface LanceCreateIndexParams extends CreateIndexParams {\n indexConfig?: LanceIndexConfig;\n tableName?: string;\n}\n\ninterface LanceIndexConfig extends IndexConfig {\n numPartitions?: number;\n numSubVectors?: number;\n}\n\ninterface LanceUpsertVectorParams extends UpsertVectorParams {\n tableName: string;\n}\n\ninterface LanceQueryVectorParams extends QueryVectorParams<LanceVectorFilter> {\n tableName: string;\n columns?: string[];\n includeAllColumns?: boolean;\n}\n\nexport class LanceVectorStore extends MastraVector<LanceVectorFilter> {\n private lanceClient!: Connection;\n\n /**\n * Creates a new instance of LanceVectorStore\n * @param uri The URI to connect to LanceDB\n * @param options connection options\n *\n * Usage:\n *\n * Connect to a local database\n * ```ts\n * const store = await LanceVectorStore.create('/path/to/db');\n * ```\n *\n * Connect to a LanceDB cloud database\n * ```ts\n * const store = await LanceVectorStore.create('db://host:port');\n * ```\n *\n * Connect to a cloud database\n * ```ts\n * const store = await LanceVectorStore.create('s3://bucket/db', { storageOptions: { timeout: '60s' } });\n * ```\n */\n public static async create(uri: string, options?: ConnectionOptions & { id: string }): Promise<LanceVectorStore> {\n const instance = new LanceVectorStore(options?.id || crypto.randomUUID());\n try {\n instance.lanceClient = await connect(uri, options);\n return instance;\n } catch (e) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { uri },\n },\n e,\n );\n }\n }\n\n /**\n * @internal\n * Private constructor to enforce using the create factory method\n */\n private constructor(id: string) {\n super({ id });\n }\n\n close() {\n if (this.lanceClient) {\n this.lanceClient.close();\n }\n }\n\n async query({\n tableName,\n queryVector,\n filter,\n includeVector = false,\n topK = 10,\n columns = [],\n includeAllColumns = false,\n }: LanceQueryVectorParams): Promise<QueryResult[]> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!tableName) {\n throw new Error('tableName is required');\n }\n\n if (!queryVector) {\n throw new Error('queryVector is required');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_QUERY_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n },\n error,\n );\n }\n\n try {\n // Open the table\n const table = await this.lanceClient.openTable(tableName);\n\n // Prepare the list of columns to select\n const selectColumns = [...columns];\n if (!selectColumns.includes('id')) {\n selectColumns.push('id');\n }\n\n // Create the query builder\n let query = table.search(queryVector);\n\n // Add filter if provided\n if (filter && Object.keys(filter).length > 0) {\n const whereClause = this.filterTranslator(filter);\n this.logger.debug(`Where clause generated: ${whereClause}`);\n query = query.where(whereClause);\n }\n\n // Apply column selection and limit\n if (!includeAllColumns && selectColumns.length > 0) {\n query = query.select(selectColumns);\n }\n query = query.limit(topK);\n\n // Execute the query\n const results = await query.toArray();\n\n return results.map(result => {\n // Collect all metadata_ prefixed fields\n const flatMetadata: Record<string, any> = {};\n\n // Get all keys from the result object\n Object.keys(result).forEach(key => {\n // Skip reserved keys (id, score, and the vector column)\n if (key !== 'id' && key !== 'score' && key !== 'vector' && key !== '_distance') {\n if (key.startsWith('metadata_')) {\n // Remove the prefix and add to flat metadata\n const metadataKey = key.substring('metadata_'.length);\n flatMetadata[metadataKey] = result[key];\n }\n }\n });\n\n // Reconstruct nested metadata object\n const metadata = this.unflattenObject(flatMetadata);\n\n return {\n id: String(result.id || ''),\n metadata,\n vector:\n includeVector && result.vector\n ? Array.isArray(result.vector)\n ? result.vector\n : Array.from(result.vector as any[])\n : undefined,\n document: result.document,\n score: result._distance,\n };\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, includeVector, columnsCount: columns?.length, includeAllColumns },\n },\n error,\n );\n }\n }\n\n private filterTranslator(filter: LanceVectorFilter): string {\n // Add metadata_ prefix to filter keys if they don't already have it\n const processFilterKeys = (filterObj: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n Object.entries(filterObj).forEach(([key, value]) => {\n // Don't add prefix to logical operators\n if (key === '$or' || key === '$and' || key === '$not' || key === '$in') {\n // For logical operators, process their array contents\n if (Array.isArray(value)) {\n result[key] = value.map(item =>\n typeof item === 'object' && item !== null ? processFilterKeys(item as Record<string, any>) : item,\n );\n } else {\n result[key] = value;\n }\n }\n // Don't add prefix if it already has metadata_ prefix\n else if (key.startsWith('metadata_')) {\n result[key] = value;\n }\n // Add metadata_ prefix to regular field keys\n else {\n // Convert dot notation to underscore notation for nested fields\n if (key.includes('.')) {\n const convertedKey = `metadata_${key.replace(/\\./g, '_')}`;\n result[convertedKey] = value;\n } else {\n result[`metadata_${key}`] = value;\n }\n }\n });\n\n return result;\n };\n\n const prefixedFilter = filter && typeof filter === 'object' ? processFilterKeys(filter as Record<string, any>) : {};\n\n const translator = new LanceFilterTranslator();\n return translator.translate(prefixedFilter);\n }\n\n async upsert({ tableName, vectors, metadata = [], ids = [] }: LanceUpsertVectorParams): Promise<string[]> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!tableName) {\n throw new Error('tableName is required');\n }\n\n if (!vectors || !Array.isArray(vectors) || vectors.length === 0) {\n throw new Error('vectors array is required and must not be empty');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_UPSERT_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n },\n error,\n );\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n if (!tables.includes(tableName)) {\n throw new Error(`Table ${tableName} does not exist`);\n }\n\n const table = await this.lanceClient.openTable(tableName);\n\n // Generate IDs if not provided\n const vectorIds = ids.length === vectors.length ? ids : vectors.map((_, i) => ids[i] || crypto.randomUUID());\n\n // Create data with metadata fields expanded at the top level\n const data = vectors.map((vector, i) => {\n const id = String(vectorIds[i]);\n const metadataItem = metadata[i] || {};\n\n // Create the base object with id and vector\n const rowData: Record<string, any> = {\n id,\n vector: vector,\n };\n\n // Flatten the metadata object and prefix all keys with 'metadata_'\n if (Object.keys(metadataItem).length > 0) {\n const flattenedMetadata = this.flattenObject(metadataItem, 'metadata');\n // Add all flattened metadata properties to the row data object\n Object.entries(flattenedMetadata).forEach(([key, value]) => {\n rowData[key] = value;\n });\n }\n\n return rowData;\n });\n\n await table.add(data, { mode: 'overwrite' });\n\n return vectorIds;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, vectorCount: vectors.length, metadataCount: metadata.length, idsCount: ids.length },\n },\n error,\n );\n }\n }\n\n /**\n * Flattens a nested object, creating new keys with underscores for nested properties.\n * Example: { metadata: { text: 'test' } } → { metadata_text: 'test' }\n */\n private flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n return Object.keys(obj).reduce((acc: Record<string, unknown>, k: string) => {\n const pre = prefix.length ? `${prefix}_` : '';\n if (typeof obj[k] === 'object' && obj[k] !== null && !Array.isArray(obj[k])) {\n Object.assign(acc, this.flattenObject(obj[k] as Record<string, unknown>, pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {});\n }\n\n async createTable(\n tableName: string,\n data: Record<string, unknown>[] | TableLike,\n options?: Partial<CreateTableOptions>,\n ): Promise<Table> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_CREATE_TABLE_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n });\n }\n\n // Flatten nested objects if data is an array of records\n if (Array.isArray(data)) {\n data = data.map(record => this.flattenObject(record));\n }\n\n try {\n return await this.lanceClient.createTable(tableName, data, options);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async listTables(): Promise<string[]> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_LIST_TABLES_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { methodName: 'listTables' },\n });\n }\n try {\n return await this.lanceClient.tableNames();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_LIST_TABLES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getTableSchema(tableName: string): Promise<any> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_GET_TABLE_SCHEMA_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { tableName },\n });\n }\n\n try {\n const table = await this.lanceClient.openTable(tableName);\n return await table.schema();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_GET_TABLE_SCHEMA_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * indexName is actually a column name in a table in lanceDB\n */\n async createIndex({\n tableName,\n indexName,\n dimension,\n metric = 'cosine',\n indexConfig = {},\n }: LanceCreateIndexParams): Promise<void> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!tableName) {\n throw new Error('tableName is required');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n if (typeof dimension !== 'number' || dimension <= 0) {\n throw new Error('dimension must be a positive number');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CREATE_INDEX_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { tableName: tableName || '', indexName, dimension, metric },\n },\n err,\n );\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n if (!tables.includes(tableName)) {\n throw new Error(\n `Table ${tableName} does not exist. Please create the table first by calling createTable() method.`,\n );\n }\n\n const table = await this.lanceClient.openTable(tableName);\n\n // Convert metric to LanceDB metric\n type LanceMetric = 'cosine' | 'l2' | 'dot';\n let metricType: LanceMetric | undefined;\n if (metric === 'euclidean') {\n metricType = 'l2';\n } else if (metric === 'dotproduct') {\n metricType = 'dot';\n } else if (metric === 'cosine') {\n metricType = 'cosine';\n }\n\n if (indexConfig.type === 'ivfflat') {\n await table.createIndex(indexName, {\n config: Index.ivfPq({\n numPartitions: indexConfig.numPartitions || 128,\n numSubVectors: indexConfig.numSubVectors || 16,\n distanceType: metricType,\n }),\n });\n } else {\n // Default to HNSW PQ index\n this.logger.debug('Creating HNSW PQ index with config:', indexConfig);\n await table.createIndex(indexName, {\n config: Index.hnswPq({\n m: indexConfig?.hnsw?.m || 16,\n efConstruction: indexConfig?.hnsw?.efConstruction || 100,\n distanceType: metricType,\n }),\n });\n }\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName: tableName || '', indexName, dimension },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_LIST_INDEXES_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n details: { methodName: 'listIndexes' },\n });\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n const allIndices: string[] = [];\n\n for (const tableName of tables) {\n const table = await this.lanceClient.openTable(tableName);\n const tableIndices = await table.listIndices();\n allIndices.push(...tableIndices.map(index => index.name));\n }\n\n return allIndices;\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DESCRIBE_INDEX_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n err,\n );\n }\n\n try {\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n const tableIndices = await table.listIndices();\n const foundIndex = tableIndices.find(index => index.name === indexName);\n\n if (foundIndex) {\n const stats = await table.indexStats(foundIndex.name);\n\n if (!stats) {\n throw new Error(`Index stats not found for index: ${indexName}`);\n }\n\n const schema = await table.schema();\n const vectorCol = foundIndex.columns[0] || 'vector';\n\n // Find the vector column in the schema\n const vectorField = schema.fields.find(field => field.name === vectorCol);\n const dimension = vectorField?.type?.['listSize'] || 0;\n\n return {\n dimension: dimension,\n metric: stats.distanceType as 'cosine' | 'euclidean' | 'dotproduct' | undefined,\n count: stats.numIndexedRows,\n };\n }\n }\n\n throw new Error(`IndexName: ${indexName} not found`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_INDEX_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n err,\n );\n }\n try {\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n const table = await this.lanceClient.openTable(tableName);\n const tableIndices = await table.listIndices();\n const foundIndex = tableIndices.find(index => index.name === indexName);\n\n if (foundIndex) {\n await table.dropIndex(indexName);\n return;\n }\n }\n\n throw new Error(`Index ${indexName} not found`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes all tables in the database\n */\n async deleteAllTables(): Promise<void> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_ALL_TABLES_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { methodName: 'deleteAllTables' },\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n });\n }\n try {\n await this.lanceClient.dropAllTables();\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_ALL_TABLES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { methodName: 'deleteAllTables' },\n },\n error,\n );\n }\n }\n\n async deleteTable(tableName: string): Promise<void> {\n if (!this.lanceClient) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_TABLE_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { tableName },\n text: 'LanceDB client not initialized. Use LanceVectorStore.create() to create an instance',\n });\n }\n\n try {\n await this.lanceClient.dropTable(tableName);\n } catch (error: any) {\n // throw new Error(`Failed to delete tables: ${error.message}`);\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async updateVector(params: UpdateVectorParams<LanceVectorFilter>): Promise<void> {\n const { indexName, update } = params;\n\n // Validate mutually exclusive parameters\n if ('id' in params && 'filter' in params && params.id && params.filter) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'id and filter are mutually exclusive',\n details: { indexName },\n });\n }\n\n if (!('id' in params || 'filter' in params) || (!params.id && !params.filter)) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Either id or filter must be provided',\n details: { indexName },\n });\n }\n\n if ('filter' in params && params.filter && Object.keys(params.filter).length === 0) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot update with empty filter',\n details: { indexName },\n });\n }\n\n if (!update.vector && !update.metadata) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'No updates provided',\n details: { indexName },\n });\n }\n\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n // In LanceDB, the indexName is actually a column name in a table\n // We need to find which table has this column as an index\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n\n try {\n const schema = await table.schema();\n const hasColumn = schema.fields.some(field => field.name === indexName);\n\n if (hasColumn) {\n this.logger.debug(`Found column ${indexName} in table ${tableName}`);\n\n let whereClause: string;\n if ('id' in params && params.id) {\n whereClause = `id = '${params.id}'`;\n } else if ('filter' in params && params.filter) {\n // Use filter translator to build SQL WHERE clause\n const translator = new LanceFilterTranslator();\n const processFilterKeys = (filter: Record<string, any>): Record<string, any> => {\n const processedFilter: Record<string, any> = {};\n Object.entries(filter).forEach(([key, value]) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.entries(value).forEach(([nestedKey, nestedValue]) => {\n processedFilter[`metadata_${key}_${nestedKey}`] = nestedValue;\n });\n } else {\n processedFilter[`metadata_${key}`] = value;\n }\n });\n return processedFilter;\n };\n\n const prefixedFilter = processFilterKeys(params.filter as Record<string, any>);\n whereClause = translator.translate(prefixedFilter) || '';\n\n if (!whereClause) {\n throw new Error('Failed to translate filter to SQL');\n }\n } else {\n throw new Error('Either id or filter must be provided');\n }\n\n // Query for existing records that match\n const existingRecords = await table\n .query()\n .where(whereClause)\n .select(schema.fields.map(field => field.name))\n .toArray();\n\n if (existingRecords.length === 0) {\n this.logger.info(`No records found matching criteria in table ${tableName}`);\n return;\n }\n\n // Update each matching record\n const updatedRecords = existingRecords.map(record => {\n const rowData: Record<string, any> = {};\n\n // Copy all existing field values except special fields\n Object.entries(record).forEach(([key, value]) => {\n // Skip special fields\n if (key !== '_distance') {\n // Handle vector field specially to avoid nested properties\n if (key === indexName) {\n // If we're about to update this vector anyway, use the new value\n if (update.vector) {\n rowData[key] = update.vector;\n } else {\n // Ensure vector is a plain array\n if (Array.isArray(value)) {\n rowData[key] = [...value];\n } else if (typeof value === 'object' && value !== null) {\n // Handle vector objects by converting to array if needed\n rowData[key] = Array.from(value as any[]);\n } else {\n rowData[key] = value;\n }\n }\n } else {\n rowData[key] = value;\n }\n }\n });\n\n // Apply metadata updates if provided\n if (update.metadata) {\n Object.entries(update.metadata).forEach(([key, value]) => {\n rowData[`metadata_${key}`] = value;\n });\n }\n\n return rowData;\n });\n\n // Update all records\n await table.add(updatedRecords, { mode: 'overwrite' });\n return;\n }\n } catch (err) {\n this.logger.error(`Error checking schema for table ${tableName}:` + err);\n // Continue to the next table if there's an error\n continue;\n }\n }\n\n throw new Error(`No table found with column/index '${indexName}'`);\n } catch (error: any) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...('id' in params && params.id && { id: params.id }),\n ...('filter' in params && params.filter && { filter: JSON.stringify(params.filter) }),\n hasVector: !!update.vector,\n hasMetadata: !!update.metadata,\n },\n },\n error,\n );\n }\n }\n\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n if (!id) {\n throw new Error('id is required');\n }\n } catch (err) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTOR_FAILED_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n err,\n );\n }\n\n try {\n // In LanceDB, the indexName is actually a column name in a table\n // We need to find which table has this column as an index\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n\n try {\n // Try to get the schema to check if this table has the column we're looking for\n const schema = await table.schema();\n const hasColumn = schema.fields.some(field => field.name === indexName);\n\n if (hasColumn) {\n this.logger.debug(`Found column ${indexName} in table ${tableName}`);\n await table.delete(`id = '${id}'`);\n return;\n }\n } catch (err) {\n this.logger.error(`Error checking schema for table ${tableName}:` + err);\n // Continue to the next table if there's an error\n continue;\n }\n }\n\n throw new Error(`No table found with column/index '${indexName}'`);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Converts a flattened object with keys using underscore notation back to a nested object.\n * Example: { name: 'test', details_text: 'test' } → { name: 'test', details: { text: 'test' } }\n */\n private unflattenObject(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n Object.keys(obj).forEach(key => {\n const value = obj[key];\n const parts = key.split('_');\n\n // Start with the result object\n let current = result;\n\n // Process all parts except the last one\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n // Skip empty parts\n if (!part) continue;\n\n // Create nested object if it doesn't exist\n if (!current[part] || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part];\n }\n\n // Set the value at the last part\n const lastPart = parts[parts.length - 1];\n if (lastPart) {\n current[lastPart] = value;\n }\n });\n\n return result;\n }\n\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams<LanceVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (ids && filter) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'ids and filter are mutually exclusive',\n details: { indexName },\n });\n }\n\n if (!ids && !filter) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Either filter or ids must be provided',\n details: { indexName },\n });\n }\n\n // Validate non-empty arrays and objects\n if (ids && ids.length === 0) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot delete with empty ids array',\n details: { indexName },\n });\n }\n\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot delete with empty filter',\n details: { indexName },\n });\n }\n\n try {\n if (!this.lanceClient) {\n throw new Error('LanceDB client not initialized. Use LanceVectorStore.create() to create an instance');\n }\n\n if (!indexName) {\n throw new Error('indexName is required');\n }\n\n // In LanceDB, the indexName is actually a column name in a table\n // We need to find which table has this column as an index\n const tables = await this.lanceClient.tableNames();\n\n for (const tableName of tables) {\n this.logger.debug('Checking table:' + tableName);\n const table = await this.lanceClient.openTable(tableName);\n\n try {\n const schema = await table.schema();\n const hasColumn = schema.fields.some(field => field.name === indexName);\n\n if (hasColumn) {\n this.logger.debug(`Found column ${indexName} in table ${tableName}`);\n\n if (ids) {\n // Delete by IDs\n const idsConditions = ids.map(id => `id = '${id}'`).join(' OR ');\n await table.delete(idsConditions);\n } else if (filter) {\n // Delete by filter using SQL WHERE clause\n const translator = new LanceFilterTranslator();\n const processFilterKeys = (filter: Record<string, any>): Record<string, any> => {\n const processedFilter: Record<string, any> = {};\n Object.entries(filter).forEach(([key, value]) => {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.entries(value).forEach(([nestedKey, nestedValue]) => {\n processedFilter[`metadata_${key}_${nestedKey}`] = nestedValue;\n });\n } else {\n processedFilter[`metadata_${key}`] = value;\n }\n });\n return processedFilter;\n };\n\n const prefixedFilter = processFilterKeys(filter as Record<string, any>);\n const whereClause = translator.translate(prefixedFilter);\n\n if (!whereClause) {\n throw new Error('Failed to translate filter to SQL');\n }\n\n await table.delete(whereClause);\n }\n\n return;\n }\n } catch (err) {\n this.logger.error(`Error checking schema for table ${tableName}:` + err);\n // Continue to the next table if there's an error\n continue;\n }\n }\n\n throw new Error(`No table found with column/index '${indexName}'`);\n } catch (error: any) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'STORAGE_LANCE_VECTOR_DELETE_VECTORS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\n }\n }\n}\n"]}