@mastra/libsql 1.0.0-beta.2 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vector/filter.ts","../src/vector/sql-builder.ts","../src/vector/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/observability/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/prompt.ts"],"names":["result","conditions","operator","operatorValue","MastraError","ErrorDomain","ErrorCategory","parseSqlIdentifier","buildCondition","TABLE_SPANS","normalizePerPage","calculatePagination","safelyParseJSON","TABLE_WORKFLOW_SNAPSHOT","createClient"],"mappings":"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","file":"index.js","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type { VectorFilter, OperatorSupport, OperatorValueMap, VectorFieldValue } from '@mastra/core/vector/filter';\n\ntype LibSQLOperatorValueMap = Omit<\n OperatorValueMap,\n '$regex' | '$options' | '$in' | '$all' | '$nin' | '$eq' | '$ne'\n> & {\n $size: number;\n $contains: VectorFieldValue | Record<string, unknown>;\n $all: VectorFieldValue;\n $in: VectorFieldValue;\n $nin: VectorFieldValue;\n $eq: VectorFieldValue;\n $ne: VectorFieldValue;\n};\nexport type LibSQLVectorFilter = VectorFilter<keyof LibSQLOperatorValueMap, LibSQLOperatorValueMap>;\n\n/**\n * Translates MongoDB-style filters to LibSQL compatible filters.\n *\n * Key differences from MongoDB:\n *\n * Logical Operators ($and, $or, $nor):\n * - Can be used at the top level or nested within fields\n * - Can take either a single condition or an array of conditions\n *\n */\nexport class LibSQLFilterTranslator extends BaseFilterTranslator<LibSQLVectorFilter> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n regex: [],\n custom: ['$contains', '$size'],\n };\n }\n\n translate(filter?: LibSQLVectorFilter): LibSQLVectorFilter {\n if (this.isEmpty(filter)) {\n return filter;\n }\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private translateNode(node: LibSQLVectorFilter, currentPath: string = ''): any {\n if (this.isRegex(node)) {\n throw new Error('Direct regex pattern format is not supported in LibSQL');\n }\n // Helper to wrap result with path if needed\n const withPath = (result: any) => (currentPath ? { [currentPath]: result } : result);\n\n // Handle primitives\n if (this.isPrimitive(node)) {\n return withPath({ $eq: this.normalizeComparisonValue(node) });\n }\n\n // Handle arrays\n if (Array.isArray(node)) {\n return withPath({ $in: this.normalizeArrayValues(node) });\n }\n\n // Handle regex\n // TODO: Look more into regex support for LibSQL\n // if (node instanceof RegExp) {\n // return withPath(this.translateRegexPattern(node.source, node.flags));\n // }\n\n const entries = Object.entries(node as Record<string, any>);\n const result: Record<string, any> = {};\n\n // if ('$options' in node && !('$regex' in node)) {\n // throw new Error('$options is not valid without $regex');\n // }\n\n // TODO: Look more into regex support for LibSQL\n // // Handle special regex object format\n // if ('$regex' in node) {\n // const options = (node as any).$options || '';\n // return withPath(this.translateRegexPattern(node.$regex, options));\n // }\n\n // Process remaining entries\n for (const [key, value] of entries) {\n // // Skip options as they're handled with $regex\n // if (key === '$options') continue;\n\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n\n if (this.isLogicalOperator(key)) {\n result[key] = Array.isArray(value)\n ? value.map((filter: LibSQLVectorFilter) => this.translateNode(filter))\n : this.translateNode(value);\n } else if (this.isOperator(key)) {\n if (this.isArrayOperator(key) && !Array.isArray(value) && key !== '$elemMatch') {\n result[key] = [value];\n } else if (this.isBasicOperator(key) && Array.isArray(value)) {\n result[key] = JSON.stringify(value);\n } else {\n result[key] = value;\n }\n } else if (typeof value === 'object' && value !== null) {\n // Handle nested objects\n const hasOperators = Object.keys(value).some(k => this.isOperator(k));\n if (hasOperators) {\n result[newPath] = this.translateNode(value);\n } else {\n Object.assign(result, this.translateNode(value, newPath));\n }\n } else {\n result[newPath] = this.translateNode(value);\n }\n }\n\n return result;\n }\n\n // TODO: Look more into regex support for LibSQL\n // private translateRegexPattern(pattern: string, options: string = ''): any {\n // if (!options) return { $regex: pattern };\n\n // const flags = options\n // .split('')\n // .filter(f => 'imsux'.includes(f))\n // .join('');\n\n // return {\n // $regex: pattern,\n // $options: flags,\n // };\n // }\n}\n","import type { InValue } from '@libsql/client';\nimport { parseFieldKey } from '@mastra/core/utils';\nimport type {\n BasicOperator,\n NumericOperator,\n ArrayOperator,\n ElementOperator,\n LogicalOperator,\n} from '@mastra/core/vector/filter';\nimport type { LibSQLVectorFilter } from './filter';\n\ntype OperatorType =\n | BasicOperator\n | NumericOperator\n | ArrayOperator\n | ElementOperator\n | LogicalOperator\n | '$contains'\n | '$size';\n\ntype FilterOperator = {\n sql: string;\n needsValue: boolean;\n transformValue?: () => any;\n};\n\ntype OperatorFn = (key: string, value?: any) => FilterOperator;\n\n// Helper functions to create operators\nconst createBasicOperator = (symbol: string) => {\n return (key: string, value: any): FilterOperator => {\n const jsonPath = getJsonPath(key);\n return {\n sql: `CASE \n WHEN ? IS NULL THEN json_extract(metadata, ${jsonPath}) IS ${symbol === '=' ? '' : 'NOT'} NULL\n ELSE json_extract(metadata, ${jsonPath}) ${symbol} ?\n END`,\n needsValue: true,\n transformValue: () => {\n // Return the values directly, not in an object\n return [value, value];\n },\n };\n };\n};\nconst createNumericOperator = (symbol: string) => {\n return (key: string, value: any): FilterOperator => {\n const jsonPath = getJsonPath(key);\n\n // Check if the value is numeric or a string (like ISO date)\n const isNumeric =\n typeof value === 'number' || (typeof value === 'string' && !isNaN(Number(value)) && value.trim() !== '');\n\n if (isNumeric) {\n // For numeric values, cast to NUMERIC for proper comparison\n return {\n sql: `CAST(json_extract(metadata, ${jsonPath}) AS NUMERIC) ${symbol} ?`,\n needsValue: true,\n };\n } else {\n // For non-numeric strings (like ISO dates), compare as text\n return {\n sql: `CAST(json_extract(metadata, ${jsonPath}) AS TEXT) ${symbol} ?`,\n needsValue: true,\n };\n }\n };\n};\n\nconst validateJsonArray = (key: string) => {\n const jsonPath = getJsonPath(key);\n return `json_valid(json_extract(metadata, ${jsonPath}))\n AND json_type(json_extract(metadata, ${jsonPath})) = 'array'`;\n};\n\nconst pattern = /json_extract\\(metadata, '\\$\\.(?:\"[^\"]*\"(?:\\.\"[^\"]*\")*|[^']+)'\\)/g;\n\nfunction buildElemMatchConditions(value: any) {\n const conditions = Object.entries(value).map(([field, fieldValue]) => {\n if (field.startsWith('$')) {\n // Direct operators on array elements ($in, $gt, etc)\n const { sql, values } = buildCondition('elem.value', { [field]: fieldValue }, '');\n // Replace the metadata path with elem.value\n const elemSql = sql.replace(pattern, 'elem.value');\n return { sql: elemSql, values };\n } else if (typeof fieldValue === 'object' && !Array.isArray(fieldValue)) {\n // Nested field with operators (count: { $gt: 20 })\n const { sql, values } = buildCondition(field, fieldValue, '');\n // Replace the field path with elem.value path\n const jsonPath = parseJsonPathKey(field);\n const elemSql = sql.replace(pattern, `json_extract(elem.value, '$.${jsonPath}')`);\n return { sql: elemSql, values };\n } else {\n const jsonPath = parseJsonPathKey(field);\n // Simple field equality (warehouse: 'A')\n return {\n sql: `json_extract(elem.value, '$.${jsonPath}') = ?`,\n values: [fieldValue],\n };\n }\n });\n\n return conditions;\n}\n\n// Define all filter operators\nconst FILTER_OPERATORS: Record<OperatorType, OperatorFn> = {\n $eq: createBasicOperator('='),\n $ne: createBasicOperator('!='),\n $gt: createNumericOperator('>'),\n $gte: createNumericOperator('>='),\n $lt: createNumericOperator('<'),\n $lte: createNumericOperator('<='),\n\n // Array Operators\n $in: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n const arr = Array.isArray(value) ? value : [value];\n if (arr.length === 0) {\n return { sql: '1 = 0', needsValue: true, transformValue: () => [] };\n }\n const paramPlaceholders = arr.map(() => '?').join(',');\n return {\n sql: `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n EXISTS (\n SELECT 1 FROM json_each(json_extract(metadata, ${jsonPath})) as elem\n WHERE elem.value IN (SELECT value FROM json_each(?))\n )\n ELSE json_extract(metadata, ${jsonPath}) IN (${paramPlaceholders})\n END\n )`,\n needsValue: true,\n transformValue: () => [JSON.stringify(arr), ...arr],\n };\n },\n\n $nin: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n const arr = Array.isArray(value) ? value : [value];\n if (arr.length === 0) {\n return { sql: '1 = 1', needsValue: true, transformValue: () => [] };\n }\n const paramPlaceholders = arr.map(() => '?').join(',');\n return {\n sql: `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n NOT EXISTS (\n SELECT 1 FROM json_each(json_extract(metadata, ${jsonPath})) as elem\n WHERE elem.value IN (SELECT value FROM json_each(?))\n )\n ELSE json_extract(metadata, ${jsonPath}) NOT IN (${paramPlaceholders})\n END\n )`,\n needsValue: true,\n transformValue: () => [JSON.stringify(arr), ...arr],\n };\n },\n $all: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n let sql: string;\n const arrayValue = Array.isArray(value) ? value : [value];\n\n if (arrayValue.length === 0) {\n // If the array is empty, always return false (no matches)\n sql = '1 = 0';\n } else {\n sql = `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n NOT EXISTS (\n SELECT value\n FROM json_each(?)\n WHERE value NOT IN (\n SELECT value\n FROM json_each(json_extract(metadata, ${jsonPath}))\n )\n )\n ELSE FALSE\n END\n )`;\n }\n\n return {\n sql,\n needsValue: true,\n transformValue: () => {\n if (arrayValue.length === 0) {\n return [];\n }\n return [JSON.stringify(arrayValue)];\n },\n };\n },\n $elemMatch: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('$elemMatch requires an object with conditions');\n }\n\n // For nested object conditions\n const conditions = buildElemMatchConditions(value);\n\n return {\n sql: `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n EXISTS (\n SELECT 1\n FROM json_each(json_extract(metadata, ${jsonPath})) as elem\n WHERE ${conditions.map(c => c.sql).join(' AND ')}\n )\n ELSE FALSE\n END\n )`,\n needsValue: true,\n transformValue: () => conditions.flatMap(c => c.values),\n };\n },\n\n // Element Operators\n $exists: (key: string) => {\n const jsonPath = getJsonPath(key);\n return {\n sql: `json_extract(metadata, ${jsonPath}) IS NOT NULL`,\n needsValue: false,\n };\n },\n\n // Logical Operators\n $and: (key: string) => ({\n sql: `(${key})`,\n needsValue: false,\n }),\n $or: (key: string) => ({\n sql: `(${key})`,\n needsValue: false,\n }),\n $not: key => ({ sql: `NOT (${key})`, needsValue: false }),\n $nor: (key: string) => ({\n sql: `NOT (${key})`,\n needsValue: false,\n }),\n $size: (key: string, paramIndex: number) => {\n const jsonPath = getJsonPath(key);\n return {\n sql: `(\n CASE\n WHEN json_type(json_extract(metadata, ${jsonPath})) = 'array' THEN \n json_array_length(json_extract(metadata, ${jsonPath})) = $${paramIndex}\n ELSE FALSE\n END\n )`,\n needsValue: true,\n };\n },\n // /**\n // * Regex Operators\n // * Supports case insensitive and multiline\n // */\n // $regex: (key: string): FilterOperator => ({\n // sql: `json_extract(metadata, '$.\"${toJsonPathKey(key)}\"') = ?`,\n // needsValue: true,\n // transformValue: (value: any) => {\n // const pattern = typeof value === 'object' ? value.$regex : value;\n // const options = typeof value === 'object' ? value.$options || '' : '';\n // let sql = `json_extract(metadata, '$.\"${toJsonPathKey(key)}\"')`;\n\n // // Handle multiline\n // // if (options.includes('m')) {\n // // sql = `REPLACE(${sql}, CHAR(10), '\\n')`;\n // // }\n\n // // let finalPattern = pattern;\n // // if (options) {\n // // finalPattern = `(\\\\?${options})${pattern}`;\n // // }\n\n // // // Handle case insensitivity\n // // if (options.includes('i')) {\n // // sql = `LOWER(${sql}) REGEXP LOWER(?)`;\n // // } else {\n // // sql = `${sql} REGEXP ?`;\n // // }\n\n // if (options.includes('m')) {\n // sql = `EXISTS (\n // SELECT 1\n // FROM json_each(\n // json_array(\n // ${sql},\n // REPLACE(${sql}, CHAR(10), CHAR(13))\n // )\n // ) as lines\n // WHERE lines.value REGEXP ?\n // )`;\n // } else {\n // sql = `${sql} REGEXP ?`;\n // }\n\n // // Handle case insensitivity\n // if (options.includes('i')) {\n // sql = sql.replace('REGEXP ?', 'REGEXP LOWER(?)');\n // sql = sql.replace('value REGEXP', 'LOWER(value) REGEXP');\n // }\n\n // // Handle extended - allows whitespace and comments in pattern\n // if (options.includes('x')) {\n // // Remove whitespace and comments from pattern\n // const cleanPattern = pattern.replace(/\\s+|#.*$/gm, '');\n // return {\n // sql,\n // values: [cleanPattern],\n // };\n // }\n\n // return {\n // sql,\n // values: [pattern],\n // };\n // },\n // }),\n $contains: (key: string, value: any) => {\n const jsonPathKey = parseJsonPathKey(key);\n let sql;\n if (Array.isArray(value)) {\n sql = `(\n SELECT ${validateJsonArray(jsonPathKey)}\n AND EXISTS (\n SELECT 1\n FROM json_each(json_extract(metadata, '$.\"${jsonPathKey}\"')) as m\n WHERE m.value IN (SELECT value FROM json_each(?))\n )\n )`;\n } else if (typeof value === 'string') {\n sql = `lower(json_extract(metadata, '$.\"${jsonPathKey}\"')) LIKE '%' || lower(?) || '%' ESCAPE '\\\\'`;\n } else {\n sql = `json_extract(metadata, '$.\"${jsonPathKey}\"') = ?`;\n }\n return {\n sql,\n needsValue: true,\n transformValue: () => {\n if (Array.isArray(value)) {\n return [JSON.stringify(value)];\n }\n if (typeof value === 'object' && value !== null) {\n return [JSON.stringify(value)];\n }\n if (typeof value === 'string') {\n return [escapeLikePattern(value)];\n }\n return [value];\n },\n };\n },\n /**\n * $objectContains: True JSON containment for advanced use (deep sub-object match).\n * Usage: { field: { $objectContains: { ...subobject } } }\n */\n // $objectContains: (key: string) => ({\n // sql: '', // Will be overridden by transformValue\n // needsValue: true,\n // transformValue: (value: any) => ({\n // sql: `json_type(json_extract(metadata, '$.\"${toJsonPathKey(key)}\"')) = 'object'\n // AND json_patch(json_extract(metadata, '$.\"${toJsonPathKey(key)}\"'), ?) = json_extract(metadata, '$.\"${toJsonPathKey(key)}\"')`,\n // values: [JSON.stringify(value)],\n // }),\n // }),\n};\n\ninterface FilterResult {\n sql: string;\n values: InValue[];\n}\n\nfunction isFilterResult(obj: any): obj is FilterResult {\n return obj && typeof obj === 'object' && typeof obj.sql === 'string' && Array.isArray(obj.values);\n}\n\nconst parseJsonPathKey = (key: string) => {\n const parsedKey = parseFieldKey(key);\n // Only add quotes around path segments if they contain dots\n if (parsedKey.includes('.')) {\n return parsedKey\n .split('.')\n .map(segment => `\"${segment}\"`)\n .join('.');\n }\n return parsedKey;\n};\n\n// Helper to generate the correct JSON path format for LibSQL\nconst getJsonPath = (key: string) => {\n const jsonPathKey = parseJsonPathKey(key);\n // Always use quotes for consistency\n return `'$.${jsonPathKey}'`;\n};\n\nfunction escapeLikePattern(str: string): string {\n return str.replace(/([%_\\\\])/g, '\\\\$1');\n}\n\nexport function buildFilterQuery(filter: LibSQLVectorFilter): FilterResult {\n if (!filter) {\n return { sql: '', values: [] };\n }\n\n const values: InValue[] = [];\n const conditions = Object.entries(filter)\n .map(([key, value]) => {\n const condition = buildCondition(key, value, '');\n values.push(...condition.values);\n return condition.sql;\n })\n .join(' AND ');\n\n return {\n sql: conditions ? `WHERE ${conditions}` : '',\n values,\n };\n}\n\nfunction buildCondition(key: string, value: any, parentPath: string): FilterResult {\n // Handle logical operators ($and/$or)\n if (['$and', '$or', '$not', '$nor'].includes(key)) {\n return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n }\n\n // If condition is not a FilterCondition object, assume it's an equality check\n if (!value || typeof value !== 'object') {\n const jsonPath = getJsonPath(key);\n return {\n sql: `json_extract(metadata, ${jsonPath}) = ?`,\n values: [value],\n };\n }\n\n //TODO: Add regex support\n // if ('$regex' in value) {\n // return handleRegexOperator(key, value);\n // }\n\n // Handle operator conditions\n return handleOperator(key, value);\n}\n\n// function handleRegexOperator(key: string, value: any): FilterResult {\n// const operatorFn = FILTER_OPERATORS['$regex']!;\n// const operatorResult = operatorFn(key, value);\n// const transformed = operatorResult.transformValue ? operatorResult.transformValue(value) : value;\n\n// return {\n// sql: transformed.sql,\n// values: transformed.values,\n// };\n// }\n\nfunction handleLogicalOperator(\n key: '$and' | '$or' | '$not' | '$nor',\n value: LibSQLVectorFilter[] | LibSQLVectorFilter,\n parentPath: string,\n): FilterResult {\n // Handle empty conditions\n if (!value || (Array.isArray(value) && value.length === 0)) {\n switch (key) {\n case '$and':\n case '$nor':\n return { sql: 'true', values: [] };\n case '$or':\n return { sql: 'false', values: [] };\n case '$not':\n throw new Error('$not operator cannot be empty');\n default:\n return { sql: 'true', values: [] };\n }\n }\n\n if (key === '$not') {\n // For top-level $not\n const entries = Object.entries(value);\n const conditions = entries.map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key));\n return {\n sql: `NOT (${conditions.map(c => c.sql).join(' AND ')})`,\n values: conditions.flatMap(c => c.values),\n };\n }\n\n const values: InValue[] = [];\n const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n const conditions = Array.isArray(value)\n ? value.map(f => {\n const entries = !!f ? Object.entries(f) : [];\n return entries.map(([k, v]) => buildCondition(k, v, key));\n })\n : [buildCondition(key, value, parentPath)];\n\n const joined = conditions\n .flat()\n .map(c => {\n values.push(...c.values);\n return c.sql;\n })\n .join(` ${joinOperator} `);\n\n return {\n sql: key === '$nor' ? `NOT (${joined})` : `(${joined})`,\n values,\n };\n}\n\nfunction handleOperator(key: string, value: any): FilterResult {\n if (typeof value === 'object' && !Array.isArray(value)) {\n const entries = Object.entries(value);\n const results = entries.map(([operator, operatorValue]) =>\n operator === '$not'\n ? {\n sql: `NOT (${Object.entries(operatorValue as Record<string, any>)\n .map(([op, val]) => processOperator(key, op as OperatorType, val).sql)\n .join(' AND ')})`,\n values: Object.entries(operatorValue as Record<string, any>).flatMap(\n ([op, val]) => processOperator(key, op as OperatorType, val).values,\n ),\n }\n : processOperator(key, operator as OperatorType, operatorValue),\n );\n\n return {\n sql: `(${results.map(r => r.sql).join(' AND ')})`,\n values: results.flatMap(r => r.values),\n };\n }\n\n // Handle single operator\n const [[operator, operatorValue] = []] = Object.entries(value);\n return processOperator(key, operator as OperatorType, operatorValue);\n}\n\nconst processOperator = (key: string, operator: OperatorType, operatorValue: any): FilterResult => {\n if (!operator.startsWith('$') || !FILTER_OPERATORS[operator]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n const operatorFn = FILTER_OPERATORS[operator]!;\n const operatorResult = operatorFn(key, operatorValue);\n\n if (!operatorResult.needsValue) {\n return { sql: operatorResult.sql, values: [] };\n }\n\n const transformed = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n\n if (isFilterResult(transformed)) {\n return transformed;\n }\n\n return {\n sql: operatorResult.sql,\n values: Array.isArray(transformed) ? transformed : [transformed],\n };\n};\n","import { createClient } from '@libsql/client';\nimport type { Client as TursoClient, InValue } from '@libsql/client';\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport type { LibSQLVectorFilter } from './filter';\nimport { LibSQLFilterTranslator } from './filter';\nimport { buildFilterQuery } from './sql-builder';\n\ninterface LibSQLQueryVectorParams extends QueryVectorParams<LibSQLVectorFilter> {\n minScore?: number;\n}\n\nexport interface LibSQLVectorConfig {\n connectionUrl: string;\n authToken?: string;\n syncUrl?: string;\n syncInterval?: number;\n /**\n * Maximum number of retries for write operations if an SQLITE_BUSY error occurs.\n * @default 5\n */\n maxRetries?: number;\n /**\n * Initial backoff time in milliseconds for retrying write operations on SQLITE_BUSY.\n * The backoff time will double with each retry (exponential backoff).\n * @default 100\n */\n initialBackoffMs?: number;\n}\n\nexport class LibSQLVector extends MastraVector<LibSQLVectorFilter> {\n private turso: TursoClient;\n private readonly maxRetries: number;\n private readonly initialBackoffMs: number;\n\n constructor({\n connectionUrl,\n authToken,\n syncUrl,\n syncInterval,\n maxRetries = 5,\n initialBackoffMs = 100,\n id,\n }: LibSQLVectorConfig & { id: string }) {\n super({ id });\n\n this.turso = createClient({\n url: connectionUrl,\n syncUrl: syncUrl,\n authToken,\n syncInterval,\n });\n this.maxRetries = maxRetries;\n this.initialBackoffMs = initialBackoffMs;\n\n if (connectionUrl.includes(`file:`) || connectionUrl.includes(`:memory:`)) {\n this.turso\n .execute('PRAGMA journal_mode=WAL;')\n .then(() => this.logger.debug('LibSQLStore: PRAGMA journal_mode=WAL set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA journal_mode=WAL.', err));\n this.turso\n .execute('PRAGMA busy_timeout = 5000;')\n .then(() => this.logger.debug('LibSQLStore: PRAGMA busy_timeout=5000 set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA busy_timeout=5000.', err));\n }\n }\n\n private async executeWriteOperationWithRetry<T>(operation: () => Promise<T>, isTransaction = false): Promise<T> {\n let attempts = 0;\n let backoff = this.initialBackoffMs;\n while (attempts < this.maxRetries) {\n try {\n return await operation();\n } catch (error: any) {\n if (\n error.code === 'SQLITE_BUSY' ||\n (error.message && error.message.toLowerCase().includes('database is locked'))\n ) {\n attempts++;\n if (attempts >= this.maxRetries) {\n this.logger.error(\n `LibSQLVector: Operation failed after ${this.maxRetries} attempts due to: ${error.message}`,\n error,\n );\n throw error;\n }\n this.logger.warn(\n `LibSQLVector: Attempt ${attempts} failed due to ${isTransaction ? 'transaction ' : ''}database lock. Retrying in ${backoff}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, backoff));\n backoff *= 2;\n } else {\n throw error;\n }\n }\n }\n throw new Error('LibSQLVector: Max retries reached, but no error was re-thrown from the loop.');\n }\n\n transformFilter(filter?: LibSQLVectorFilter) {\n const translator = new LibSQLFilterTranslator();\n return translator.translate(filter);\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n minScore = -1, // Default to -1 to include all results (cosine similarity ranges from -1 to 1)\n }: LibSQLQueryVectorParams): Promise<QueryResult[]> {\n try {\n if (!Number.isInteger(topK) || topK <= 0) {\n throw new Error('topK must be a positive integer');\n }\n if (!Array.isArray(queryVector) || !queryVector.every(x => typeof x === 'number' && Number.isFinite(x))) {\n throw new Error('queryVector must be an array of finite numbers');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_QUERY_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\n try {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n\n const vectorStr = `[${queryVector.join(',')}]`;\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildFilterQuery(translatedFilter);\n filterValues.push(minScore);\n filterValues.push(topK);\n\n const query = `\n WITH vector_scores AS (\n SELECT\n vector_id as id,\n (1-vector_distance_cos(embedding, '${vectorStr}')) as score,\n metadata\n ${includeVector ? ', vector_extract(embedding) as embedding' : ''}\n FROM ${parsedIndexName}\n ${filterQuery}\n )\n SELECT *\n FROM vector_scores\n WHERE score > ?\n ORDER BY score DESC\n LIMIT ?`;\n\n const result = await this.turso.execute({\n sql: query,\n args: filterValues,\n });\n\n return result.rows.map(({ id, score, metadata, embedding }) => ({\n id: id as string,\n score: score as number,\n metadata: JSON.parse((metadata as string) ?? '{}'),\n ...(includeVector && embedding && { vector: JSON.parse(embedding as string) }),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n public upsert(args: UpsertVectorParams): Promise<string[]> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doUpsert(args), true);\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private async doUpsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n const tx = await this.turso.transaction('write');\n try {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n for (let i = 0; i < vectors.length; i++) {\n const query = `\n INSERT INTO ${parsedIndexName} (vector_id, embedding, metadata)\n VALUES (?, vector32(?), ?)\n ON CONFLICT(vector_id) DO UPDATE SET\n embedding = vector32(?),\n metadata = ?\n `;\n await tx.execute({\n sql: query,\n args: [\n vectorIds[i] as InValue,\n JSON.stringify(vectors[i]),\n JSON.stringify(metadata?.[i] || {}),\n JSON.stringify(vectors[i]),\n JSON.stringify(metadata?.[i] || {}),\n ],\n });\n }\n await tx.commit();\n return vectorIds;\n } catch (error) {\n !tx.closed && (await tx.rollback());\n if (error instanceof Error && error.message?.includes('dimensions are different')) {\n const match = error.message.match(/dimensions are different: (\\d+) != (\\d+)/);\n if (match) {\n const [, actual, expected] = match;\n throw new Error(\n `Vector dimension mismatch: Index \"${indexName}\" expects ${expected} dimensions but got ${actual} dimensions. ` +\n `Either use a matching embedding model or delete and recreate the index with the new dimension.`,\n );\n }\n }\n throw error;\n }\n }\n\n public createIndex(args: CreateIndexParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doCreateIndex(args));\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: args.indexName, dimension: args.dimension },\n },\n error,\n );\n }\n }\n\n private async doCreateIndex({ indexName, dimension }: CreateIndexParams): Promise<void> {\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n await this.turso.execute({\n sql: `\n CREATE TABLE IF NOT EXISTS ${parsedIndexName} (\n id SERIAL PRIMARY KEY,\n vector_id TEXT UNIQUE NOT NULL,\n embedding F32_BLOB(${dimension}),\n metadata TEXT DEFAULT '{}'\n );\n `,\n args: [],\n });\n await this.turso.execute({\n sql: `\n CREATE INDEX IF NOT EXISTS ${parsedIndexName}_vector_idx\n ON ${parsedIndexName} (libsql_vector_idx(embedding))\n `,\n args: [],\n });\n }\n\n public deleteIndex(args: DeleteIndexParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doDeleteIndex(args));\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: args.indexName },\n },\n error,\n );\n }\n }\n\n private async doDeleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n await this.turso.execute({\n sql: `DROP TABLE IF EXISTS ${parsedIndexName}`,\n args: [],\n });\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const vectorTablesQuery = `\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND sql LIKE '%F32_BLOB%';\n `;\n const result = await this.turso.execute({\n sql: vectorTablesQuery,\n args: [],\n });\n return result.rows.map(row => row.name as string);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_LIST_INDEXES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n // Get table info including column info\n const tableInfoQuery = `\n SELECT sql \n FROM sqlite_master \n WHERE type='table' \n AND name = ?;\n `;\n const tableInfo = await this.turso.execute({\n sql: tableInfoQuery,\n args: [parsedIndexName],\n });\n\n if (!tableInfo.rows[0]?.sql) {\n throw new Error(`Table ${parsedIndexName} not found`);\n }\n\n // Extract dimension from F32_BLOB definition\n const dimension = parseInt((tableInfo.rows[0].sql as string).match(/F32_BLOB\\((\\d+)\\)/)?.[1] || '0');\n\n // Get row count\n const countQuery = `\n SELECT COUNT(*) as count\n FROM ${parsedIndexName};\n `;\n const countResult = await this.turso.execute({\n sql: countQuery,\n args: [],\n });\n\n // LibSQL only supports cosine similarity currently\n const metric: 'cosine' | 'euclidean' | 'dotproduct' = 'cosine';\n\n return {\n dimension,\n count: (countResult?.rows?.[0]?.count as number) ?? 0,\n metric,\n };\n } catch (e: any) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n e,\n );\n }\n }\n\n /**\n * Updates a vector by its ID with the provided vector and/or metadata.\n *\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n public updateVector(args: UpdateVectorParams<LibSQLVectorFilter>): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doUpdateVector(args));\n }\n\n private async doUpdateVector(params: UpdateVectorParams<LibSQLVectorFilter>): Promise<void> {\n const { indexName, update } = params;\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n\n // Validate that both id and filter are not provided at the same time\n if ('id' in params && params.id && 'filter' in params && params.filter) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_UPDATE_MUTUALLY_EXCLUSIVE_PARAMS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'id and filter are mutually exclusive - provide only one',\n });\n }\n\n if (!update.vector && !update.metadata) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'No updates provided',\n });\n }\n\n const updates: string[] = [];\n const args: InValue[] = [];\n\n if (update.vector) {\n updates.push('embedding = vector32(?)');\n args.push(JSON.stringify(update.vector));\n }\n\n if (update.metadata) {\n updates.push('metadata = ?');\n args.push(JSON.stringify(update.metadata));\n }\n\n if (updates.length === 0) {\n return;\n }\n\n let whereClause: string;\n let whereValues: InValue[];\n\n // Type narrowing: check if updating by id or by filter\n if ('id' in params && params.id) {\n // Update by ID\n whereClause = 'vector_id = ?';\n whereValues = [params.id];\n } else if ('filter' in params && params.filter) {\n // Update by filter\n const filter = params.filter;\n\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_UPDATE_EMPTY_FILTER',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot update with empty filter',\n });\n }\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterSql, values: filterValues } = buildFilterQuery(translatedFilter);\n\n if (!filterSql || filterSql.trim() === '') {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_UPDATE_INVALID_FILTER',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Filter produced empty WHERE clause',\n });\n }\n\n // Guard against match-all patterns that would update all vectors\n // Normalize SQL by removing WHERE prefix and extra whitespace for pattern matching\n const normalizedCondition = filterSql\n .replace(/^\\s*WHERE\\s+/i, '')\n .trim()\n .toLowerCase();\n const matchAllPatterns = ['true', '1 = 1', '1=1'];\n\n if (matchAllPatterns.includes(normalizedCondition)) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_UPDATE_MATCH_ALL_FILTER',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, filterSql: normalizedCondition },\n text: 'Filter matches all vectors. Provide a specific filter to update targeted vectors.',\n });\n }\n\n // buildFilterQuery already includes \"WHERE\" in the SQL, so we need to extract just the condition\n whereClause = filterSql.replace(/^WHERE\\s+/i, '');\n whereValues = filterValues;\n } else {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_UPDATE_MISSING_PARAMS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Either id or filter must be provided',\n });\n }\n\n const query = `\n UPDATE ${parsedIndexName}\n SET ${updates.join(', ')}\n WHERE ${whereClause};\n `;\n\n try {\n await this.turso.execute({\n sql: query,\n args: [...args, ...whereValues],\n });\n } catch (error) {\n const errorDetails: Record<string, any> = { indexName };\n\n if ('id' in params && params.id) {\n errorDetails.id = params.id;\n }\n\n if ('filter' in params && params.filter) {\n errorDetails.filter = JSON.stringify(params.filter);\n }\n\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: errorDetails,\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n public deleteVector(args: DeleteVectorParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doDeleteVector(args));\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName: args.indexName,\n ...(args.id && { id: args.id }),\n },\n },\n error,\n );\n }\n }\n\n private async doDeleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n await this.turso.execute({\n sql: `DELETE FROM ${parsedIndexName} WHERE vector_id = ?`,\n args: [id],\n });\n }\n\n public deleteVectors(args: DeleteVectorsParams<LibSQLVectorFilter>): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doDeleteVectors(args));\n }\n\n private async doDeleteVectors({ indexName, filter, ids }: DeleteVectorsParams<LibSQLVectorFilter>): Promise<void> {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n\n // Validate that exactly one of filter or ids is provided\n if (!filter && !ids) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_DELETE_MISSING_PARAMS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Either filter or ids must be provided',\n });\n }\n\n if (filter && ids) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_DELETE_CONFLICTING_PARAMS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot provide both filter and ids - they are mutually exclusive',\n });\n }\n\n let query: string;\n let values: InValue[];\n\n if (ids) {\n // Delete by IDs\n if (ids.length === 0) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_DELETE_EMPTY_IDS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot delete with empty ids array',\n });\n }\n\n const placeholders = ids.map(() => '?').join(', ');\n query = `DELETE FROM ${parsedIndexName} WHERE vector_id IN (${placeholders})`;\n values = ids;\n } else {\n // Delete by filter\n // Safety check: Don't allow empty filters to prevent accidental deletion of all vectors\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_DELETE_EMPTY_FILTER',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot delete with empty filter. Use deleteIndex to delete all vectors.',\n });\n }\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterSql, values: filterValues } = buildFilterQuery(translatedFilter);\n\n if (!filterSql || filterSql.trim() === '') {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_DELETE_INVALID_FILTER',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Filter produced empty WHERE clause',\n });\n }\n\n // Guard against match-all patterns that would delete all vectors\n // Normalize SQL by removing WHERE prefix and extra whitespace for pattern matching\n const normalizedCondition = filterSql\n .replace(/^\\s*WHERE\\s+/i, '')\n .trim()\n .toLowerCase();\n const matchAllPatterns = ['true', '1 = 1', '1=1'];\n\n if (matchAllPatterns.includes(normalizedCondition)) {\n throw new MastraError({\n id: 'LIBSQL_VECTOR_DELETE_MATCH_ALL_FILTER',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, filterSql: normalizedCondition },\n text: 'Filter matches all vectors. Use deleteIndex to delete all vectors from an index.',\n });\n }\n\n // buildFilterQuery already includes \"WHERE\" in the SQL\n query = `DELETE FROM ${parsedIndexName} ${filterSql}`;\n values = filterValues;\n }\n\n try {\n await this.turso.execute({\n sql: query,\n args: values,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_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 public truncateIndex(args: DeleteIndexParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this._doTruncateIndex(args));\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_VECTOR_TRUNCATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: args.indexName },\n },\n error,\n );\n }\n }\n\n private async _doTruncateIndex({ indexName }: DeleteIndexParams): Promise<void> {\n await this.turso.execute({\n sql: `DELETE FROM ${parseSqlIdentifier(indexName, 'index name')}`,\n args: [],\n });\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { MessageList } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n} from '@mastra/core/storage';\nimport {\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport type { StoreOperationsLibSQL } from '../operations';\n\nexport class MemoryLibSQL extends MemoryStorage {\n private client: Client;\n private operations: StoreOperationsLibSQL;\n constructor({ client, operations }: { client: Client; operations: StoreOperationsLibSQL }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n private parseRow(row: any): MastraDBMessage {\n let content = row.content;\n try {\n content = JSON.parse(row.content);\n } catch {\n // use content as is if it's not JSON\n }\n const result = {\n id: row.id,\n content,\n role: row.role,\n createdAt: new Date(row.createdAt as string),\n threadId: row.thread_id,\n resourceId: row.resourceId,\n } as MastraDBMessage;\n if (row.type && row.type !== `v2`) result.type = row.type;\n return result;\n }\n\n private async _getIncludedMessages({\n threadId,\n include,\n }: {\n threadId: string;\n include: StorageListMessagesInput['include'];\n }) {\n if (!threadId.trim()) throw new Error('threadId must be a non-empty string');\n\n if (!include) return null;\n\n const unionQueries: string[] = [];\n const params: any[] = [];\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n // if threadId is provided, use it, otherwise use threadId from args\n const searchId = inc.threadId || threadId;\n unionQueries.push(\n `\n SELECT * FROM (\n WITH numbered_messages AS (\n SELECT\n id, content, role, type, \"createdAt\", thread_id, \"resourceId\",\n ROW_NUMBER() OVER (ORDER BY \"createdAt\" ASC) as row_num\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = ?\n ),\n target_positions AS (\n SELECT row_num as target_pos\n FROM numbered_messages\n WHERE id = ?\n )\n SELECT DISTINCT m.*\n FROM numbered_messages m\n CROSS JOIN target_positions t\n WHERE m.row_num BETWEEN (t.target_pos - ?) AND (t.target_pos + ?)\n ) \n `, // Keep ASC for final sorting after fetching context\n );\n params.push(searchId, id, withPreviousMessages, withNextMessages);\n }\n const finalQuery = unionQueries.join(' UNION ALL ') + ' ORDER BY \"createdAt\" ASC';\n const includedResult = await this.client.execute({ sql: finalQuery, args: params });\n const includedRows = includedResult.rows?.map(row => this.parseRow(row));\n const seen = new Set<string>();\n const dedupedRows = includedRows.filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n return dedupedRows;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n const sql = `\n SELECT \n id, \n content, \n role, \n type,\n \"createdAt\", \n thread_id,\n \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE id IN (${messageIds.map(() => '?').join(', ')})\n ORDER BY \"createdAt\" DESC\n `;\n const result = await this.client.execute({ sql, args: messageIds });\n if (!result.rows) return { messages: [] };\n\n const list = new MessageList().add(result.rows.map(this.parseRow), 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\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_LIBSQL_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 if (page < 0) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_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 const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n // Determine sort field and direction\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n // Build WHERE conditions\n const conditions: string[] = [`thread_id = ?`];\n const queryParams: InValue[] = [threadId];\n\n if (resourceId) {\n conditions.push(`\"resourceId\" = ?`);\n queryParams.push(resourceId);\n }\n\n if (filter?.dateRange?.start) {\n conditions.push(`\"createdAt\" >= ?`);\n queryParams.push(\n filter.dateRange.start instanceof Date ? filter.dateRange.start.toISOString() : filter.dateRange.start,\n );\n }\n\n if (filter?.dateRange?.end) {\n conditions.push(`\"createdAt\" <= ?`);\n queryParams.push(\n filter.dateRange.end instanceof Date ? filter.dateRange.end.toISOString() : filter.dateRange.end,\n );\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_MESSAGES} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.client.execute({\n sql: `SELECT id, content, role, type, \"createdAt\", \"resourceId\", \"thread_id\" FROM ${TABLE_MESSAGES} ${whereClause} ${orderByStatement} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, offset],\n });\n const messages: MastraDBMessage[] = (dataResult.rows || []).map((row: any) => this.parseRow(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 const includeMessages = await this._getIncludedMessages({ threadId, include });\n if (includeMessages) {\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\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 isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(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 hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'LIBSQL_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({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages };\n\n try {\n const threadId = messages[0]?.threadId;\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Prepare batch statements for all messages\n const batchStatements = messages.map(message => {\n const time = message.createdAt || new Date();\n if (!message.threadId) {\n throw new Error(\n `Expected to find a threadId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n if (!message.resourceId) {\n throw new Error(\n `Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n return {\n sql: `INSERT INTO \"${TABLE_MESSAGES}\" (id, thread_id, content, role, type, \"createdAt\", \"resourceId\") \n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n thread_id=excluded.thread_id,\n content=excluded.content,\n role=excluded.role,\n type=excluded.type,\n \"resourceId\"=excluded.\"resourceId\"\n `,\n args: [\n message.id,\n message.threadId!,\n typeof message.content === 'object' ? JSON.stringify(message.content) : message.content,\n message.role,\n message.type || 'v2',\n time instanceof Date ? time.toISOString() : time,\n message.resourceId,\n ],\n };\n });\n\n const now = new Date().toISOString();\n batchStatements.push({\n sql: `UPDATE \"${TABLE_THREADS}\" SET \"updatedAt\" = ? WHERE id = ?`,\n args: [now, threadId],\n });\n\n // Execute in batches to avoid potential limitations\n const BATCH_SIZE = 50; // Safe batch size for libsql\n\n // Separate message statements from thread update\n const messageStatements = batchStatements.slice(0, -1);\n const threadUpdateStatement = batchStatements[batchStatements.length - 1];\n\n // Process message statements in batches\n for (let i = 0; i < messageStatements.length; i += BATCH_SIZE) {\n const batch = messageStatements.slice(i, i + BATCH_SIZE);\n if (batch.length > 0) {\n await this.client.batch(batch, 'write');\n }\n }\n\n // Execute thread update separately\n if (threadUpdateStatement) {\n await this.client.execute(threadUpdateStatement);\n }\n\n const list = new MessageList().add(messages as any, 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (messages.length === 0) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n const placeholders = messageIds.map(() => '?').join(',');\n\n const selectSql = `SELECT * FROM ${TABLE_MESSAGES} WHERE id IN (${placeholders})`;\n const existingResult = await this.client.execute({ sql: selectSql, args: messageIds });\n const existingMessages: MastraDBMessage[] = existingResult.rows.map(row => this.parseRow(row));\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n const batchStatements = [];\n const threadIdsToUpdate = new Set<string>();\n const columnMapping: Record<string, string> = {\n threadId: 'thread_id',\n };\n\n for (const existingMessage of existingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses = [];\n const args: InValue[] = [];\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for the 'content' field to merge instead of overwrite\n if (updatableFields.content) {\n const newContent = {\n ...existingMessage.content,\n ...updatableFields.content,\n // Deep merge metadata if it exists on both\n ...(existingMessage.content?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingMessage.content.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n setClauses.push(`${parseSqlIdentifier('content', 'column name')} = ?`);\n args.push(JSON.stringify(newContent));\n delete updatableFields.content;\n }\n\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbKey = columnMapping[key] || key;\n setClauses.push(`${parseSqlIdentifier(dbKey, 'column name')} = ?`);\n let value = updatableFields[key as keyof typeof updatableFields];\n\n if (typeof value === 'object' && value !== null) {\n value = JSON.stringify(value);\n }\n args.push(value as InValue);\n }\n }\n\n if (setClauses.length === 0) continue;\n\n args.push(id);\n\n const sql = `UPDATE ${TABLE_MESSAGES} SET ${setClauses.join(', ')} WHERE id = ?`;\n batchStatements.push({ sql, args });\n }\n\n if (batchStatements.length === 0) {\n return existingMessages;\n }\n\n const now = new Date().toISOString();\n for (const threadId of threadIdsToUpdate) {\n if (threadId) {\n batchStatements.push({\n sql: `UPDATE ${TABLE_THREADS} SET updatedAt = ? WHERE id = ?`,\n args: [now, threadId],\n });\n }\n }\n\n await this.client.batch(batchStatements, 'write');\n\n const updatedResult = await this.client.execute({ sql: selectSql, args: messageIds });\n return updatedResult.rows.map(row => this.parseRow(row));\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n try {\n // Process in batches to avoid SQL parameter limits\n const BATCH_SIZE = 100;\n const threadIds = new Set<string>();\n\n // Use a transaction to ensure consistency\n const tx = await this.client.transaction('write');\n\n try {\n for (let i = 0; i < messageIds.length; i += BATCH_SIZE) {\n const batch = messageIds.slice(i, i + BATCH_SIZE);\n const placeholders = batch.map(() => '?').join(',');\n\n // Get thread IDs for this batch\n const result = await tx.execute({\n sql: `SELECT DISTINCT thread_id FROM \"${TABLE_MESSAGES}\" WHERE id IN (${placeholders})`,\n args: batch,\n });\n\n result.rows?.forEach(row => {\n if (row.thread_id) threadIds.add(row.thread_id as string);\n });\n\n // Delete messages in this batch\n await tx.execute({\n sql: `DELETE FROM \"${TABLE_MESSAGES}\" WHERE id IN (${placeholders})`,\n args: batch,\n });\n }\n\n // Update thread timestamps within the transaction\n if (threadIds.size > 0) {\n const now = new Date().toISOString();\n for (const threadId of threadIds) {\n await tx.execute({\n sql: `UPDATE \"${TABLE_THREADS}\" SET \"updatedAt\" = ? WHERE id = ?`,\n args: [now, threadId],\n });\n }\n }\n\n // Commit the transaction\n await tx.commit();\n } catch (error) {\n // Rollback on error\n await tx.rollback();\n throw error;\n }\n\n // TODO: Delete from vector store if semantic recall is enabled\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_DELETE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const result = await this.operations.load<StorageResourceType>({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n\n if (!result) {\n return null;\n }\n\n return {\n ...result,\n // Ensure workingMemory is always returned as a string, even if auto-parsed as JSON\n workingMemory:\n result.workingMemory && typeof result.workingMemory === 'object'\n ? JSON.stringify(result.workingMemory)\n : result.workingMemory,\n metadata: typeof result.metadata === 'string' ? JSON.parse(result.metadata) : result.metadata,\n createdAt: new Date(result.createdAt),\n updatedAt: new Date(result.updatedAt),\n };\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n await this.operations.insert({\n tableName: TABLE_RESOURCES,\n record: {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n },\n });\n\n return 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 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 updates: string[] = [];\n const values: InValue[] = [];\n\n if (workingMemory !== undefined) {\n updates.push('workingMemory = ?');\n values.push(workingMemory);\n }\n\n if (metadata) {\n updates.push('metadata = ?');\n values.push(JSON.stringify(updatedResource.metadata));\n }\n\n updates.push('updatedAt = ?');\n values.push(updatedResource.updatedAt.toISOString());\n\n values.push(resourceId);\n\n await this.client.execute({\n sql: `UPDATE ${TABLE_RESOURCES} SET ${updates.join(', ')} WHERE id = ?`,\n args: values,\n });\n\n return updatedResource;\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const result = await this.operations.load<\n Omit<StorageThreadType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }\n >({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!result) {\n return null;\n }\n\n return {\n ...result,\n metadata: typeof result.metadata === 'string' ? JSON.parse(result.metadata) : result.metadata,\n createdAt: new Date(result.createdAt),\n updatedAt: new Date(result.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_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 const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n const baseQuery = `FROM ${TABLE_THREADS} WHERE resourceId = ?`;\n const queryParams: InValue[] = [resourceId];\n\n const mapRowToStorageThreadType = (row: any): StorageThreadType => ({\n id: row.id as string,\n resourceId: row.resourceId as string,\n title: row.title as string,\n createdAt: new Date(row.createdAt as string), // Convert string to Date\n updatedAt: new Date(row.updatedAt as string), // Convert string to Date\n metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,\n });\n\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count ${baseQuery}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.client.execute({\n sql: `SELECT * ${baseQuery} ORDER BY \"${field}\" ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, offset],\n });\n\n const threads = (dataResult.rows || []).map(mapRowToStorageThreadType);\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'LIBSQL_STORE_LIST_THREADS_BY_RESOURCE_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.operations.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n metadata: JSON.stringify(thread.metadata),\n },\n });\n\n return thread;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: 'LIBSQL_STORE_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n throw mastraError;\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 thread = await this.getThreadById({ threadId: id });\n if (!thread) {\n throw new MastraError({\n id: 'LIBSQL_STORE_UPDATE_THREAD_FAILED_THREAD_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: {\n status: 404,\n threadId: id,\n },\n });\n }\n\n const updatedThread = {\n ...thread,\n title,\n metadata: {\n ...thread.metadata,\n ...metadata,\n },\n };\n\n try {\n await this.client.execute({\n sql: `UPDATE ${TABLE_THREADS} SET title = ?, metadata = ? WHERE id = ?`,\n args: [title, JSON.stringify(updatedThread.metadata), id],\n });\n\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to update thread ${id}`,\n details: { threadId: id },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n // Delete messages for this thread (manual step)\n try {\n await this.client.execute({\n sql: `DELETE FROM ${TABLE_MESSAGES} WHERE thread_id = ?`,\n args: [threadId],\n });\n await this.client.execute({\n sql: `DELETE FROM ${TABLE_THREADS} WHERE id = ?`,\n args: [threadId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n // TODO: Need to check if CASCADE is enabled so that messages will be automatically deleted due to CASCADE constraint\n }\n}\n","import type { InValue } from '@libsql/client';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { safelyParseJSON, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { PaginationArgs, StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nexport function createExecuteWriteOperationWithRetry({\n logger,\n maxRetries,\n initialBackoffMs,\n}: {\n logger: IMastraLogger;\n maxRetries: number;\n initialBackoffMs: number;\n}) {\n return async function executeWriteOperationWithRetry<T>(\n operationFn: () => Promise<T>,\n operationDescription: string,\n ): Promise<T> {\n let retries = 0;\n\n while (true) {\n try {\n return await operationFn();\n } catch (error: any) {\n if (\n error.message &&\n (error.message.includes('SQLITE_BUSY') || error.message.includes('database is locked')) &&\n retries < maxRetries\n ) {\n retries++;\n const backoffTime = initialBackoffMs * Math.pow(2, retries - 1);\n logger.warn(\n `LibSQLStore: Encountered SQLITE_BUSY during ${operationDescription}. Retrying (${retries}/${maxRetries}) in ${backoffTime}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, backoffTime));\n } else {\n logger.error(`LibSQLStore: Error during ${operationDescription} after ${retries} retries: ${error}`);\n throw error;\n }\n }\n }\n };\n}\n\nexport function prepareStatement({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): {\n sql: string;\n args: InValue[];\n} {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const columns = Object.keys(record).map(col => parseSqlIdentifier(col, 'column name'));\n const values = Object.values(record).map(v => {\n if (typeof v === `undefined` || v === null) {\n // returning an undefined value will cause libsql to throw\n return null;\n }\n if (v instanceof Date) {\n return v.toISOString();\n }\n return typeof v === 'object' ? JSON.stringify(v) : v;\n });\n const placeholders = values.map(() => '?').join(', ');\n\n return {\n sql: `INSERT OR REPLACE INTO ${parsedTableName} (${columns.join(', ')}) VALUES (${placeholders})`,\n args: values,\n };\n}\n\nexport function prepareUpdateStatement({\n tableName,\n updates,\n keys,\n}: {\n tableName: TABLE_NAMES;\n updates: Record<string, any>;\n keys: Record<string, any>;\n}): {\n sql: string;\n args: InValue[];\n} {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const schema = TABLE_SCHEMAS[tableName];\n\n // Prepare SET clause\n const updateColumns = Object.keys(updates).map(col => parseSqlIdentifier(col, 'column name'));\n const updateValues = Object.values(updates).map(transformToSqlValue);\n const setClause = updateColumns.map(col => `${col} = ?`).join(', ');\n\n const whereClause = prepareWhereClause(keys, schema);\n\n return {\n sql: `UPDATE ${parsedTableName} SET ${setClause}${whereClause.sql}`,\n args: [...updateValues, ...whereClause.args],\n };\n}\n\nexport function transformToSqlValue(value: any): InValue {\n if (typeof value === 'undefined' || value === null) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return typeof value === 'object' ? JSON.stringify(value) : value;\n}\n\nexport function prepareDeleteStatement({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): {\n sql: string;\n args: InValue[];\n} {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const whereClause = prepareWhereClause(keys, TABLE_SCHEMAS[tableName]);\n\n return {\n sql: `DELETE FROM ${parsedTableName}${whereClause.sql}`,\n args: whereClause.args,\n };\n}\n\ntype WhereValue = InValue | { startAt?: InValue; endAt?: InValue };\n\nexport function prepareWhereClause(\n filters: Record<string, WhereValue>,\n schema: Record<string, StorageColumn>,\n): {\n sql: string;\n args: InValue[];\n} {\n const conditions: string[] = [];\n const args: InValue[] = [];\n\n for (const [columnName, filterValue] of Object.entries(filters)) {\n const column = schema[columnName];\n if (!column) {\n throw new Error(`Unknown column: ${columnName}`);\n }\n\n const parsedColumn = parseSqlIdentifier(columnName, 'column name');\n const result = buildCondition(parsedColumn, filterValue);\n\n conditions.push(result.condition);\n args.push(...result.args);\n }\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n}\n\nfunction buildCondition(columnName: string, filterValue: WhereValue): { condition: string; args: InValue[] } {\n // Handle null values - IS NULL\n if (filterValue === null) {\n return { condition: `${columnName} IS NULL`, args: [] };\n }\n\n // Handle date range objects\n if (typeof filterValue === 'object' && filterValue !== null && ('startAt' in filterValue || 'endAt' in filterValue)) {\n return buildDateRangeCondition(columnName, filterValue);\n }\n\n // Handle exact match\n return {\n condition: `${columnName} = ?`,\n args: [transformToSqlValue(filterValue)],\n };\n}\n\nfunction buildDateRangeCondition(\n columnName: string,\n range: { startAt?: InValue; endAt?: InValue },\n): { condition: string; args: InValue[] } {\n const conditions: string[] = [];\n const args: InValue[] = [];\n\n if (range.startAt !== undefined) {\n conditions.push(`${columnName} >= ?`);\n args.push(transformToSqlValue(range.startAt));\n }\n\n if (range.endAt !== undefined) {\n conditions.push(`${columnName} <= ?`);\n args.push(transformToSqlValue(range.endAt));\n }\n\n if (conditions.length === 0) {\n throw new Error('Date range must specify at least startAt or endAt');\n }\n\n return {\n condition: conditions.join(' AND '),\n args,\n };\n}\n\ntype DateRangeFilter = {\n startAt?: string;\n endAt?: string;\n};\n\n/**\n * Converts pagination date range to where clause date range format\n * @param dateRange - The date range from pagination\n * @param columnName - The timestamp column to filter on (defaults to 'createdAt')\n * @returns Object with the date range filter, or empty object if no date range\n */\nexport function buildDateRangeFilter(\n dateRange?: PaginationArgs['dateRange'],\n columnName: string = 'createdAt',\n): Record<string, DateRangeFilter> {\n if (!dateRange?.start && !dateRange?.end) {\n return {};\n }\n\n const filter: DateRangeFilter = {};\n\n if (dateRange.start) {\n filter.startAt = new Date(dateRange.start).toISOString();\n }\n\n if (dateRange.end) {\n filter.endAt = new Date(dateRange.end).toISOString();\n }\n\n return { [columnName]: filter };\n}\n\n/**\n * Transforms SQL row data back to a typed object format\n * Reverses the transformations done in prepareStatement\n */\nexport function transformFromSqlRow<T>({\n tableName,\n sqlRow,\n}: {\n tableName: TABLE_NAMES;\n sqlRow: Record<string, any>;\n}): T {\n const result: Record<string, any> = {};\n const jsonColumns = new Set(\n Object.keys(TABLE_SCHEMAS[tableName])\n .filter(key => TABLE_SCHEMAS[tableName][key]!.type === 'jsonb')\n .map(key => key),\n );\n const dateColumns = new Set(\n Object.keys(TABLE_SCHEMAS[tableName])\n .filter(key => TABLE_SCHEMAS[tableName][key]!.type === 'timestamp')\n .map(key => key),\n );\n\n for (const [key, value] of Object.entries(sqlRow)) {\n if (value === null || value === undefined) {\n result[key] = value;\n continue;\n }\n\n if (dateColumns.has(key) && typeof value === 'string') {\n result[key] = new Date(value);\n continue;\n }\n\n if (jsonColumns.has(key) && typeof value === 'string') {\n result[key] = safelyParseJSON(value);\n continue;\n }\n\n result[key] = value;\n }\n\n return result as T;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { SPAN_SCHEMA, ObservabilityStorage, TABLE_SPANS } from '@mastra/core/storage';\nimport type {\n SpanRecord,\n CreateSpanRecord,\n UpdateSpanRecord,\n TraceRecord,\n TracesPaginatedArg,\n PaginationInfo,\n} from '@mastra/core/storage';\nimport type { StoreOperationsLibSQL } from '../operations';\nimport { buildDateRangeFilter, prepareWhereClause, transformFromSqlRow } from '../utils';\n\nexport class ObservabilityLibSQL extends ObservabilityStorage {\n private operations: StoreOperationsLibSQL;\n constructor({ operations }: { operations: StoreOperationsLibSQL }) {\n super();\n this.operations = operations;\n }\n\n async createSpan(span: CreateSpanRecord): Promise<void> {\n try {\n // Explicitly set createdAt/updatedAt timestamps\n const now = new Date().toISOString();\n const record = {\n ...span,\n createdAt: now,\n updatedAt: now,\n };\n return this.operations.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_CREATE_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getTrace(traceId: string): Promise<TraceRecord | null> {\n try {\n const spans = await this.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ?', args: [traceId] },\n orderBy: 'startedAt DESC',\n });\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: spans.map(span => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: span })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_TRACE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async updateSpan({\n spanId,\n traceId,\n updates,\n }: {\n spanId: string;\n traceId: string;\n updates: Partial<UpdateSpanRecord>;\n }): Promise<void> {\n try {\n await this.operations.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data: { ...updates, updatedAt: new Date().toISOString() },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_UPDATE_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId,\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async getTracesPaginated({\n filters,\n pagination,\n }: TracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n const { entityId, entityType, ...actualFilters } = filters || {};\n\n const filtersWithDateRange: Record<string, any> = {\n ...actualFilters,\n ...buildDateRangeFilter(pagination?.dateRange, 'startedAt'),\n parentSpanId: null,\n };\n const whereClause = prepareWhereClause(filtersWithDateRange, SPAN_SCHEMA);\n\n let actualWhereClause = whereClause.sql || '';\n\n if (entityId && entityType) {\n const statement = `name = ?`;\n let name = '';\n if (entityType === 'workflow') {\n name = `workflow run: '${entityId}'`;\n } else if (entityType === 'agent') {\n name = `agent run: '${entityId}'`;\n } else {\n const error = new MastraError({\n id: 'LIBSQL_STORE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n entityType,\n },\n text: `Cannot filter by entity type: ${entityType}`,\n });\n this.logger?.trackException(error);\n throw error;\n }\n\n whereClause.args.push(name);\n\n if (actualWhereClause) {\n actualWhereClause += ` AND ${statement}`;\n } else {\n actualWhereClause += `WHERE ${statement}`;\n }\n }\n\n const orderBy = 'startedAt DESC';\n\n let count = 0;\n try {\n count = await this.operations.loadTotalCount({\n tableName: TABLE_SPANS,\n whereClause: { sql: actualWhereClause, args: whereClause.args },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_TRACES_PAGINATED_COUNT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\n if (count === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage,\n hasMore: false,\n },\n spans: [],\n };\n }\n\n try {\n const spans = await this.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: actualWhereClause,\n args: whereClause.args,\n },\n orderBy,\n offset: page * perPage,\n limit: perPage,\n });\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: spans.length === perPage,\n },\n spans: spans.map(span => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: span })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_TRACES_PAGINATED_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: { records: CreateSpanRecord[] }): Promise<void> {\n try {\n // Use single timestamp for all records in the batch\n const now = new Date().toISOString();\n return this.operations.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_BATCH_CREATE_SPANS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: {\n records: {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateSpanRecord>;\n }[];\n }): Promise<void> {\n try {\n return this.operations.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => ({\n keys: { spanId: record.spanId, traceId: record.traceId },\n data: { ...record.updates, updatedAt: new Date().toISOString() },\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_BATCH_UPDATE_SPANS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: { traceIds: string[] }): Promise<void> {\n try {\n const keys = args.traceIds.map(traceId => ({ traceId }));\n return this.operations.batchDelete({\n tableName: TABLE_SPANS,\n keys,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_BATCH_DELETE_TRACES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { TABLE_WORKFLOW_SNAPSHOT, StoreOperations, TABLE_SPANS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n createExecuteWriteOperationWithRetry,\n prepareDeleteStatement,\n prepareStatement,\n prepareUpdateStatement,\n} from '../utils';\n\nexport class StoreOperationsLibSQL extends StoreOperations {\n private client: Client;\n /**\n * Maximum number of retries for write operations if an SQLITE_BUSY error occurs.\n * @default 5\n */\n maxRetries: number;\n /**\n * Initial backoff time in milliseconds for retrying write operations on SQLITE_BUSY.\n * The backoff time will double with each retry (exponential backoff).\n * @default 100\n */\n initialBackoffMs: number;\n\n constructor({\n client,\n maxRetries,\n initialBackoffMs,\n }: {\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n }) {\n super();\n this.client = client;\n\n this.maxRetries = maxRetries ?? 5;\n this.initialBackoffMs = initialBackoffMs ?? 100;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const result = await this.client.execute({\n sql: `PRAGMA table_info(${table})`,\n });\n return (await result.rows)?.some((row: any) => row.name === column);\n }\n\n private getCreateTableSQL(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): string {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const columns = Object.entries(schema).map(([name, col]) => {\n const parsedColumnName = parseSqlIdentifier(name, 'column name');\n let type = col.type.toUpperCase();\n if (type === 'TEXT') type = 'TEXT';\n if (type === 'TIMESTAMP') type = 'TEXT'; // Store timestamps as ISO strings\n // if (type === 'BIGINT') type = 'INTEGER';\n\n const nullable = col.nullable ? '' : 'NOT NULL';\n const primaryKey = col.primaryKey ? 'PRIMARY KEY' : '';\n\n return `${parsedColumnName} ${type} ${nullable} ${primaryKey}`.trim();\n });\n\n // For workflow_snapshot table, create a composite primary key\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const stmnt = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (\n ${columns.join(',\\n')},\n PRIMARY KEY (workflow_name, run_id)\n )`;\n return stmnt;\n }\n\n if (tableName === TABLE_SPANS) {\n const stmnt = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (\n ${columns.join(',\\n')},\n PRIMARY KEY (traceId, spanId)\n )`;\n return stmnt;\n }\n\n return `CREATE TABLE IF NOT EXISTS ${parsedTableName} (${columns.join(', ')})`;\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 this.logger.debug(`Creating database table`, { tableName, operation: 'schema init' });\n const sql = this.getCreateTableSQL(tableName, schema);\n await this.client.execute(sql);\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'bigint':\n return 'INTEGER'; // SQLite uses INTEGER for all integer sizes\n case 'jsonb':\n return 'TEXT'; // Store JSON as TEXT in SQLite\n default:\n return super.getSqlType(type);\n }\n }\n\n private async doInsert({\n tableName,\n record,\n }: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n }): Promise<void> {\n await this.client.execute(\n prepareStatement({\n tableName,\n record,\n }),\n );\n }\n\n public insert(args: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n return executeWriteOperationWithRetry(() => this.doInsert(args), `insert into table ${args.tableName}`);\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n const parsedKeys = Object.keys(keys).map(key => parseSqlIdentifier(key, 'column name'));\n\n const conditions = parsedKeys.map(key => `${key} = ?`).join(' AND ');\n const values = Object.values(keys);\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${parsedTableName} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,\n args: values,\n });\n\n if (!result.rows || result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n // Checks whether the string looks like a JSON object ({}) or array ([])\n // If the string starts with { or [, it assumes it's JSON and parses it\n // Otherwise, it just returns, preventing unintended number conversions\n const parsed = Object.fromEntries(\n Object.entries(row || {}).map(([k, v]) => {\n try {\n return [k, typeof v === 'string' ? (v.startsWith('{') || v.startsWith('[') ? JSON.parse(v) : v) : v];\n } catch {\n return [k, v];\n }\n }),\n );\n\n return parsed as R;\n }\n\n async loadMany<R>({\n tableName,\n whereClause,\n orderBy,\n offset,\n limit,\n args,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: { sql: string; args: InValue[] };\n orderBy?: string;\n offset?: number;\n limit?: number;\n args?: any[];\n }): Promise<R[]> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n let statement = `SELECT * FROM ${parsedTableName}`;\n\n if (whereClause?.sql) {\n statement += `${whereClause.sql}`;\n }\n\n if (orderBy) {\n statement += ` ORDER BY ${orderBy}`;\n }\n\n if (limit) {\n statement += ` LIMIT ${limit}`;\n }\n\n if (offset) {\n statement += ` OFFSET ${offset}`;\n }\n\n const result = await this.client.execute({\n sql: statement,\n args: [...(whereClause?.args ?? []), ...(args ?? [])],\n });\n\n return result.rows as R[];\n }\n\n async loadTotalCount({\n tableName,\n whereClause,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: { sql: string; args: InValue[] };\n }): Promise<number> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n const statement = `SELECT COUNT(*) as count FROM ${parsedTableName} ${whereClause ? `${whereClause.sql}` : ''}`;\n\n const result = await this.client.execute({\n sql: statement,\n args: whereClause?.args ?? [],\n });\n\n if (!result.rows || result.rows.length === 0) {\n return 0;\n }\n\n return (result.rows[0]?.count as number) ?? 0;\n }\n\n public update(args: { tableName: TABLE_NAMES; keys: Record<string, any>; data: Record<string, any> }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n return executeWriteOperationWithRetry(() => this.executeUpdate(args), `update table ${args.tableName}`);\n }\n\n private async executeUpdate({\n tableName,\n keys,\n data,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n }): Promise<void> {\n await this.client.execute(prepareUpdateStatement({ tableName, updates: data, keys }));\n }\n\n private async doBatchInsert({\n tableName,\n records,\n }: {\n tableName: TABLE_NAMES;\n records: Record<string, any>[];\n }): Promise<void> {\n if (records.length === 0) return;\n const batchStatements = records.map(r => prepareStatement({ tableName, record: r }));\n await this.client.batch(batchStatements, 'write');\n }\n\n public batchInsert(args: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n return executeWriteOperationWithRetry(\n () => this.doBatchInsert(args),\n `batch insert into table ${args.tableName}`,\n ).catch(error => {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: args.tableName,\n },\n },\n error,\n );\n });\n }\n\n /**\n * Public batch update method with retry logic\n */\n public batchUpdate(args: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n return executeWriteOperationWithRetry(\n () => this.executeBatchUpdate(args),\n `batch update in table ${args.tableName}`,\n ).catch(error => {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_BATCH_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: args.tableName,\n },\n },\n error,\n );\n });\n }\n\n /**\n * Updates multiple records in batch. Each record can be updated based on single or composite keys.\n */\n private async executeBatchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n if (updates.length === 0) return;\n\n const batchStatements = updates.map(({ keys, data }) =>\n prepareUpdateStatement({\n tableName,\n updates: data,\n keys,\n }),\n );\n\n await this.client.batch(batchStatements, 'write');\n }\n\n /**\n * Public batch delete method with retry logic\n */\n public batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Array<Record<string, any>> }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n return executeWriteOperationWithRetry(\n () => this.executeBatchDelete({ tableName, keys }),\n `batch delete from table ${tableName}`,\n ).catch(error => {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_BATCH_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n });\n }\n\n /**\n * Deletes multiple records in batch. Each record can be deleted based on single or composite keys.\n */\n private async executeBatchDelete({\n tableName,\n keys,\n }: {\n tableName: TABLE_NAMES;\n keys: Array<Record<string, any>>;\n }): Promise<void> {\n if (keys.length === 0) return;\n\n const batchStatements = keys.map(keyObj =>\n prepareDeleteStatement({\n tableName,\n keys: keyObj,\n }),\n );\n\n await this.client.batch(batchStatements, 'write');\n }\n\n /**\n * Alters table schema to add columns if they don't exist\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\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 const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n try {\n // 1. Get existing columns using PRAGMA\n const pragmaQuery = `PRAGMA table_info(${parsedTableName})`;\n const result = await this.client.execute(pragmaQuery);\n const existingColumnNames = new Set(result.rows.map((row: any) => row.name.toLowerCase()));\n\n // 2. Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumnNames.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n const sqlType = this.getSqlType(columnDef.type); // ensure this exists or implement\n const nullable = columnDef.nullable === false ? 'NOT NULL' : '';\n // In SQLite, you must provide a DEFAULT if adding a NOT NULL column to a non-empty table\n const defaultValue = columnDef.nullable === false ? this.getDefaultValue(columnDef.type) : '';\n const alterSql =\n `ALTER TABLE ${parsedTableName} ADD COLUMN \"${columnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n\n await this.client.execute(alterSql);\n this.logger?.debug?.(`Added column ${columnName} to table ${parsedTableName}`);\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_ALTER_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n try {\n await this.client.execute(`DELETE FROM ${parsedTableName}`);\n } catch (e) {\n const mastraError = new MastraError(\n {\n id: 'LIBSQL_STORE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n e,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n try {\n await this.client.execute(`DROP TABLE IF EXISTS ${parsedTableName}`);\n } catch (e) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n e,\n );\n }\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport {\n TABLE_SCORERS,\n ScoresStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { StoreOperationsLibSQL } from '../operations';\n\nexport class ScoresLibSQL extends ScoresStorage {\n private operations: StoreOperationsLibSQL;\n private client: Client;\n constructor({ client, operations }: { client: Client; operations: StoreOperationsLibSQL }) {\n super();\n this.operations = operations;\n this.client = client;\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\n // Get total count first\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE runId = ?`,\n args: [runId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [runId, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_SCORES_BY_RUN_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (scorerId) {\n conditions.push(`scorerId = ?`);\n queryParams.push(scorerId);\n }\n\n if (entityId) {\n conditions.push(`entityId = ?`);\n queryParams.push(entityId);\n }\n\n if (entityType) {\n conditions.push(`entityType = ?`);\n queryParams.push(entityType);\n }\n\n if (source) {\n conditions.push(`source = ?`);\n queryParams.push(source);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count first\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_SCORES_BY_SCORER_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private transformScoreRow(row: Record<string, any>): ScoreRowData {\n const scorerValue = safelyParseJSON(row.scorer);\n const inputValue = safelyParseJSON(row.input ?? '{}');\n const outputValue = safelyParseJSON(row.output ?? '{}');\n const additionalLLMContextValue = row.additionalLLMContext ? safelyParseJSON(row.additionalLLMContext) : null;\n const requestContextValue = row.requestContext ? safelyParseJSON(row.requestContext) : null;\n const metadataValue = row.metadata ? safelyParseJSON(row.metadata) : null;\n const entityValue = row.entity ? safelyParseJSON(row.entity) : null;\n const preprocessStepResultValue = row.preprocessStepResult ? safelyParseJSON(row.preprocessStepResult) : null;\n const analyzeStepResultValue = row.analyzeStepResult ? safelyParseJSON(row.analyzeStepResult) : null;\n\n return {\n id: row.id,\n traceId: row.traceId,\n spanId: row.spanId,\n runId: row.runId,\n scorer: scorerValue,\n score: row.score,\n reason: row.reason,\n preprocessStepResult: preprocessStepResultValue,\n analyzeStepResult: analyzeStepResultValue,\n analyzePrompt: row.analyzePrompt,\n preprocessPrompt: row.preprocessPrompt,\n generateScorePrompt: row.generateScorePrompt,\n generateReasonPrompt: row.generateReasonPrompt,\n metadata: metadataValue,\n input: inputValue,\n output: outputValue,\n additionalContext: additionalLLMContextValue,\n requestContext: requestContextValue,\n entityType: row.entityType,\n entity: entityValue,\n entityId: row.entityId,\n scorerId: row.scorerId,\n source: row.source,\n resourceId: row.resourceId,\n threadId: row.threadId,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE id = ?`,\n args: [id],\n });\n return result.rows?.[0] ? this.transformScoreRow(result.rows[0]) : null;\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n let parsedScore: ValidatedSaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_SAVE_SCORE_FAILED_INVALID_SCORE_PAYLOAD',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: score.scorer.id,\n entityId: score.entityId,\n entityType: score.entityType,\n traceId: score.traceId || '',\n spanId: score.spanId || '',\n },\n },\n error,\n );\n }\n\n try {\n const id = crypto.randomUUID();\n\n await this.operations.insert({\n tableName: TABLE_SCORERS,\n record: {\n id,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...parsedScore,\n },\n });\n\n const scoreFromDb = await this.getScoreById({ id });\n return { score: scoreFromDb! };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_SAVE_SCORE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\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\n // Get total count first\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE entityId = ? AND entityType = ?`,\n args: [entityId, entityType],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [entityId, entityType, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_SCORES_BY_ENTITY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\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 countSQLResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE traceId = ? AND spanId = ?`,\n args: [traceId, spanId],\n });\n\n const total = Number(countSQLResult.rows?.[0]?.count ?? 0);\n\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [traceId, spanId, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_SCORES_BY_SPAN_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '@mastra/core/storage';\nimport { normalizePerPage, TABLE_WORKFLOW_SNAPSHOT, WorkflowsStorage } from '@mastra/core/storage';\nimport type { WorkflowRunState, StepResult } from '@mastra/core/workflows';\nimport type { StoreOperationsLibSQL } from '../operations';\n\nfunction parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\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 return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n resourceId: row.resourceId as string,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n}\n\nexport class WorkflowsLibSQL extends WorkflowsStorage {\n operations: StoreOperationsLibSQL;\n client: Client;\n private readonly maxRetries: number;\n private readonly initialBackoffMs: number;\n\n constructor({\n operations,\n client,\n maxRetries = 5,\n initialBackoffMs = 500,\n }: {\n operations: StoreOperationsLibSQL;\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n }) {\n super();\n this.operations = operations;\n this.client = client;\n this.maxRetries = maxRetries;\n this.initialBackoffMs = initialBackoffMs;\n\n // Set PRAGMA settings to help with database locks\n // Note: This is async but we can't await in constructor, so we'll handle it as a fire-and-forget\n this.setupPragmaSettings().catch(err =>\n this.logger.warn('LibSQL Workflows: Failed to setup PRAGMA settings.', err),\n );\n }\n\n private async setupPragmaSettings() {\n try {\n // Set busy timeout to wait longer before returning busy errors\n await this.client.execute('PRAGMA busy_timeout = 10000;');\n this.logger.debug('LibSQL Workflows: PRAGMA busy_timeout=10000 set.');\n\n // Enable WAL mode for better concurrency (if supported)\n try {\n await this.client.execute('PRAGMA journal_mode = WAL;');\n this.logger.debug('LibSQL Workflows: PRAGMA journal_mode=WAL set.');\n } catch {\n this.logger.debug('LibSQL Workflows: WAL mode not supported, using default journal mode.');\n }\n\n // Set synchronous mode for better durability vs performance trade-off\n try {\n await this.client.execute('PRAGMA synchronous = NORMAL;');\n this.logger.debug('LibSQL Workflows: PRAGMA synchronous=NORMAL set.');\n } catch {\n this.logger.debug('LibSQL Workflows: Failed to set synchronous mode.');\n }\n } catch (err) {\n this.logger.warn('LibSQL Workflows: Failed to set PRAGMA settings.', err);\n }\n }\n\n private async executeWithRetry<T>(operation: () => Promise<T>): Promise<T> {\n let attempts = 0;\n let backoff = this.initialBackoffMs;\n\n while (attempts < this.maxRetries) {\n try {\n return await operation();\n } catch (error: any) {\n // Log the error details for debugging\n this.logger.debug('LibSQL Workflows: Error caught in retry loop', {\n errorType: error.constructor.name,\n errorCode: error.code,\n errorMessage: error.message,\n attempts,\n maxRetries: this.maxRetries,\n });\n\n // Check for various database lock/busy conditions\n const isLockError =\n error.code === 'SQLITE_BUSY' ||\n error.code === 'SQLITE_LOCKED' ||\n error.message?.toLowerCase().includes('database is locked') ||\n error.message?.toLowerCase().includes('database table is locked') ||\n error.message?.toLowerCase().includes('table is locked') ||\n (error.constructor.name === 'SqliteError' && error.message?.toLowerCase().includes('locked'));\n\n if (isLockError) {\n attempts++;\n if (attempts >= this.maxRetries) {\n this.logger.error(\n `LibSQL Workflows: Operation failed after ${this.maxRetries} attempts due to database lock: ${error.message}`,\n { error, attempts, maxRetries: this.maxRetries },\n );\n throw error;\n }\n this.logger.warn(\n `LibSQL Workflows: Attempt ${attempts} failed due to database lock. Retrying in ${backoff}ms...`,\n { errorMessage: error.message, attempts, backoff, maxRetries: this.maxRetries },\n );\n await new Promise(resolve => setTimeout(resolve, backoff));\n backoff *= 2;\n } else {\n // Not a lock error, re-throw immediately\n this.logger.error('LibSQL Workflows: Non-lock error occurred, not retrying', { error });\n throw error;\n }\n }\n }\n throw new Error('LibSQL Workflows: Max retries reached, but no error was re-thrown from the loop.');\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.executeWithRetry(async () => {\n // Use a transaction to ensure atomicity\n const tx = await this.client.transaction('write');\n try {\n // Load existing snapshot within transaction\n const existingSnapshotResult = await tx.execute({\n sql: `SELECT snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,\n args: [workflowName, runId],\n });\n\n let snapshot: WorkflowRunState;\n if (!existingSnapshotResult.rows?.[0]) {\n // Create new snapshot if none exists\n snapshot = {\n context: {},\n activePaths: [],\n timestamp: Date.now(),\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId: runId,\n requestContext: {},\n } as WorkflowRunState;\n } else {\n // Parse existing snapshot\n const existingSnapshot = existingSnapshotResult.rows[0].snapshot;\n snapshot = typeof existingSnapshot === 'string' ? JSON.parse(existingSnapshot) : existingSnapshot;\n }\n\n // Merge the new step result and request context\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n // Update the snapshot within the same transaction\n await tx.execute({\n sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,\n args: [JSON.stringify(snapshot), workflowName, runId],\n });\n\n await tx.commit();\n return snapshot.context;\n } catch (error) {\n if (!tx.closed) {\n await tx.rollback();\n }\n throw error;\n }\n });\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.executeWithRetry(async () => {\n // Use a transaction to ensure atomicity\n const tx = await this.client.transaction('write');\n try {\n // Load existing snapshot within transaction\n const existingSnapshotResult = await tx.execute({\n sql: `SELECT snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,\n args: [workflowName, runId],\n });\n\n if (!existingSnapshotResult.rows?.[0]) {\n await tx.rollback();\n return undefined;\n }\n\n // Parse existing snapshot\n const existingSnapshot = existingSnapshotResult.rows[0].snapshot;\n const snapshot = typeof existingSnapshot === 'string' ? JSON.parse(existingSnapshot) : existingSnapshot;\n\n if (!snapshot || !snapshot?.context) {\n await tx.rollback();\n throw new Error(`Snapshot not found for runId ${runId}`);\n }\n\n // Merge the new options with the existing snapshot\n const updatedSnapshot = { ...snapshot, ...opts };\n\n // Update the snapshot within the same transaction\n await tx.execute({\n sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,\n args: [JSON.stringify(updatedSnapshot), workflowName, runId],\n });\n\n await tx.commit();\n return updatedSnapshot;\n } catch (error) {\n if (!tx.closed) {\n await tx.rollback();\n }\n throw error;\n }\n });\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 }) {\n const data = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.logger.debug('Persisting workflow snapshot', { workflowName, runId, data });\n await this.operations.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: data,\n });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n this.logger.debug('Loading workflow snapshot', { workflowName, runId });\n const d = await this.operations.load<{ snapshot: WorkflowRunState }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n return d ? d.snapshot : null;\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const conditions: string[] = [];\n const args: (string | number)[] = [];\n\n if (runId) {\n conditions.push('run_id = ?');\n args.push(runId);\n }\n\n if (workflowName) {\n conditions.push('workflow_name = ?');\n args.push(workflowName);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n try {\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,\n args,\n });\n\n if (!result.rows?.[0]) {\n return null;\n }\n\n return parseWorkflowRun(result.rows[0]);\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_GET_WORKFLOW_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const args: InValue[] = [];\n\n if (workflowName) {\n conditions.push('workflow_name = ?');\n args.push(workflowName);\n }\n\n if (status) {\n conditions.push(\"json_extract(snapshot, '$.status') = ?\");\n args.push(status);\n }\n\n if (fromDate) {\n conditions.push('createdAt >= ?');\n args.push(fromDate.toISOString());\n }\n\n if (toDate) {\n conditions.push('createdAt <= ?');\n args.push(toDate.toISOString());\n }\n\n if (resourceId) {\n const hasResourceId = await this.operations.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push('resourceId = ?');\n args.push(resourceId);\n } else {\n console.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n if (usePagination) {\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause}`,\n args,\n });\n total = Number(countResult.rows?.[0]?.count ?? 0);\n }\n\n // Get results\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page! * normalizedPerPage : 0;\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ''}`,\n args: usePagination ? [...args, normalizedPerPage, offset] : args,\n });\n\n const runs = (result.rows || []).map(row => parseWorkflowRun(row));\n\n // Use runs.length as total when not paginating\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: 'LIBSQL_STORE_LIST_WORKFLOW_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { createClient } from '@libsql/client';\nimport type { Client } from '@libsql/client';\nimport type { MastraMessageContentV2, MastraDBMessage } from '@mastra/core/agent';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n PaginationInfo,\n StorageColumn,\n StoragePagination,\n StorageResourceType,\n TABLE_NAMES,\n WorkflowRun,\n WorkflowRuns,\n StorageDomains,\n SpanRecord,\n TraceRecord,\n TracesPaginatedArg,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\n\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { MemoryLibSQL } from './domains/memory';\nimport { ObservabilityLibSQL } from './domains/observability';\nimport { StoreOperationsLibSQL } from './domains/operations';\nimport { ScoresLibSQL } from './domains/scores';\nimport { WorkflowsLibSQL } from './domains/workflows';\n\nexport type LibSQLConfig =\n | {\n id: string;\n url: string;\n authToken?: string;\n /**\n * Maximum number of retries for write operations if an SQLITE_BUSY error occurs.\n * @default 5\n */\n maxRetries?: number;\n /**\n * Initial backoff time in milliseconds for retrying write operations on SQLITE_BUSY.\n * The backoff time will double with each retry (exponential backoff).\n * @default 100\n */\n initialBackoffMs?: number;\n }\n | {\n id: string;\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n };\n\nexport class LibSQLStore extends MastraStorage {\n private client: Client;\n private readonly maxRetries: number;\n private readonly initialBackoffMs: number;\n\n stores: StorageDomains;\n\n constructor(config: LibSQLConfig) {\n if (!config.id || typeof config.id !== 'string' || config.id.trim() === '') {\n throw new Error('LibSQLStore: id must be provided and cannot be empty.');\n }\n super({ id: config.id, name: `LibSQLStore` });\n\n this.maxRetries = config.maxRetries ?? 5;\n this.initialBackoffMs = config.initialBackoffMs ?? 100;\n\n if ('url' in config) {\n // need to re-init every time for in memory dbs or the tables might not exist\n if (config.url.endsWith(':memory:')) {\n this.shouldCacheInit = false;\n }\n\n this.client = createClient({\n url: config.url,\n ...(config.authToken ? { authToken: config.authToken } : {}),\n });\n\n // Set PRAGMAs for better concurrency, especially for file-based databases\n if (config.url.startsWith('file:') || config.url.includes(':memory:')) {\n this.client\n .execute('PRAGMA journal_mode=WAL;')\n .then(() => this.logger.debug('LibSQLStore: PRAGMA journal_mode=WAL set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA journal_mode=WAL.', err));\n this.client\n .execute('PRAGMA busy_timeout = 5000;') // 5 seconds\n .then(() => this.logger.debug('LibSQLStore: PRAGMA busy_timeout=5000 set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA busy_timeout.', err));\n }\n } else {\n this.client = config.client;\n }\n\n const operations = new StoreOperationsLibSQL({\n client: this.client,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n const scores = new ScoresLibSQL({ client: this.client, operations });\n const workflows = new WorkflowsLibSQL({ client: this.client, operations });\n const memory = new MemoryLibSQL({ client: this.client, operations });\n const observability = new ObservabilityLibSQL({ operations });\n\n this.stores = {\n operations,\n scores,\n workflows,\n memory,\n observability,\n };\n }\n\n public get supports() {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: true,\n createTable: true,\n deleteMessages: true,\n observabilityInstance: true,\n listScoresBySpan: true,\n };\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n await this.stores.operations.createTable({ tableName, schema });\n }\n\n /**\n * Alters table schema to add columns if they don't exist\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\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 await this.stores.operations.alterTable({ tableName, schema, ifNotExists });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n await this.stores.operations.clearTable({ tableName });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n await this.stores.operations.dropTable({ tableName });\n }\n\n public insert(args: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert(args);\n }\n\n public batchInsert(args: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert(args);\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\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 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 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 const result = await this.stores.memory.saveMessages({ messages: args.messages });\n return { messages: result.messages };\n }\n\n async updateMessages({\n messages,\n }: {\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({ messages });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n return this.stores.memory.deleteMessages(messageIds);\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id });\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(score);\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByScorerId({ scorerId, entityId, entityType, source, pagination });\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 /**\n * WORKFLOWS\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 listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n return this.stores.workflows.getWorkflowRunById({ runId, workflowName });\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 async createSpan(span: SpanRecord): Promise<void> {\n return this.stores.observability!.createSpan(span);\n }\n\n async updateSpan(params: {\n spanId: string;\n traceId: string;\n updates: Partial<Omit<SpanRecord, 'spanId' | 'traceId'>>;\n }): Promise<void> {\n return this.stores.observability!.updateSpan(params);\n }\n\n async getTrace(traceId: string): Promise<TraceRecord | null> {\n return this.stores.observability!.getTrace(traceId);\n }\n\n async getTracesPaginated(args: TracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n return this.stores.observability!.getTracesPaginated(args);\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 async batchCreateSpans(args: { records: SpanRecord[] }): Promise<void> {\n return this.stores.observability!.batchCreateSpans(args);\n }\n\n async batchUpdateSpans(args: {\n records: { traceId: string; spanId: string; updates: Partial<Omit<SpanRecord, 'spanId' | 'traceId'>> }[];\n }): Promise<void> {\n return this.stores.observability!.batchUpdateSpans(args);\n }\n}\n\nexport { LibSQLStore as DefaultStorage };\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for LibSQL Vector.\n */\nexport const LIBSQL_PROMPT = `When querying LibSQL Vector, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n- $all: Match all values in array\n Example: { \"tags\": { \"$all\": [\"premium\", \"sale\"] } }\n- $elemMatch: Match array elements that meet all specified conditions\n Example: { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 100 } } } }\n- $contains: Check if array contains value\n Example: { \"tags\": { \"$contains\": \"premium\" } }\n\nLogical Operators:\n- $and: Logical AND (implicit when using multiple conditions)\n Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n- $nor: Logical NOR\n Example: { \"$nor\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nSpecial Operators:\n- $size: Array length check\n Example: { \"tags\": { \"$size\": 2 } }\n\nRestrictions:\n- Regex patterns are not supported\n- Direct RegExp patterns will throw an error\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- Array operations work on array fields only\n- Basic operators handle array values as JSON strings\n- Empty arrays in conditions are handled gracefully\n- Only logical operators ($and, $or, $not, $nor) can be used at the top level\n- All other operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n Invalid: { \"$contains\": \"value\" }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- $not operator:\n - Must be an object\n - Cannot be empty\n - Can be used at field level or top level\n - Valid: { \"$not\": { \"field\": \"value\" } }\n - Valid: { \"field\": { \"$not\": { \"$eq\": \"value\" } } }\n- Other logical operators ($and, $or, $nor):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- $elemMatch requires an object with conditions\n Valid: { \"array\": { \"$elemMatch\": { \"field\": \"value\" } } }\n Invalid: { \"array\": { \"$elemMatch\": \"value\" } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"tags\": { \"$all\": [\"premium\", \"sale\"] } },\n { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 50 }, \"inStock\": true } } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]}\n ]\n}`;\n"]}
1
+ {"version":3,"sources":["../src/vector/filter.ts","../src/vector/sql-builder.ts","../src/vector/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/observability/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/prompt.ts"],"names":["result","conditions","operator","operatorValue","MastraError","ErrorDomain","ErrorCategory","parseSqlIdentifier","buildCondition","createStorageErrorId","TABLE_SPANS","normalizePerPage","calculatePagination","coreTransformScoreRow","TABLE_WORKFLOW_SNAPSHOT","createClient"],"mappings":"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","file":"index.js","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type { VectorFilter, OperatorSupport, OperatorValueMap, VectorFieldValue } from '@mastra/core/vector/filter';\n\ntype LibSQLOperatorValueMap = Omit<\n OperatorValueMap,\n '$regex' | '$options' | '$in' | '$all' | '$nin' | '$eq' | '$ne'\n> & {\n $size: number;\n $contains: VectorFieldValue | Record<string, unknown>;\n $all: VectorFieldValue;\n $in: VectorFieldValue;\n $nin: VectorFieldValue;\n $eq: VectorFieldValue;\n $ne: VectorFieldValue;\n};\nexport type LibSQLVectorFilter = VectorFilter<keyof LibSQLOperatorValueMap, LibSQLOperatorValueMap>;\n\n/**\n * Translates MongoDB-style filters to LibSQL compatible filters.\n *\n * Key differences from MongoDB:\n *\n * Logical Operators ($and, $or, $nor):\n * - Can be used at the top level or nested within fields\n * - Can take either a single condition or an array of conditions\n *\n */\nexport class LibSQLFilterTranslator extends BaseFilterTranslator<LibSQLVectorFilter> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n regex: [],\n custom: ['$contains', '$size'],\n };\n }\n\n translate(filter?: LibSQLVectorFilter): LibSQLVectorFilter {\n if (this.isEmpty(filter)) {\n return filter;\n }\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private translateNode(node: LibSQLVectorFilter, currentPath: string = ''): any {\n if (this.isRegex(node)) {\n throw new Error('Direct regex pattern format is not supported in LibSQL');\n }\n // Helper to wrap result with path if needed\n const withPath = (result: any) => (currentPath ? { [currentPath]: result } : result);\n\n // Handle primitives\n if (this.isPrimitive(node)) {\n return withPath({ $eq: this.normalizeComparisonValue(node) });\n }\n\n // Handle arrays\n if (Array.isArray(node)) {\n return withPath({ $in: this.normalizeArrayValues(node) });\n }\n\n // Handle regex\n // TODO: Look more into regex support for LibSQL\n // if (node instanceof RegExp) {\n // return withPath(this.translateRegexPattern(node.source, node.flags));\n // }\n\n const entries = Object.entries(node as Record<string, any>);\n const result: Record<string, any> = {};\n\n // if ('$options' in node && !('$regex' in node)) {\n // throw new Error('$options is not valid without $regex');\n // }\n\n // TODO: Look more into regex support for LibSQL\n // // Handle special regex object format\n // if ('$regex' in node) {\n // const options = (node as any).$options || '';\n // return withPath(this.translateRegexPattern(node.$regex, options));\n // }\n\n // Process remaining entries\n for (const [key, value] of entries) {\n // // Skip options as they're handled with $regex\n // if (key === '$options') continue;\n\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n\n if (this.isLogicalOperator(key)) {\n result[key] = Array.isArray(value)\n ? value.map((filter: LibSQLVectorFilter) => this.translateNode(filter))\n : this.translateNode(value);\n } else if (this.isOperator(key)) {\n if (this.isArrayOperator(key) && !Array.isArray(value) && key !== '$elemMatch') {\n result[key] = [value];\n } else if (this.isBasicOperator(key) && Array.isArray(value)) {\n result[key] = JSON.stringify(value);\n } else {\n result[key] = value;\n }\n } else if (typeof value === 'object' && value !== null) {\n // Handle nested objects\n const hasOperators = Object.keys(value).some(k => this.isOperator(k));\n if (hasOperators) {\n result[newPath] = this.translateNode(value);\n } else {\n Object.assign(result, this.translateNode(value, newPath));\n }\n } else {\n result[newPath] = this.translateNode(value);\n }\n }\n\n return result;\n }\n\n // TODO: Look more into regex support for LibSQL\n // private translateRegexPattern(pattern: string, options: string = ''): any {\n // if (!options) return { $regex: pattern };\n\n // const flags = options\n // .split('')\n // .filter(f => 'imsux'.includes(f))\n // .join('');\n\n // return {\n // $regex: pattern,\n // $options: flags,\n // };\n // }\n}\n","import type { InValue } from '@libsql/client';\nimport { parseFieldKey } from '@mastra/core/utils';\nimport type {\n BasicOperator,\n NumericOperator,\n ArrayOperator,\n ElementOperator,\n LogicalOperator,\n} from '@mastra/core/vector/filter';\nimport type { LibSQLVectorFilter } from './filter';\n\ntype OperatorType =\n | BasicOperator\n | NumericOperator\n | ArrayOperator\n | ElementOperator\n | LogicalOperator\n | '$contains'\n | '$size';\n\ntype FilterOperator = {\n sql: string;\n needsValue: boolean;\n transformValue?: () => any;\n};\n\ntype OperatorFn = (key: string, value?: any) => FilterOperator;\n\n// Helper functions to create operators\nconst createBasicOperator = (symbol: string) => {\n return (key: string, value: any): FilterOperator => {\n const jsonPath = getJsonPath(key);\n return {\n sql: `CASE \n WHEN ? IS NULL THEN json_extract(metadata, ${jsonPath}) IS ${symbol === '=' ? '' : 'NOT'} NULL\n ELSE json_extract(metadata, ${jsonPath}) ${symbol} ?\n END`,\n needsValue: true,\n transformValue: () => {\n // Return the values directly, not in an object\n return [value, value];\n },\n };\n };\n};\nconst createNumericOperator = (symbol: string) => {\n return (key: string, value: any): FilterOperator => {\n const jsonPath = getJsonPath(key);\n\n // Check if the value is numeric or a string (like ISO date)\n const isNumeric =\n typeof value === 'number' || (typeof value === 'string' && !isNaN(Number(value)) && value.trim() !== '');\n\n if (isNumeric) {\n // For numeric values, cast to NUMERIC for proper comparison\n return {\n sql: `CAST(json_extract(metadata, ${jsonPath}) AS NUMERIC) ${symbol} ?`,\n needsValue: true,\n };\n } else {\n // For non-numeric strings (like ISO dates), compare as text\n return {\n sql: `CAST(json_extract(metadata, ${jsonPath}) AS TEXT) ${symbol} ?`,\n needsValue: true,\n };\n }\n };\n};\n\nconst validateJsonArray = (key: string) => {\n const jsonPath = getJsonPath(key);\n return `json_valid(json_extract(metadata, ${jsonPath}))\n AND json_type(json_extract(metadata, ${jsonPath})) = 'array'`;\n};\n\nconst pattern = /json_extract\\(metadata, '\\$\\.(?:\"[^\"]*\"(?:\\.\"[^\"]*\")*|[^']+)'\\)/g;\n\nfunction buildElemMatchConditions(value: any) {\n const conditions = Object.entries(value).map(([field, fieldValue]) => {\n if (field.startsWith('$')) {\n // Direct operators on array elements ($in, $gt, etc)\n const { sql, values } = buildCondition('elem.value', { [field]: fieldValue }, '');\n // Replace the metadata path with elem.value\n const elemSql = sql.replace(pattern, 'elem.value');\n return { sql: elemSql, values };\n } else if (typeof fieldValue === 'object' && !Array.isArray(fieldValue)) {\n // Nested field with operators (count: { $gt: 20 })\n const { sql, values } = buildCondition(field, fieldValue, '');\n // Replace the field path with elem.value path\n const jsonPath = parseJsonPathKey(field);\n const elemSql = sql.replace(pattern, `json_extract(elem.value, '$.${jsonPath}')`);\n return { sql: elemSql, values };\n } else {\n const jsonPath = parseJsonPathKey(field);\n // Simple field equality (warehouse: 'A')\n return {\n sql: `json_extract(elem.value, '$.${jsonPath}') = ?`,\n values: [fieldValue],\n };\n }\n });\n\n return conditions;\n}\n\n// Define all filter operators\nconst FILTER_OPERATORS: Record<OperatorType, OperatorFn> = {\n $eq: createBasicOperator('='),\n $ne: createBasicOperator('!='),\n $gt: createNumericOperator('>'),\n $gte: createNumericOperator('>='),\n $lt: createNumericOperator('<'),\n $lte: createNumericOperator('<='),\n\n // Array Operators\n $in: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n const arr = Array.isArray(value) ? value : [value];\n if (arr.length === 0) {\n return { sql: '1 = 0', needsValue: true, transformValue: () => [] };\n }\n const paramPlaceholders = arr.map(() => '?').join(',');\n return {\n sql: `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n EXISTS (\n SELECT 1 FROM json_each(json_extract(metadata, ${jsonPath})) as elem\n WHERE elem.value IN (SELECT value FROM json_each(?))\n )\n ELSE json_extract(metadata, ${jsonPath}) IN (${paramPlaceholders})\n END\n )`,\n needsValue: true,\n transformValue: () => [JSON.stringify(arr), ...arr],\n };\n },\n\n $nin: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n const arr = Array.isArray(value) ? value : [value];\n if (arr.length === 0) {\n return { sql: '1 = 1', needsValue: true, transformValue: () => [] };\n }\n const paramPlaceholders = arr.map(() => '?').join(',');\n return {\n sql: `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n NOT EXISTS (\n SELECT 1 FROM json_each(json_extract(metadata, ${jsonPath})) as elem\n WHERE elem.value IN (SELECT value FROM json_each(?))\n )\n ELSE json_extract(metadata, ${jsonPath}) NOT IN (${paramPlaceholders})\n END\n )`,\n needsValue: true,\n transformValue: () => [JSON.stringify(arr), ...arr],\n };\n },\n $all: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n let sql: string;\n const arrayValue = Array.isArray(value) ? value : [value];\n\n if (arrayValue.length === 0) {\n // If the array is empty, always return false (no matches)\n sql = '1 = 0';\n } else {\n sql = `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n NOT EXISTS (\n SELECT value\n FROM json_each(?)\n WHERE value NOT IN (\n SELECT value\n FROM json_each(json_extract(metadata, ${jsonPath}))\n )\n )\n ELSE FALSE\n END\n )`;\n }\n\n return {\n sql,\n needsValue: true,\n transformValue: () => {\n if (arrayValue.length === 0) {\n return [];\n }\n return [JSON.stringify(arrayValue)];\n },\n };\n },\n $elemMatch: (key: string, value: any) => {\n const jsonPath = getJsonPath(key);\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('$elemMatch requires an object with conditions');\n }\n\n // For nested object conditions\n const conditions = buildElemMatchConditions(value);\n\n return {\n sql: `(\n CASE\n WHEN ${validateJsonArray(key)} THEN\n EXISTS (\n SELECT 1\n FROM json_each(json_extract(metadata, ${jsonPath})) as elem\n WHERE ${conditions.map(c => c.sql).join(' AND ')}\n )\n ELSE FALSE\n END\n )`,\n needsValue: true,\n transformValue: () => conditions.flatMap(c => c.values),\n };\n },\n\n // Element Operators\n $exists: (key: string) => {\n const jsonPath = getJsonPath(key);\n return {\n sql: `json_extract(metadata, ${jsonPath}) IS NOT NULL`,\n needsValue: false,\n };\n },\n\n // Logical Operators\n $and: (key: string) => ({\n sql: `(${key})`,\n needsValue: false,\n }),\n $or: (key: string) => ({\n sql: `(${key})`,\n needsValue: false,\n }),\n $not: key => ({ sql: `NOT (${key})`, needsValue: false }),\n $nor: (key: string) => ({\n sql: `NOT (${key})`,\n needsValue: false,\n }),\n $size: (key: string, paramIndex: number) => {\n const jsonPath = getJsonPath(key);\n return {\n sql: `(\n CASE\n WHEN json_type(json_extract(metadata, ${jsonPath})) = 'array' THEN \n json_array_length(json_extract(metadata, ${jsonPath})) = $${paramIndex}\n ELSE FALSE\n END\n )`,\n needsValue: true,\n };\n },\n // /**\n // * Regex Operators\n // * Supports case insensitive and multiline\n // */\n // $regex: (key: string): FilterOperator => ({\n // sql: `json_extract(metadata, '$.\"${toJsonPathKey(key)}\"') = ?`,\n // needsValue: true,\n // transformValue: (value: any) => {\n // const pattern = typeof value === 'object' ? value.$regex : value;\n // const options = typeof value === 'object' ? value.$options || '' : '';\n // let sql = `json_extract(metadata, '$.\"${toJsonPathKey(key)}\"')`;\n\n // // Handle multiline\n // // if (options.includes('m')) {\n // // sql = `REPLACE(${sql}, CHAR(10), '\\n')`;\n // // }\n\n // // let finalPattern = pattern;\n // // if (options) {\n // // finalPattern = `(\\\\?${options})${pattern}`;\n // // }\n\n // // // Handle case insensitivity\n // // if (options.includes('i')) {\n // // sql = `LOWER(${sql}) REGEXP LOWER(?)`;\n // // } else {\n // // sql = `${sql} REGEXP ?`;\n // // }\n\n // if (options.includes('m')) {\n // sql = `EXISTS (\n // SELECT 1\n // FROM json_each(\n // json_array(\n // ${sql},\n // REPLACE(${sql}, CHAR(10), CHAR(13))\n // )\n // ) as lines\n // WHERE lines.value REGEXP ?\n // )`;\n // } else {\n // sql = `${sql} REGEXP ?`;\n // }\n\n // // Handle case insensitivity\n // if (options.includes('i')) {\n // sql = sql.replace('REGEXP ?', 'REGEXP LOWER(?)');\n // sql = sql.replace('value REGEXP', 'LOWER(value) REGEXP');\n // }\n\n // // Handle extended - allows whitespace and comments in pattern\n // if (options.includes('x')) {\n // // Remove whitespace and comments from pattern\n // const cleanPattern = pattern.replace(/\\s+|#.*$/gm, '');\n // return {\n // sql,\n // values: [cleanPattern],\n // };\n // }\n\n // return {\n // sql,\n // values: [pattern],\n // };\n // },\n // }),\n $contains: (key: string, value: any) => {\n const jsonPathKey = parseJsonPathKey(key);\n let sql;\n if (Array.isArray(value)) {\n sql = `(\n SELECT ${validateJsonArray(jsonPathKey)}\n AND EXISTS (\n SELECT 1\n FROM json_each(json_extract(metadata, '$.\"${jsonPathKey}\"')) as m\n WHERE m.value IN (SELECT value FROM json_each(?))\n )\n )`;\n } else if (typeof value === 'string') {\n sql = `lower(json_extract(metadata, '$.\"${jsonPathKey}\"')) LIKE '%' || lower(?) || '%' ESCAPE '\\\\'`;\n } else {\n sql = `json_extract(metadata, '$.\"${jsonPathKey}\"') = ?`;\n }\n return {\n sql,\n needsValue: true,\n transformValue: () => {\n if (Array.isArray(value)) {\n return [JSON.stringify(value)];\n }\n if (typeof value === 'object' && value !== null) {\n return [JSON.stringify(value)];\n }\n if (typeof value === 'string') {\n return [escapeLikePattern(value)];\n }\n return [value];\n },\n };\n },\n /**\n * $objectContains: True JSON containment for advanced use (deep sub-object match).\n * Usage: { field: { $objectContains: { ...subobject } } }\n */\n // $objectContains: (key: string) => ({\n // sql: '', // Will be overridden by transformValue\n // needsValue: true,\n // transformValue: (value: any) => ({\n // sql: `json_type(json_extract(metadata, '$.\"${toJsonPathKey(key)}\"')) = 'object'\n // AND json_patch(json_extract(metadata, '$.\"${toJsonPathKey(key)}\"'), ?) = json_extract(metadata, '$.\"${toJsonPathKey(key)}\"')`,\n // values: [JSON.stringify(value)],\n // }),\n // }),\n};\n\ninterface FilterResult {\n sql: string;\n values: InValue[];\n}\n\nfunction isFilterResult(obj: any): obj is FilterResult {\n return obj && typeof obj === 'object' && typeof obj.sql === 'string' && Array.isArray(obj.values);\n}\n\nconst parseJsonPathKey = (key: string) => {\n const parsedKey = parseFieldKey(key);\n // Only add quotes around path segments if they contain dots\n if (parsedKey.includes('.')) {\n return parsedKey\n .split('.')\n .map(segment => `\"${segment}\"`)\n .join('.');\n }\n return parsedKey;\n};\n\n// Helper to generate the correct JSON path format for LibSQL\nconst getJsonPath = (key: string) => {\n const jsonPathKey = parseJsonPathKey(key);\n // Always use quotes for consistency\n return `'$.${jsonPathKey}'`;\n};\n\nfunction escapeLikePattern(str: string): string {\n return str.replace(/([%_\\\\])/g, '\\\\$1');\n}\n\nexport function buildFilterQuery(filter: LibSQLVectorFilter): FilterResult {\n if (!filter) {\n return { sql: '', values: [] };\n }\n\n const values: InValue[] = [];\n const conditions = Object.entries(filter)\n .map(([key, value]) => {\n const condition = buildCondition(key, value, '');\n values.push(...condition.values);\n return condition.sql;\n })\n .join(' AND ');\n\n return {\n sql: conditions ? `WHERE ${conditions}` : '',\n values,\n };\n}\n\nfunction buildCondition(key: string, value: any, parentPath: string): FilterResult {\n // Handle logical operators ($and/$or)\n if (['$and', '$or', '$not', '$nor'].includes(key)) {\n return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n }\n\n // If condition is not a FilterCondition object, assume it's an equality check\n if (!value || typeof value !== 'object') {\n const jsonPath = getJsonPath(key);\n return {\n sql: `json_extract(metadata, ${jsonPath}) = ?`,\n values: [value],\n };\n }\n\n //TODO: Add regex support\n // if ('$regex' in value) {\n // return handleRegexOperator(key, value);\n // }\n\n // Handle operator conditions\n return handleOperator(key, value);\n}\n\n// function handleRegexOperator(key: string, value: any): FilterResult {\n// const operatorFn = FILTER_OPERATORS['$regex']!;\n// const operatorResult = operatorFn(key, value);\n// const transformed = operatorResult.transformValue ? operatorResult.transformValue(value) : value;\n\n// return {\n// sql: transformed.sql,\n// values: transformed.values,\n// };\n// }\n\nfunction handleLogicalOperator(\n key: '$and' | '$or' | '$not' | '$nor',\n value: LibSQLVectorFilter[] | LibSQLVectorFilter,\n parentPath: string,\n): FilterResult {\n // Handle empty conditions\n if (!value || (Array.isArray(value) && value.length === 0)) {\n switch (key) {\n case '$and':\n case '$nor':\n return { sql: 'true', values: [] };\n case '$or':\n return { sql: 'false', values: [] };\n case '$not':\n throw new Error('$not operator cannot be empty');\n default:\n return { sql: 'true', values: [] };\n }\n }\n\n if (key === '$not') {\n // For top-level $not\n const entries = Object.entries(value);\n const conditions = entries.map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key));\n return {\n sql: `NOT (${conditions.map(c => c.sql).join(' AND ')})`,\n values: conditions.flatMap(c => c.values),\n };\n }\n\n const values: InValue[] = [];\n const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n const conditions = Array.isArray(value)\n ? value.map(f => {\n const entries = !!f ? Object.entries(f) : [];\n return entries.map(([k, v]) => buildCondition(k, v, key));\n })\n : [buildCondition(key, value, parentPath)];\n\n const joined = conditions\n .flat()\n .map(c => {\n values.push(...c.values);\n return c.sql;\n })\n .join(` ${joinOperator} `);\n\n return {\n sql: key === '$nor' ? `NOT (${joined})` : `(${joined})`,\n values,\n };\n}\n\nfunction handleOperator(key: string, value: any): FilterResult {\n if (typeof value === 'object' && !Array.isArray(value)) {\n const entries = Object.entries(value);\n const results = entries.map(([operator, operatorValue]) =>\n operator === '$not'\n ? {\n sql: `NOT (${Object.entries(operatorValue as Record<string, any>)\n .map(([op, val]) => processOperator(key, op as OperatorType, val).sql)\n .join(' AND ')})`,\n values: Object.entries(operatorValue as Record<string, any>).flatMap(\n ([op, val]) => processOperator(key, op as OperatorType, val).values,\n ),\n }\n : processOperator(key, operator as OperatorType, operatorValue),\n );\n\n return {\n sql: `(${results.map(r => r.sql).join(' AND ')})`,\n values: results.flatMap(r => r.values),\n };\n }\n\n // Handle single operator\n const [[operator, operatorValue] = []] = Object.entries(value);\n return processOperator(key, operator as OperatorType, operatorValue);\n}\n\nconst processOperator = (key: string, operator: OperatorType, operatorValue: any): FilterResult => {\n if (!operator.startsWith('$') || !FILTER_OPERATORS[operator]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n const operatorFn = FILTER_OPERATORS[operator]!;\n const operatorResult = operatorFn(key, operatorValue);\n\n if (!operatorResult.needsValue) {\n return { sql: operatorResult.sql, values: [] };\n }\n\n const transformed = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n\n if (isFilterResult(transformed)) {\n return transformed;\n }\n\n return {\n sql: operatorResult.sql,\n values: Array.isArray(transformed) ? transformed : [transformed],\n };\n};\n","import { createClient } from '@libsql/client';\nimport type { Client as TursoClient, InValue } from '@libsql/client';\n\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport type { LibSQLVectorFilter } from './filter';\nimport { LibSQLFilterTranslator } from './filter';\nimport { buildFilterQuery } from './sql-builder';\n\ninterface LibSQLQueryVectorParams extends QueryVectorParams<LibSQLVectorFilter> {\n minScore?: number;\n}\n\nexport interface LibSQLVectorConfig {\n connectionUrl: string;\n authToken?: string;\n syncUrl?: string;\n syncInterval?: number;\n /**\n * Maximum number of retries for write operations if an SQLITE_BUSY error occurs.\n * @default 5\n */\n maxRetries?: number;\n /**\n * Initial backoff time in milliseconds for retrying write operations on SQLITE_BUSY.\n * The backoff time will double with each retry (exponential backoff).\n * @default 100\n */\n initialBackoffMs?: number;\n}\n\nexport class LibSQLVector extends MastraVector<LibSQLVectorFilter> {\n private turso: TursoClient;\n private readonly maxRetries: number;\n private readonly initialBackoffMs: number;\n\n constructor({\n connectionUrl,\n authToken,\n syncUrl,\n syncInterval,\n maxRetries = 5,\n initialBackoffMs = 100,\n id,\n }: LibSQLVectorConfig & { id: string }) {\n super({ id });\n\n this.turso = createClient({\n url: connectionUrl,\n syncUrl: syncUrl,\n authToken,\n syncInterval,\n });\n this.maxRetries = maxRetries;\n this.initialBackoffMs = initialBackoffMs;\n\n if (connectionUrl.includes(`file:`) || connectionUrl.includes(`:memory:`)) {\n this.turso\n .execute('PRAGMA journal_mode=WAL;')\n .then(() => this.logger.debug('LibSQLStore: PRAGMA journal_mode=WAL set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA journal_mode=WAL.', err));\n this.turso\n .execute('PRAGMA busy_timeout = 5000;')\n .then(() => this.logger.debug('LibSQLStore: PRAGMA busy_timeout=5000 set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA busy_timeout=5000.', err));\n }\n }\n\n private async executeWriteOperationWithRetry<T>(operation: () => Promise<T>, isTransaction = false): Promise<T> {\n let attempts = 0;\n let backoff = this.initialBackoffMs;\n while (attempts < this.maxRetries) {\n try {\n return await operation();\n } catch (error: any) {\n if (\n error.code === 'SQLITE_BUSY' ||\n (error.message && error.message.toLowerCase().includes('database is locked'))\n ) {\n attempts++;\n if (attempts >= this.maxRetries) {\n this.logger.error(\n `LibSQLVector: Operation failed after ${this.maxRetries} attempts due to: ${error.message}`,\n error,\n );\n throw error;\n }\n this.logger.warn(\n `LibSQLVector: Attempt ${attempts} failed due to ${isTransaction ? 'transaction ' : ''}database lock. Retrying in ${backoff}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, backoff));\n backoff *= 2;\n } else {\n throw error;\n }\n }\n }\n throw new Error('LibSQLVector: Max retries reached, but no error was re-thrown from the loop.');\n }\n\n transformFilter(filter?: LibSQLVectorFilter) {\n const translator = new LibSQLFilterTranslator();\n return translator.translate(filter);\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n minScore = -1, // Default to -1 to include all results (cosine similarity ranges from -1 to 1)\n }: LibSQLQueryVectorParams): Promise<QueryResult[]> {\n try {\n if (!Number.isInteger(topK) || topK <= 0) {\n throw new Error('topK must be a positive integer');\n }\n if (!Array.isArray(queryVector) || !queryVector.every(x => typeof x === 'number' && Number.isFinite(x))) {\n throw new Error('queryVector must be an array of finite numbers');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'QUERY', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\n try {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n\n const vectorStr = `[${queryVector.join(',')}]`;\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildFilterQuery(translatedFilter);\n filterValues.push(minScore);\n filterValues.push(topK);\n\n const query = `\n WITH vector_scores AS (\n SELECT\n vector_id as id,\n (1-vector_distance_cos(embedding, '${vectorStr}')) as score,\n metadata\n ${includeVector ? ', vector_extract(embedding) as embedding' : ''}\n FROM ${parsedIndexName}\n ${filterQuery}\n )\n SELECT *\n FROM vector_scores\n WHERE score > ?\n ORDER BY score DESC\n LIMIT ?`;\n\n const result = await this.turso.execute({\n sql: query,\n args: filterValues,\n });\n\n return result.rows.map(({ id, score, metadata, embedding }) => ({\n id: id as string,\n score: score as number,\n metadata: JSON.parse((metadata as string) ?? '{}'),\n ...(includeVector && embedding && { vector: JSON.parse(embedding as string) }),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n public upsert(args: UpsertVectorParams): Promise<string[]> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doUpsert(args), true);\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private async doUpsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n const tx = await this.turso.transaction('write');\n try {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n for (let i = 0; i < vectors.length; i++) {\n const query = `\n INSERT INTO ${parsedIndexName} (vector_id, embedding, metadata)\n VALUES (?, vector32(?), ?)\n ON CONFLICT(vector_id) DO UPDATE SET\n embedding = vector32(?),\n metadata = ?\n `;\n await tx.execute({\n sql: query,\n args: [\n vectorIds[i] as InValue,\n JSON.stringify(vectors[i]),\n JSON.stringify(metadata?.[i] || {}),\n JSON.stringify(vectors[i]),\n JSON.stringify(metadata?.[i] || {}),\n ],\n });\n }\n await tx.commit();\n return vectorIds;\n } catch (error) {\n !tx.closed && (await tx.rollback());\n if (error instanceof Error && error.message?.includes('dimensions are different')) {\n const match = error.message.match(/dimensions are different: (\\d+) != (\\d+)/);\n if (match) {\n const [, actual, expected] = match;\n throw new Error(\n `Vector dimension mismatch: Index \"${indexName}\" expects ${expected} dimensions but got ${actual} dimensions. ` +\n `Either use a matching embedding model or delete and recreate the index with the new dimension.`,\n );\n }\n }\n throw error;\n }\n }\n\n public createIndex(args: CreateIndexParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doCreateIndex(args));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: args.indexName, dimension: args.dimension },\n },\n error,\n );\n }\n }\n\n private async doCreateIndex({ indexName, dimension }: CreateIndexParams): Promise<void> {\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n await this.turso.execute({\n sql: `\n CREATE TABLE IF NOT EXISTS ${parsedIndexName} (\n id SERIAL PRIMARY KEY,\n vector_id TEXT UNIQUE NOT NULL,\n embedding F32_BLOB(${dimension}),\n metadata TEXT DEFAULT '{}'\n );\n `,\n args: [],\n });\n await this.turso.execute({\n sql: `\n CREATE INDEX IF NOT EXISTS ${parsedIndexName}_vector_idx\n ON ${parsedIndexName} (libsql_vector_idx(embedding))\n `,\n args: [],\n });\n }\n\n public deleteIndex(args: DeleteIndexParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doDeleteIndex(args));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: args.indexName },\n },\n error,\n );\n }\n }\n\n private async doDeleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n await this.turso.execute({\n sql: `DROP TABLE IF EXISTS ${parsedIndexName}`,\n args: [],\n });\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const vectorTablesQuery = `\n SELECT name FROM sqlite_master \n WHERE type='table' \n AND sql LIKE '%F32_BLOB%';\n `;\n const result = await this.turso.execute({\n sql: vectorTablesQuery,\n args: [],\n });\n return result.rows.map(row => row.name as string);\n } catch (error: any) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n // Get table info including column info\n const tableInfoQuery = `\n SELECT sql \n FROM sqlite_master \n WHERE type='table' \n AND name = ?;\n `;\n const tableInfo = await this.turso.execute({\n sql: tableInfoQuery,\n args: [parsedIndexName],\n });\n\n if (!tableInfo.rows[0]?.sql) {\n throw new Error(`Table ${parsedIndexName} not found`);\n }\n\n // Extract dimension from F32_BLOB definition\n const dimension = parseInt((tableInfo.rows[0].sql as string).match(/F32_BLOB\\((\\d+)\\)/)?.[1] || '0');\n\n // Get row count\n const countQuery = `\n SELECT COUNT(*) as count\n FROM ${parsedIndexName};\n `;\n const countResult = await this.turso.execute({\n sql: countQuery,\n args: [],\n });\n\n // LibSQL only supports cosine similarity currently\n const metric: 'cosine' | 'euclidean' | 'dotproduct' = 'cosine';\n\n return {\n dimension,\n count: (countResult?.rows?.[0]?.count as number) ?? 0,\n metric,\n };\n } catch (e: any) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n e,\n );\n }\n }\n\n /**\n * Updates a vector by its ID with the provided vector and/or metadata.\n *\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n public updateVector(args: UpdateVectorParams<LibSQLVectorFilter>): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doUpdateVector(args));\n }\n\n private async doUpdateVector(params: UpdateVectorParams<LibSQLVectorFilter>): Promise<void> {\n const { indexName, update } = params;\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n\n // Validate that both id and filter are not provided at the same time\n if ('id' in params && params.id && 'filter' in params && params.filter) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'id and filter are mutually exclusive - provide only one',\n });\n }\n\n if (!update.vector && !update.metadata) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'NO_PAYLOAD'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'No updates provided',\n });\n }\n\n const updates: string[] = [];\n const args: InValue[] = [];\n\n if (update.vector) {\n updates.push('embedding = vector32(?)');\n args.push(JSON.stringify(update.vector));\n }\n\n if (update.metadata) {\n updates.push('metadata = ?');\n args.push(JSON.stringify(update.metadata));\n }\n\n if (updates.length === 0) {\n return;\n }\n\n let whereClause: string;\n let whereValues: InValue[];\n\n // Type narrowing: check if updating by id or by filter\n if ('id' in params && params.id) {\n // Update by ID\n whereClause = 'vector_id = ?';\n whereValues = [params.id];\n } else if ('filter' in params && params.filter) {\n // Update by filter\n const filter = params.filter;\n\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot update with empty filter',\n });\n }\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterSql, values: filterValues } = buildFilterQuery(translatedFilter);\n\n if (!filterSql || filterSql.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'INVALID_FILTER'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Filter produced empty WHERE clause',\n });\n }\n\n // Guard against match-all patterns that would update all vectors\n // Normalize SQL by removing WHERE prefix and extra whitespace for pattern matching\n const normalizedCondition = filterSql\n .replace(/^\\s*WHERE\\s+/i, '')\n .trim()\n .toLowerCase();\n const matchAllPatterns = ['true', '1 = 1', '1=1'];\n\n if (matchAllPatterns.includes(normalizedCondition)) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'MATCH_ALL_FILTER'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, filterSql: normalizedCondition },\n text: 'Filter matches all vectors. Provide a specific filter to update targeted vectors.',\n });\n }\n\n // buildFilterQuery already includes \"WHERE\" in the SQL, so we need to extract just the condition\n whereClause = filterSql.replace(/^WHERE\\s+/i, '');\n whereValues = filterValues;\n } else {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'NO_TARGET'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Either id or filter must be provided',\n });\n }\n\n const query = `\n UPDATE ${parsedIndexName}\n SET ${updates.join(', ')}\n WHERE ${whereClause};\n `;\n\n try {\n await this.turso.execute({\n sql: query,\n args: [...args, ...whereValues],\n });\n } catch (error) {\n const errorDetails: Record<string, any> = { indexName };\n\n if ('id' in params && params.id) {\n errorDetails.id = params.id;\n }\n\n if ('filter' in params && params.filter) {\n errorDetails.filter = JSON.stringify(params.filter);\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: errorDetails,\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n public deleteVector(args: DeleteVectorParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this.doDeleteVector(args));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName: args.indexName,\n ...(args.id && { id: args.id }),\n },\n },\n error,\n );\n }\n }\n\n private async doDeleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n await this.turso.execute({\n sql: `DELETE FROM ${parsedIndexName} WHERE vector_id = ?`,\n args: [id],\n });\n }\n\n public deleteVectors(args: DeleteVectorsParams<LibSQLVectorFilter>): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doDeleteVectors(args));\n }\n\n private async doDeleteVectors({ indexName, filter, ids }: DeleteVectorsParams<LibSQLVectorFilter>): Promise<void> {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n\n // Validate that exactly one of filter or ids is provided\n if (!filter && !ids) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTORS', 'NO_TARGET'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Either filter or ids must be provided',\n });\n }\n\n if (filter && ids) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot provide both filter and ids - they are mutually exclusive',\n });\n }\n\n let query: string;\n let values: InValue[];\n\n if (ids) {\n // Delete by IDs\n if (ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTORS', 'EMPTY_IDS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot delete with empty ids array',\n });\n }\n\n const placeholders = ids.map(() => '?').join(', ');\n query = `DELETE FROM ${parsedIndexName} WHERE vector_id IN (${placeholders})`;\n values = ids;\n } else {\n // Delete by filter\n // Safety check: Don't allow empty filters to prevent accidental deletion of all vectors\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Cannot delete with empty filter. Use deleteIndex to delete all vectors.',\n });\n }\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterSql, values: filterValues } = buildFilterQuery(translatedFilter);\n\n if (!filterSql || filterSql.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTORS', 'INVALID_FILTER'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n text: 'Filter produced empty WHERE clause',\n });\n }\n\n // Guard against match-all patterns that would delete all vectors\n // Normalize SQL by removing WHERE prefix and extra whitespace for pattern matching\n const normalizedCondition = filterSql\n .replace(/^\\s*WHERE\\s+/i, '')\n .trim()\n .toLowerCase();\n const matchAllPatterns = ['true', '1 = 1', '1=1'];\n\n if (matchAllPatterns.includes(normalizedCondition)) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'DELETE_VECTORS', 'MATCH_ALL_FILTER'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, filterSql: normalizedCondition },\n text: 'Filter matches all vectors. Use deleteIndex to delete all vectors from an index.',\n });\n }\n\n // buildFilterQuery already includes \"WHERE\" in the SQL\n query = `DELETE FROM ${parsedIndexName} ${filterSql}`;\n values = filterValues;\n }\n\n try {\n await this.turso.execute({\n sql: query,\n args: values,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', '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 public truncateIndex(args: DeleteIndexParams): Promise<void> {\n try {\n return this.executeWriteOperationWithRetry(() => this._doTruncateIndex(args));\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('LIBSQL', 'TRUNCATE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: args.indexName },\n },\n error,\n );\n }\n }\n\n private async _doTruncateIndex({ indexName }: DeleteIndexParams): Promise<void> {\n await this.turso.execute({\n sql: `DELETE FROM ${parseSqlIdentifier(indexName, 'index name')}`,\n args: [],\n });\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { MessageList } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport type { StoreOperationsLibSQL } from '../operations';\n\nexport class MemoryLibSQL extends MemoryStorage {\n private client: Client;\n private operations: StoreOperationsLibSQL;\n constructor({ client, operations }: { client: Client; operations: StoreOperationsLibSQL }) {\n super();\n this.client = client;\n this.operations = operations;\n }\n\n private parseRow(row: any): MastraDBMessage {\n let content = row.content;\n try {\n content = JSON.parse(row.content);\n } catch {\n // use content as is if it's not JSON\n }\n const result = {\n id: row.id,\n content,\n role: row.role,\n createdAt: new Date(row.createdAt as string),\n threadId: row.thread_id,\n resourceId: row.resourceId,\n } as MastraDBMessage;\n if (row.type && row.type !== `v2`) result.type = row.type;\n return result;\n }\n\n private async _getIncludedMessages({ include }: { include: StorageListMessagesInput['include'] }) {\n if (!include || include.length === 0) return null;\n\n const unionQueries: string[] = [];\n const params: any[] = [];\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n // Query by message ID directly - get the threadId from the message itself via subquery\n unionQueries.push(\n `\n SELECT * FROM (\n WITH target_thread AS (\n SELECT thread_id FROM \"${TABLE_MESSAGES}\" WHERE id = ?\n ),\n numbered_messages AS (\n SELECT\n id, content, role, type, \"createdAt\", thread_id, \"resourceId\",\n ROW_NUMBER() OVER (ORDER BY \"createdAt\" ASC) as row_num\n FROM \"${TABLE_MESSAGES}\"\n WHERE thread_id = (SELECT thread_id FROM target_thread)\n ),\n target_positions AS (\n SELECT row_num as target_pos\n FROM numbered_messages\n WHERE id = ?\n )\n SELECT DISTINCT m.*\n FROM numbered_messages m\n CROSS JOIN target_positions t\n WHERE m.row_num BETWEEN (t.target_pos - ?) AND (t.target_pos + ?)\n ) \n `, // Keep ASC for final sorting after fetching context\n );\n params.push(id, id, withPreviousMessages, withNextMessages);\n }\n const finalQuery = unionQueries.join(' UNION ALL ') + ' ORDER BY \"createdAt\" ASC';\n const includedResult = await this.client.execute({ sql: finalQuery, args: params });\n const includedRows = includedResult.rows?.map(row => this.parseRow(row));\n const seen = new Set<string>();\n const dedupedRows = includedRows.filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n return dedupedRows;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n try {\n const sql = `\n SELECT \n id, \n content, \n role, \n type,\n \"createdAt\", \n thread_id,\n \"resourceId\"\n FROM \"${TABLE_MESSAGES}\"\n WHERE id IN (${messageIds.map(() => '?').join(', ')})\n ORDER BY \"createdAt\" DESC\n `;\n const result = await this.client.execute({ sql, args: messageIds });\n if (!result.rows) return { messages: [] };\n\n const list = new MessageList().add(result.rows.map(this.parseRow), 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\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: createStorageErrorId('LIBSQL', '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 if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', '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 const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n // Determine sort field and direction\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n // Build WHERE conditions - use IN for multiple thread IDs\n const threadPlaceholders = threadIds.map(() => '?').join(', ');\n const conditions: string[] = [`thread_id IN (${threadPlaceholders})`];\n const queryParams: InValue[] = [...threadIds];\n\n if (resourceId) {\n conditions.push(`\"resourceId\" = ?`);\n queryParams.push(resourceId);\n }\n\n if (filter?.dateRange?.start) {\n conditions.push(`\"createdAt\" >= ?`);\n queryParams.push(\n filter.dateRange.start instanceof Date ? filter.dateRange.start.toISOString() : filter.dateRange.start,\n );\n }\n\n if (filter?.dateRange?.end) {\n conditions.push(`\"createdAt\" <= ?`);\n queryParams.push(\n filter.dateRange.end instanceof Date ? filter.dateRange.end.toISOString() : filter.dateRange.end,\n );\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_MESSAGES} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.client.execute({\n sql: `SELECT id, content, role, type, \"createdAt\", \"resourceId\", \"thread_id\" FROM ${TABLE_MESSAGES} ${whereClause} ${orderByStatement} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, offset],\n });\n const messages: MastraDBMessage[] = (dataResult.rows || []).map((row: any) => this.parseRow(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 const includeMessages = await this._getIncludedMessages({ include });\n if (includeMessages) {\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\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 isDateField = field === 'createdAt' || field === 'updatedAt';\n const aValue = isDateField ? new Date((a as any)[field]).getTime() : (a as any)[field];\n const bValue = isDateField ? new Date((b as any)[field]).getTime() : (b as any)[field];\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(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 threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('LIBSQL', '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({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages };\n\n try {\n const threadId = messages[0]?.threadId;\n if (!threadId) {\n throw new Error('Thread ID is required');\n }\n\n // Prepare batch statements for all messages\n const batchStatements = messages.map(message => {\n const time = message.createdAt || new Date();\n if (!message.threadId) {\n throw new Error(\n `Expected to find a threadId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n if (!message.resourceId) {\n throw new Error(\n `Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n return {\n sql: `INSERT INTO \"${TABLE_MESSAGES}\" (id, thread_id, content, role, type, \"createdAt\", \"resourceId\") \n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n thread_id=excluded.thread_id,\n content=excluded.content,\n role=excluded.role,\n type=excluded.type,\n \"resourceId\"=excluded.\"resourceId\"\n `,\n args: [\n message.id,\n message.threadId!,\n typeof message.content === 'object' ? JSON.stringify(message.content) : message.content,\n message.role,\n message.type || 'v2',\n time instanceof Date ? time.toISOString() : time,\n message.resourceId,\n ],\n };\n });\n\n const now = new Date().toISOString();\n batchStatements.push({\n sql: `UPDATE \"${TABLE_THREADS}\" SET \"updatedAt\" = ? WHERE id = ?`,\n args: [now, threadId],\n });\n\n // Execute in batches to avoid potential limitations\n const BATCH_SIZE = 50; // Safe batch size for libsql\n\n // Separate message statements from thread update\n const messageStatements = batchStatements.slice(0, -1);\n const threadUpdateStatement = batchStatements[batchStatements.length - 1];\n\n // Process message statements in batches\n for (let i = 0; i < messageStatements.length; i += BATCH_SIZE) {\n const batch = messageStatements.slice(i, i + BATCH_SIZE);\n if (batch.length > 0) {\n await this.client.batch(batch, 'write');\n }\n }\n\n // Execute thread update separately\n if (threadUpdateStatement) {\n await this.client.execute(threadUpdateStatement);\n }\n\n const list = new MessageList().add(messages as any, 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: { metadata?: MastraMessageContentV2['metadata']; content?: MastraMessageContentV2['content'] };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (messages.length === 0) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n const placeholders = messageIds.map(() => '?').join(',');\n\n const selectSql = `SELECT * FROM ${TABLE_MESSAGES} WHERE id IN (${placeholders})`;\n const existingResult = await this.client.execute({ sql: selectSql, args: messageIds });\n const existingMessages: MastraDBMessage[] = existingResult.rows.map(row => this.parseRow(row));\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n const batchStatements = [];\n const threadIdsToUpdate = new Set<string>();\n const columnMapping: Record<string, string> = {\n threadId: 'thread_id',\n };\n\n for (const existingMessage of existingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses = [];\n const args: InValue[] = [];\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for the 'content' field to merge instead of overwrite\n if (updatableFields.content) {\n const newContent = {\n ...existingMessage.content,\n ...updatableFields.content,\n // Deep merge metadata if it exists on both\n ...(existingMessage.content?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingMessage.content.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n setClauses.push(`${parseSqlIdentifier('content', 'column name')} = ?`);\n args.push(JSON.stringify(newContent));\n delete updatableFields.content;\n }\n\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbKey = columnMapping[key] || key;\n setClauses.push(`${parseSqlIdentifier(dbKey, 'column name')} = ?`);\n let value = updatableFields[key as keyof typeof updatableFields];\n\n if (typeof value === 'object' && value !== null) {\n value = JSON.stringify(value);\n }\n args.push(value as InValue);\n }\n }\n\n if (setClauses.length === 0) continue;\n\n args.push(id);\n\n const sql = `UPDATE ${TABLE_MESSAGES} SET ${setClauses.join(', ')} WHERE id = ?`;\n batchStatements.push({ sql, args });\n }\n\n if (batchStatements.length === 0) {\n return existingMessages;\n }\n\n const now = new Date().toISOString();\n for (const threadId of threadIdsToUpdate) {\n if (threadId) {\n batchStatements.push({\n sql: `UPDATE ${TABLE_THREADS} SET updatedAt = ? WHERE id = ?`,\n args: [now, threadId],\n });\n }\n }\n\n await this.client.batch(batchStatements, 'write');\n\n const updatedResult = await this.client.execute({ sql: selectSql, args: messageIds });\n return updatedResult.rows.map(row => this.parseRow(row));\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n try {\n // Process in batches to avoid SQL parameter limits\n const BATCH_SIZE = 100;\n const threadIds = new Set<string>();\n\n // Use a transaction to ensure consistency\n const tx = await this.client.transaction('write');\n\n try {\n for (let i = 0; i < messageIds.length; i += BATCH_SIZE) {\n const batch = messageIds.slice(i, i + BATCH_SIZE);\n const placeholders = batch.map(() => '?').join(',');\n\n // Get thread IDs for this batch\n const result = await tx.execute({\n sql: `SELECT DISTINCT thread_id FROM \"${TABLE_MESSAGES}\" WHERE id IN (${placeholders})`,\n args: batch,\n });\n\n result.rows?.forEach(row => {\n if (row.thread_id) threadIds.add(row.thread_id as string);\n });\n\n // Delete messages in this batch\n await tx.execute({\n sql: `DELETE FROM \"${TABLE_MESSAGES}\" WHERE id IN (${placeholders})`,\n args: batch,\n });\n }\n\n // Update thread timestamps within the transaction\n if (threadIds.size > 0) {\n const now = new Date().toISOString();\n for (const threadId of threadIds) {\n await tx.execute({\n sql: `UPDATE \"${TABLE_THREADS}\" SET \"updatedAt\" = ? WHERE id = ?`,\n args: [now, threadId],\n });\n }\n }\n\n // Commit the transaction\n await tx.commit();\n } catch (error) {\n // Rollback on error\n await tx.rollback();\n throw error;\n }\n\n // TODO: Delete from vector store if semantic recall is enabled\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const result = await this.operations.load<StorageResourceType>({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n\n if (!result) {\n return null;\n }\n\n return {\n ...result,\n // Ensure workingMemory is always returned as a string, even if auto-parsed as JSON\n workingMemory:\n result.workingMemory && typeof result.workingMemory === 'object'\n ? JSON.stringify(result.workingMemory)\n : result.workingMemory,\n metadata: typeof result.metadata === 'string' ? JSON.parse(result.metadata) : result.metadata,\n createdAt: new Date(result.createdAt),\n updatedAt: new Date(result.updatedAt),\n };\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n await this.operations.insert({\n tableName: TABLE_RESOURCES,\n record: {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n },\n });\n\n return 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 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 updates: string[] = [];\n const values: InValue[] = [];\n\n if (workingMemory !== undefined) {\n updates.push('workingMemory = ?');\n values.push(workingMemory);\n }\n\n if (metadata) {\n updates.push('metadata = ?');\n values.push(JSON.stringify(updatedResource.metadata));\n }\n\n updates.push('updatedAt = ?');\n values.push(updatedResource.updatedAt.toISOString());\n\n values.push(resourceId);\n\n await this.client.execute({\n sql: `UPDATE ${TABLE_RESOURCES} SET ${updates.join(', ')} WHERE id = ?`,\n args: values,\n });\n\n return updatedResource;\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const result = await this.operations.load<\n Omit<StorageThreadType, 'createdAt' | 'updatedAt'> & { createdAt: string; updatedAt: string }\n >({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!result) {\n return null;\n }\n\n return {\n ...result,\n metadata: typeof result.metadata === 'string' ? JSON.parse(result.metadata) : result.metadata,\n createdAt: new Date(result.createdAt),\n updatedAt: new Date(result.updatedAt),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n public async listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', '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 const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n const baseQuery = `FROM ${TABLE_THREADS} WHERE resourceId = ?`;\n const queryParams: InValue[] = [resourceId];\n\n const mapRowToStorageThreadType = (row: any): StorageThreadType => ({\n id: row.id as string,\n resourceId: row.resourceId as string,\n title: row.title as string,\n createdAt: new Date(row.createdAt as string), // Convert string to Date\n updatedAt: new Date(row.updatedAt as string), // Convert string to Date\n metadata: typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata,\n });\n\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count ${baseQuery}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.client.execute({\n sql: `SELECT * ${baseQuery} ORDER BY \"${field}\" ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, offset],\n });\n\n const threads = (dataResult.rows || []).map(mapRowToStorageThreadType);\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS_BY_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.operations.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n metadata: JSON.stringify(thread.metadata),\n },\n });\n\n return thread;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n throw mastraError;\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 thread = await this.getThreadById({ threadId: id });\n if (!thread) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_THREAD', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: {\n status: 404,\n threadId: id,\n },\n });\n }\n\n const updatedThread = {\n ...thread,\n title,\n metadata: {\n ...thread.metadata,\n ...metadata,\n },\n };\n\n try {\n await this.client.execute({\n sql: `UPDATE ${TABLE_THREADS} SET title = ?, metadata = ? WHERE id = ?`,\n args: [title, JSON.stringify(updatedThread.metadata), id],\n });\n\n return updatedThread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to update thread ${id}`,\n details: { threadId: id },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n // Delete messages for this thread (manual step)\n try {\n await this.client.execute({\n sql: `DELETE FROM ${TABLE_MESSAGES} WHERE thread_id = ?`,\n args: [threadId],\n });\n await this.client.execute({\n sql: `DELETE FROM ${TABLE_THREADS} WHERE id = ?`,\n args: [threadId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n // TODO: Need to check if CASCADE is enabled so that messages will be automatically deleted due to CASCADE constraint\n }\n}\n","import type { InValue } from '@libsql/client';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { safelyParseJSON, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { PaginationArgs, StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nexport function createExecuteWriteOperationWithRetry({\n logger,\n maxRetries,\n initialBackoffMs,\n}: {\n logger: IMastraLogger;\n maxRetries: number;\n initialBackoffMs: number;\n}) {\n return async function executeWriteOperationWithRetry<T>(\n operationFn: () => Promise<T>,\n operationDescription: string,\n ): Promise<T> {\n let retries = 0;\n\n while (true) {\n try {\n return await operationFn();\n } catch (error: any) {\n if (\n error.message &&\n (error.message.includes('SQLITE_BUSY') || error.message.includes('database is locked')) &&\n retries < maxRetries\n ) {\n retries++;\n const backoffTime = initialBackoffMs * Math.pow(2, retries - 1);\n logger.warn(\n `LibSQLStore: Encountered SQLITE_BUSY during ${operationDescription}. Retrying (${retries}/${maxRetries}) in ${backoffTime}ms...`,\n );\n await new Promise(resolve => setTimeout(resolve, backoffTime));\n } else {\n logger.error(`LibSQLStore: Error during ${operationDescription} after ${retries} retries: ${error}`);\n throw error;\n }\n }\n }\n };\n}\n\nexport function prepareStatement({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): {\n sql: string;\n args: InValue[];\n} {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const columns = Object.keys(record).map(col => parseSqlIdentifier(col, 'column name'));\n const values = Object.values(record).map(v => {\n if (typeof v === `undefined` || v === null) {\n // returning an undefined value will cause libsql to throw\n return null;\n }\n if (v instanceof Date) {\n return v.toISOString();\n }\n return typeof v === 'object' ? JSON.stringify(v) : v;\n });\n const placeholders = values.map(() => '?').join(', ');\n\n return {\n sql: `INSERT OR REPLACE INTO ${parsedTableName} (${columns.join(', ')}) VALUES (${placeholders})`,\n args: values,\n };\n}\n\nexport function prepareUpdateStatement({\n tableName,\n updates,\n keys,\n}: {\n tableName: TABLE_NAMES;\n updates: Record<string, any>;\n keys: Record<string, any>;\n}): {\n sql: string;\n args: InValue[];\n} {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const schema = TABLE_SCHEMAS[tableName];\n\n // Prepare SET clause\n const updateColumns = Object.keys(updates).map(col => parseSqlIdentifier(col, 'column name'));\n const updateValues = Object.values(updates).map(transformToSqlValue);\n const setClause = updateColumns.map(col => `${col} = ?`).join(', ');\n\n const whereClause = prepareWhereClause(keys, schema);\n\n return {\n sql: `UPDATE ${parsedTableName} SET ${setClause}${whereClause.sql}`,\n args: [...updateValues, ...whereClause.args],\n };\n}\n\nexport function transformToSqlValue(value: any): InValue {\n if (typeof value === 'undefined' || value === null) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n return typeof value === 'object' ? JSON.stringify(value) : value;\n}\n\nexport function prepareDeleteStatement({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): {\n sql: string;\n args: InValue[];\n} {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const whereClause = prepareWhereClause(keys, TABLE_SCHEMAS[tableName]);\n\n return {\n sql: `DELETE FROM ${parsedTableName}${whereClause.sql}`,\n args: whereClause.args,\n };\n}\n\ntype WhereValue = InValue | { startAt?: InValue; endAt?: InValue };\n\nexport function prepareWhereClause(\n filters: Record<string, WhereValue>,\n schema: Record<string, StorageColumn>,\n): {\n sql: string;\n args: InValue[];\n} {\n const conditions: string[] = [];\n const args: InValue[] = [];\n\n for (const [columnName, filterValue] of Object.entries(filters)) {\n const column = schema[columnName];\n if (!column) {\n throw new Error(`Unknown column: ${columnName}`);\n }\n\n const parsedColumn = parseSqlIdentifier(columnName, 'column name');\n const result = buildCondition(parsedColumn, filterValue);\n\n conditions.push(result.condition);\n args.push(...result.args);\n }\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n}\n\nfunction buildCondition(columnName: string, filterValue: WhereValue): { condition: string; args: InValue[] } {\n // Handle null values - IS NULL\n if (filterValue === null) {\n return { condition: `${columnName} IS NULL`, args: [] };\n }\n\n // Handle date range objects\n if (typeof filterValue === 'object' && filterValue !== null && ('startAt' in filterValue || 'endAt' in filterValue)) {\n return buildDateRangeCondition(columnName, filterValue);\n }\n\n // Handle exact match\n return {\n condition: `${columnName} = ?`,\n args: [transformToSqlValue(filterValue)],\n };\n}\n\nfunction buildDateRangeCondition(\n columnName: string,\n range: { startAt?: InValue; endAt?: InValue },\n): { condition: string; args: InValue[] } {\n const conditions: string[] = [];\n const args: InValue[] = [];\n\n if (range.startAt !== undefined) {\n conditions.push(`${columnName} >= ?`);\n args.push(transformToSqlValue(range.startAt));\n }\n\n if (range.endAt !== undefined) {\n conditions.push(`${columnName} <= ?`);\n args.push(transformToSqlValue(range.endAt));\n }\n\n if (conditions.length === 0) {\n throw new Error('Date range must specify at least startAt or endAt');\n }\n\n return {\n condition: conditions.join(' AND '),\n args,\n };\n}\n\ntype DateRangeFilter = {\n startAt?: string;\n endAt?: string;\n};\n\n/**\n * Converts pagination date range to where clause date range format\n * @param dateRange - The date range from pagination\n * @param columnName - The timestamp column to filter on (defaults to 'createdAt')\n * @returns Object with the date range filter, or empty object if no date range\n */\nexport function buildDateRangeFilter(\n dateRange?: PaginationArgs['dateRange'],\n columnName: string = 'createdAt',\n): Record<string, DateRangeFilter> {\n if (!dateRange?.start && !dateRange?.end) {\n return {};\n }\n\n const filter: DateRangeFilter = {};\n\n if (dateRange.start) {\n filter.startAt = new Date(dateRange.start).toISOString();\n }\n\n if (dateRange.end) {\n filter.endAt = new Date(dateRange.end).toISOString();\n }\n\n return { [columnName]: filter };\n}\n\n/**\n * Transforms SQL row data back to a typed object format\n * Reverses the transformations done in prepareStatement\n */\nexport function transformFromSqlRow<T>({\n tableName,\n sqlRow,\n}: {\n tableName: TABLE_NAMES;\n sqlRow: Record<string, any>;\n}): T {\n const result: Record<string, any> = {};\n const jsonColumns = new Set(\n Object.keys(TABLE_SCHEMAS[tableName])\n .filter(key => TABLE_SCHEMAS[tableName][key]!.type === 'jsonb')\n .map(key => key),\n );\n const dateColumns = new Set(\n Object.keys(TABLE_SCHEMAS[tableName])\n .filter(key => TABLE_SCHEMAS[tableName][key]!.type === 'timestamp')\n .map(key => key),\n );\n\n for (const [key, value] of Object.entries(sqlRow)) {\n if (value === null || value === undefined) {\n result[key] = value;\n continue;\n }\n\n if (dateColumns.has(key) && typeof value === 'string') {\n result[key] = new Date(value);\n continue;\n }\n\n if (jsonColumns.has(key) && typeof value === 'string') {\n result[key] = safelyParseJSON(value);\n continue;\n }\n\n result[key] = value;\n }\n\n return result as T;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, SPAN_SCHEMA, ObservabilityStorage, TABLE_SPANS } from '@mastra/core/storage';\nimport type {\n SpanRecord,\n CreateSpanRecord,\n UpdateSpanRecord,\n TraceRecord,\n TracesPaginatedArg,\n PaginationInfo,\n} from '@mastra/core/storage';\nimport type { StoreOperationsLibSQL } from '../operations';\nimport { buildDateRangeFilter, prepareWhereClause, transformFromSqlRow } from '../utils';\n\nexport class ObservabilityLibSQL extends ObservabilityStorage {\n private operations: StoreOperationsLibSQL;\n constructor({ operations }: { operations: StoreOperationsLibSQL }) {\n super();\n this.operations = operations;\n }\n\n async createSpan(span: CreateSpanRecord): Promise<void> {\n try {\n // Explicitly set createdAt/updatedAt timestamps\n const now = new Date().toISOString();\n const record = {\n ...span,\n createdAt: now,\n updatedAt: now,\n };\n return this.operations.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n spanName: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getTrace(traceId: string): Promise<TraceRecord | null> {\n try {\n const spans = await this.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ?', args: [traceId] },\n orderBy: 'startedAt DESC',\n });\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: spans.map(span => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: span })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async updateSpan({\n spanId,\n traceId,\n updates,\n }: {\n spanId: string;\n traceId: string;\n updates: Partial<UpdateSpanRecord>;\n }): Promise<void> {\n try {\n await this.operations.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data: { ...updates, updatedAt: new Date().toISOString() },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId,\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async getTracesPaginated({\n filters,\n pagination,\n }: TracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n const { entityId, entityType, ...actualFilters } = filters || {};\n\n const filtersWithDateRange: Record<string, any> = {\n ...actualFilters,\n ...buildDateRangeFilter(pagination?.dateRange, 'startedAt'),\n parentSpanId: null,\n };\n const whereClause = prepareWhereClause(filtersWithDateRange, SPAN_SCHEMA);\n\n let actualWhereClause = whereClause.sql || '';\n\n if (entityId && entityType) {\n const statement = `name = ?`;\n let name = '';\n if (entityType === 'workflow') {\n name = `workflow run: '${entityId}'`;\n } else if (entityType === 'agent') {\n name = `agent run: '${entityId}'`;\n } else {\n const error = new MastraError({\n id: createStorageErrorId('LIBSQL', 'GET_TRACES_PAGINATED', 'INVALID_ENTITY_TYPE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n entityType,\n },\n text: `Cannot filter by entity type: ${entityType}`,\n });\n this.logger?.trackException(error);\n throw error;\n }\n\n whereClause.args.push(name);\n\n if (actualWhereClause) {\n actualWhereClause += ` AND ${statement}`;\n } else {\n actualWhereClause += `WHERE ${statement}`;\n }\n }\n\n const orderBy = 'startedAt DESC';\n\n let count = 0;\n try {\n count = await this.operations.loadTotalCount({\n tableName: TABLE_SPANS,\n whereClause: { sql: actualWhereClause, args: whereClause.args },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_TRACES_PAGINATED', 'COUNT_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n\n if (count === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage,\n hasMore: false,\n },\n spans: [],\n };\n }\n\n try {\n const spans = await this.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: actualWhereClause,\n args: whereClause.args,\n },\n orderBy,\n offset: page * perPage,\n limit: perPage,\n });\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: spans.length === perPage,\n },\n spans: spans.map(span => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: span })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_TRACES_PAGINATED', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: { records: CreateSpanRecord[] }): Promise<void> {\n try {\n // Use single timestamp for all records in the batch\n const now = new Date().toISOString();\n return this.operations.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: {\n records: {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateSpanRecord>;\n }[];\n }): Promise<void> {\n try {\n return this.operations.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => ({\n keys: { spanId: record.spanId, traceId: record.traceId },\n data: { ...record.updates, updatedAt: new Date().toISOString() },\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: { traceIds: string[] }): Promise<void> {\n try {\n const keys = args.traceIds.map(traceId => ({ traceId }));\n return this.operations.batchDelete({\n tableName: TABLE_SPANS,\n keys,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, TABLE_WORKFLOW_SNAPSHOT, StoreOperations, TABLE_SPANS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n createExecuteWriteOperationWithRetry,\n prepareDeleteStatement,\n prepareStatement,\n prepareUpdateStatement,\n} from '../utils';\n\nexport class StoreOperationsLibSQL extends StoreOperations {\n private client: Client;\n /**\n * Maximum number of retries for write operations if an SQLITE_BUSY error occurs.\n * @default 5\n */\n maxRetries: number;\n /**\n * Initial backoff time in milliseconds for retrying write operations on SQLITE_BUSY.\n * The backoff time will double with each retry (exponential backoff).\n * @default 100\n */\n initialBackoffMs: number;\n\n constructor({\n client,\n maxRetries,\n initialBackoffMs,\n }: {\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n }) {\n super();\n this.client = client;\n\n this.maxRetries = maxRetries ?? 5;\n this.initialBackoffMs = initialBackoffMs ?? 100;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const result = await this.client.execute({\n sql: `PRAGMA table_info(${table})`,\n });\n return (await result.rows)?.some((row: any) => row.name === column);\n }\n\n private getCreateTableSQL(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): string {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const columns = Object.entries(schema).map(([name, col]) => {\n const parsedColumnName = parseSqlIdentifier(name, 'column name');\n let type = col.type.toUpperCase();\n if (type === 'TEXT') type = 'TEXT';\n if (type === 'TIMESTAMP') type = 'TEXT'; // Store timestamps as ISO strings\n // if (type === 'BIGINT') type = 'INTEGER';\n\n const nullable = col.nullable ? '' : 'NOT NULL';\n const primaryKey = col.primaryKey ? 'PRIMARY KEY' : '';\n\n return `${parsedColumnName} ${type} ${nullable} ${primaryKey}`.trim();\n });\n\n // For workflow_snapshot table, create a composite primary key\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const stmnt = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (\n ${columns.join(',\\n')},\n PRIMARY KEY (workflow_name, run_id)\n )`;\n return stmnt;\n }\n\n if (tableName === TABLE_SPANS) {\n const stmnt = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (\n ${columns.join(',\\n')},\n PRIMARY KEY (traceId, spanId)\n )`;\n return stmnt;\n }\n\n return `CREATE TABLE IF NOT EXISTS ${parsedTableName} (${columns.join(', ')})`;\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 this.logger.debug(`Creating database table`, { tableName, operation: 'schema init' });\n const sql = this.getCreateTableSQL(tableName, schema);\n await this.client.execute(sql);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'bigint':\n return 'INTEGER'; // SQLite uses INTEGER for all integer sizes\n case 'jsonb':\n return 'TEXT'; // Store JSON as TEXT in SQLite\n default:\n return super.getSqlType(type);\n }\n }\n\n private async doInsert({\n tableName,\n record,\n }: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n }): Promise<void> {\n await this.client.execute(\n prepareStatement({\n tableName,\n record,\n }),\n );\n }\n\n public insert(args: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n return executeWriteOperationWithRetry(() => this.doInsert(args), `insert into table ${args.tableName}`);\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n const parsedKeys = Object.keys(keys).map(key => parseSqlIdentifier(key, 'column name'));\n\n const conditions = parsedKeys.map(key => `${key} = ?`).join(' AND ');\n const values = Object.values(keys);\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${parsedTableName} WHERE ${conditions} ORDER BY createdAt DESC LIMIT 1`,\n args: values,\n });\n\n if (!result.rows || result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n // Checks whether the string looks like a JSON object ({}) or array ([])\n // If the string starts with { or [, it assumes it's JSON and parses it\n // Otherwise, it just returns, preventing unintended number conversions\n const parsed = Object.fromEntries(\n Object.entries(row || {}).map(([k, v]) => {\n try {\n return [k, typeof v === 'string' ? (v.startsWith('{') || v.startsWith('[') ? JSON.parse(v) : v) : v];\n } catch {\n return [k, v];\n }\n }),\n );\n\n return parsed as R;\n }\n\n async loadMany<R>({\n tableName,\n whereClause,\n orderBy,\n offset,\n limit,\n args,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: { sql: string; args: InValue[] };\n orderBy?: string;\n offset?: number;\n limit?: number;\n args?: any[];\n }): Promise<R[]> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n let statement = `SELECT * FROM ${parsedTableName}`;\n\n if (whereClause?.sql) {\n statement += `${whereClause.sql}`;\n }\n\n if (orderBy) {\n statement += ` ORDER BY ${orderBy}`;\n }\n\n if (limit) {\n statement += ` LIMIT ${limit}`;\n }\n\n if (offset) {\n statement += ` OFFSET ${offset}`;\n }\n\n const result = await this.client.execute({\n sql: statement,\n args: [...(whereClause?.args ?? []), ...(args ?? [])],\n });\n\n return result.rows as R[];\n }\n\n async loadTotalCount({\n tableName,\n whereClause,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: { sql: string; args: InValue[] };\n }): Promise<number> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n const statement = `SELECT COUNT(*) as count FROM ${parsedTableName} ${whereClause ? `${whereClause.sql}` : ''}`;\n\n const result = await this.client.execute({\n sql: statement,\n args: whereClause?.args ?? [],\n });\n\n if (!result.rows || result.rows.length === 0) {\n return 0;\n }\n\n return (result.rows[0]?.count as number) ?? 0;\n }\n\n public update(args: { tableName: TABLE_NAMES; keys: Record<string, any>; data: Record<string, any> }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n return executeWriteOperationWithRetry(() => this.executeUpdate(args), `update table ${args.tableName}`);\n }\n\n private async executeUpdate({\n tableName,\n keys,\n data,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n }): Promise<void> {\n await this.client.execute(prepareUpdateStatement({ tableName, updates: data, keys }));\n }\n\n private async doBatchInsert({\n tableName,\n records,\n }: {\n tableName: TABLE_NAMES;\n records: Record<string, any>[];\n }): Promise<void> {\n if (records.length === 0) return;\n const batchStatements = records.map(r => prepareStatement({ tableName, record: r }));\n await this.client.batch(batchStatements, 'write');\n }\n\n public batchInsert(args: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n return executeWriteOperationWithRetry(\n () => this.doBatchInsert(args),\n `batch insert into table ${args.tableName}`,\n ).catch(error => {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: args.tableName,\n },\n },\n error,\n );\n });\n }\n\n /**\n * Public batch update method with retry logic\n */\n public batchUpdate(args: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n return executeWriteOperationWithRetry(\n () => this.executeBatchUpdate(args),\n `batch update in table ${args.tableName}`,\n ).catch(error => {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BATCH_UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: args.tableName,\n },\n },\n error,\n );\n });\n }\n\n /**\n * Updates multiple records in batch. Each record can be updated based on single or composite keys.\n */\n private async executeBatchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n if (updates.length === 0) return;\n\n const batchStatements = updates.map(({ keys, data }) =>\n prepareUpdateStatement({\n tableName,\n updates: data,\n keys,\n }),\n );\n\n await this.client.batch(batchStatements, 'write');\n }\n\n /**\n * Public batch delete method with retry logic\n */\n public batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Array<Record<string, any>> }): Promise<void> {\n const executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n return executeWriteOperationWithRetry(\n () => this.executeBatchDelete({ tableName, keys }),\n `batch delete from table ${tableName}`,\n ).catch(error => {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BATCH_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n });\n }\n\n /**\n * Deletes multiple records in batch. Each record can be deleted based on single or composite keys.\n */\n private async executeBatchDelete({\n tableName,\n keys,\n }: {\n tableName: TABLE_NAMES;\n keys: Array<Record<string, any>>;\n }): Promise<void> {\n if (keys.length === 0) return;\n\n const batchStatements = keys.map(keyObj =>\n prepareDeleteStatement({\n tableName,\n keys: keyObj,\n }),\n );\n\n await this.client.batch(batchStatements, 'write');\n }\n\n /**\n * Alters table schema to add columns if they don't exist\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\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 const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n try {\n // 1. Get existing columns using PRAGMA\n const pragmaQuery = `PRAGMA table_info(${parsedTableName})`;\n const result = await this.client.execute(pragmaQuery);\n const existingColumnNames = new Set(result.rows.map((row: any) => row.name.toLowerCase()));\n\n // 2. Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumnNames.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n const sqlType = this.getSqlType(columnDef.type); // ensure this exists or implement\n const nullable = columnDef.nullable === false ? 'NOT NULL' : '';\n // In SQLite, you must provide a DEFAULT if adding a NOT NULL column to a non-empty table\n const defaultValue = columnDef.nullable === false ? this.getDefaultValue(columnDef.type) : '';\n const alterSql =\n `ALTER TABLE ${parsedTableName} ADD COLUMN \"${columnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n\n await this.client.execute(alterSql);\n this.logger?.debug?.(`Added column ${columnName} to table ${parsedTableName}`);\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n try {\n await this.client.execute(`DELETE FROM ${parsedTableName}`);\n } catch (e) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n e,\n );\n this.logger?.trackException?.(mastraError);\n this.logger?.error?.(mastraError.toString());\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n try {\n await this.client.execute(`DROP TABLE IF EXISTS ${parsedTableName}`);\n } catch (e) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n e,\n );\n }\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { ScoreRowData, ScoringSource, ValidatedSaveScorePayload } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n TABLE_SCORERS,\n ScoresStorage,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination } from '@mastra/core/storage';\nimport type { StoreOperationsLibSQL } from '../operations';\n\nexport class ScoresLibSQL extends ScoresStorage {\n private operations: StoreOperationsLibSQL;\n private client: Client;\n constructor({ client, operations }: { client: Client; operations: StoreOperationsLibSQL }) {\n super();\n this.operations = operations;\n this.client = client;\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\n // Get total count first\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE runId = ?`,\n args: [runId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE runId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [runId, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n try {\n const { page, perPage: perPageInput } = pagination;\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (scorerId) {\n conditions.push(`scorerId = ?`);\n queryParams.push(scorerId);\n }\n\n if (entityId) {\n conditions.push(`entityId = ?`);\n queryParams.push(entityId);\n }\n\n if (entityType) {\n conditions.push(`entityType = ?`);\n queryParams.push(entityType);\n }\n\n if (source) {\n conditions.push(`source = ?`);\n queryParams.push(source);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count first\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * LibSQL-specific score row transformation.\n * Maps additionalLLMContext column to additionalContext field.\n */\n private transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row, {\n fieldMappings: { additionalContext: 'additionalLLMContext' },\n });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE id = ?`,\n args: [id],\n });\n return result.rows?.[0] ? this.transformScoreRow(result.rows[0]) : null;\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n let parsedScore: ValidatedSaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: score.scorer.id,\n entityId: score.entityId,\n entityType: score.entityType,\n traceId: score.traceId || '',\n spanId: score.spanId || '',\n },\n },\n error,\n );\n }\n\n try {\n const id = crypto.randomUUID();\n\n await this.operations.insert({\n tableName: TABLE_SCORERS,\n record: {\n id,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...parsedScore,\n },\n });\n\n const scoreFromDb = await this.getScoreById({ id });\n return { score: scoreFromDb! };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\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\n // Get total count first\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE entityId = ? AND entityType = ?`,\n args: [entityId, entityType],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageInput,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE entityId = ? AND entityType = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [entityId, entityType, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\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 countSQLResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_SCORERS} WHERE traceId = ? AND spanId = ?`,\n args: [traceId, spanId],\n });\n\n const total = Number(countSQLResult.rows?.[0]?.count ?? 0);\n\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_SCORERS} WHERE traceId = ? AND spanId = ? ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [traceId, spanId, limitValue, start],\n });\n\n const scores = result.rows?.map(row => this.transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { WorkflowRun, WorkflowRuns, StorageListWorkflowRunsInput } from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type { WorkflowRunState, StepResult } from '@mastra/core/workflows';\nimport type { StoreOperationsLibSQL } from '../operations';\n\nfunction parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\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 return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n resourceId: row.resourceId as string,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n}\n\nexport class WorkflowsLibSQL extends WorkflowsStorage {\n operations: StoreOperationsLibSQL;\n client: Client;\n private readonly maxRetries: number;\n private readonly initialBackoffMs: number;\n\n constructor({\n operations,\n client,\n maxRetries = 5,\n initialBackoffMs = 500,\n }: {\n operations: StoreOperationsLibSQL;\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n }) {\n super();\n this.operations = operations;\n this.client = client;\n this.maxRetries = maxRetries;\n this.initialBackoffMs = initialBackoffMs;\n\n // Set PRAGMA settings to help with database locks\n // Note: This is async but we can't await in constructor, so we'll handle it as a fire-and-forget\n this.setupPragmaSettings().catch(err =>\n this.logger.warn('LibSQL Workflows: Failed to setup PRAGMA settings.', err),\n );\n }\n\n private async setupPragmaSettings() {\n try {\n // Set busy timeout to wait longer before returning busy errors\n await this.client.execute('PRAGMA busy_timeout = 10000;');\n this.logger.debug('LibSQL Workflows: PRAGMA busy_timeout=10000 set.');\n\n // Enable WAL mode for better concurrency (if supported)\n try {\n await this.client.execute('PRAGMA journal_mode = WAL;');\n this.logger.debug('LibSQL Workflows: PRAGMA journal_mode=WAL set.');\n } catch {\n this.logger.debug('LibSQL Workflows: WAL mode not supported, using default journal mode.');\n }\n\n // Set synchronous mode for better durability vs performance trade-off\n try {\n await this.client.execute('PRAGMA synchronous = NORMAL;');\n this.logger.debug('LibSQL Workflows: PRAGMA synchronous=NORMAL set.');\n } catch {\n this.logger.debug('LibSQL Workflows: Failed to set synchronous mode.');\n }\n } catch (err) {\n this.logger.warn('LibSQL Workflows: Failed to set PRAGMA settings.', err);\n }\n }\n\n private async executeWithRetry<T>(operation: () => Promise<T>): Promise<T> {\n let attempts = 0;\n let backoff = this.initialBackoffMs;\n\n while (attempts < this.maxRetries) {\n try {\n return await operation();\n } catch (error: any) {\n // Log the error details for debugging\n this.logger.debug('LibSQL Workflows: Error caught in retry loop', {\n errorType: error.constructor.name,\n errorCode: error.code,\n errorMessage: error.message,\n attempts,\n maxRetries: this.maxRetries,\n });\n\n // Check for various database lock/busy conditions\n const isLockError =\n error.code === 'SQLITE_BUSY' ||\n error.code === 'SQLITE_LOCKED' ||\n error.message?.toLowerCase().includes('database is locked') ||\n error.message?.toLowerCase().includes('database table is locked') ||\n error.message?.toLowerCase().includes('table is locked') ||\n (error.constructor.name === 'SqliteError' && error.message?.toLowerCase().includes('locked'));\n\n if (isLockError) {\n attempts++;\n if (attempts >= this.maxRetries) {\n this.logger.error(\n `LibSQL Workflows: Operation failed after ${this.maxRetries} attempts due to database lock: ${error.message}`,\n { error, attempts, maxRetries: this.maxRetries },\n );\n throw error;\n }\n this.logger.warn(\n `LibSQL Workflows: Attempt ${attempts} failed due to database lock. Retrying in ${backoff}ms...`,\n { errorMessage: error.message, attempts, backoff, maxRetries: this.maxRetries },\n );\n await new Promise(resolve => setTimeout(resolve, backoff));\n backoff *= 2;\n } else {\n // Not a lock error, re-throw immediately\n this.logger.error('LibSQL Workflows: Non-lock error occurred, not retrying', { error });\n throw error;\n }\n }\n }\n throw new Error('LibSQL Workflows: Max retries reached, but no error was re-thrown from the loop.');\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.executeWithRetry(async () => {\n // Use a transaction to ensure atomicity\n const tx = await this.client.transaction('write');\n try {\n // Load existing snapshot within transaction\n const existingSnapshotResult = await tx.execute({\n sql: `SELECT snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,\n args: [workflowName, runId],\n });\n\n let snapshot: WorkflowRunState;\n if (!existingSnapshotResult.rows?.[0]) {\n // Create new snapshot if none exists\n snapshot = {\n context: {},\n activePaths: [],\n timestamp: Date.now(),\n suspendedPaths: {},\n activeStepsPath: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId: runId,\n requestContext: {},\n } as WorkflowRunState;\n } else {\n // Parse existing snapshot\n const existingSnapshot = existingSnapshotResult.rows[0].snapshot;\n snapshot = typeof existingSnapshot === 'string' ? JSON.parse(existingSnapshot) : existingSnapshot;\n }\n\n // Merge the new step result and request context\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n\n // Update the snapshot within the same transaction\n await tx.execute({\n sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,\n args: [JSON.stringify(snapshot), workflowName, runId],\n });\n\n await tx.commit();\n return snapshot.context;\n } catch (error) {\n if (!tx.closed) {\n await tx.rollback();\n }\n throw error;\n }\n });\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.executeWithRetry(async () => {\n // Use a transaction to ensure atomicity\n const tx = await this.client.transaction('write');\n try {\n // Load existing snapshot within transaction\n const existingSnapshotResult = await tx.execute({\n sql: `SELECT snapshot FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,\n args: [workflowName, runId],\n });\n\n if (!existingSnapshotResult.rows?.[0]) {\n await tx.rollback();\n return undefined;\n }\n\n // Parse existing snapshot\n const existingSnapshot = existingSnapshotResult.rows[0].snapshot;\n const snapshot = typeof existingSnapshot === 'string' ? JSON.parse(existingSnapshot) : existingSnapshot;\n\n if (!snapshot || !snapshot?.context) {\n await tx.rollback();\n throw new Error(`Snapshot not found for runId ${runId}`);\n }\n\n // Merge the new options with the existing snapshot\n const updatedSnapshot = { ...snapshot, ...opts };\n\n // Update the snapshot within the same transaction\n await tx.execute({\n sql: `UPDATE ${TABLE_WORKFLOW_SNAPSHOT} SET snapshot = ? WHERE workflow_name = ? AND run_id = ?`,\n args: [JSON.stringify(updatedSnapshot), workflowName, runId],\n });\n\n await tx.commit();\n return updatedSnapshot;\n } catch (error) {\n if (!tx.closed) {\n await tx.rollback();\n }\n throw error;\n }\n });\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 }) {\n const data = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.logger.debug('Persisting workflow snapshot', { workflowName, runId, data });\n await this.operations.insert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: data,\n });\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n this.logger.debug('Loading workflow snapshot', { workflowName, runId });\n const d = await this.operations.load<{ snapshot: WorkflowRunState }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n return d ? d.snapshot : null;\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const conditions: string[] = [];\n const args: (string | number)[] = [];\n\n if (runId) {\n conditions.push('run_id = ?');\n args.push(runId);\n }\n\n if (workflowName) {\n conditions.push('workflow_name = ?');\n args.push(workflowName);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n try {\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC LIMIT 1`,\n args,\n });\n\n if (!result.rows?.[0]) {\n return null;\n }\n\n return parseWorkflowRun(result.rows[0]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const args: InValue[] = [];\n\n if (workflowName) {\n conditions.push('workflow_name = ?');\n args.push(workflowName);\n }\n\n if (status) {\n conditions.push(\"json_extract(snapshot, '$.status') = ?\");\n args.push(status);\n }\n\n if (fromDate) {\n conditions.push('createdAt >= ?');\n args.push(fromDate.toISOString());\n }\n\n if (toDate) {\n conditions.push('createdAt <= ?');\n args.push(toDate.toISOString());\n }\n\n if (resourceId) {\n const hasResourceId = await this.operations.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push('resourceId = ?');\n args.push(resourceId);\n } else {\n console.warn(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n let total = 0;\n // Only get total count when using pagination\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n if (usePagination) {\n const countResult = await this.client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause}`,\n args,\n });\n total = Number(countResult.rows?.[0]?.count ?? 0);\n }\n\n // Get results\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page! * normalizedPerPage : 0;\n const result = await this.client.execute({\n sql: `SELECT * FROM ${TABLE_WORKFLOW_SNAPSHOT} ${whereClause} ORDER BY createdAt DESC${usePagination ? ` LIMIT ? OFFSET ?` : ''}`,\n args: usePagination ? [...args, normalizedPerPage, offset] : args,\n });\n\n const runs = (result.rows || []).map(row => parseWorkflowRun(row));\n\n // Use runs.length as total when not paginating\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { createClient } from '@libsql/client';\nimport type { Client } from '@libsql/client';\nimport type { MastraMessageContentV2, MastraDBMessage } from '@mastra/core/agent';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport { MastraStorage } from '@mastra/core/storage';\nimport type {\n PaginationInfo,\n StorageColumn,\n StoragePagination,\n StorageResourceType,\n TABLE_NAMES,\n WorkflowRun,\n WorkflowRuns,\n StorageDomains,\n SpanRecord,\n TraceRecord,\n TracesPaginatedArg,\n StorageListWorkflowRunsInput,\n} from '@mastra/core/storage';\n\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { MemoryLibSQL } from './domains/memory';\nimport { ObservabilityLibSQL } from './domains/observability';\nimport { StoreOperationsLibSQL } from './domains/operations';\nimport { ScoresLibSQL } from './domains/scores';\nimport { WorkflowsLibSQL } from './domains/workflows';\n\n/**\n * Base configuration options shared across LibSQL configurations\n */\nexport type LibSQLBaseConfig = {\n id: string;\n /**\n * Maximum number of retries for write operations if an SQLITE_BUSY error occurs.\n * @default 5\n */\n maxRetries?: number;\n /**\n * Initial backoff time in milliseconds for retrying write operations on SQLITE_BUSY.\n * The backoff time will double with each retry (exponential backoff).\n * @default 100\n */\n initialBackoffMs?: number;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new LibSQLStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new LibSQLStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n};\n\nexport type LibSQLConfig =\n | (LibSQLBaseConfig & {\n url: string;\n authToken?: string;\n })\n | (LibSQLBaseConfig & {\n client: Client;\n });\n\nexport class LibSQLStore extends MastraStorage {\n private client: Client;\n private readonly maxRetries: number;\n private readonly initialBackoffMs: number;\n\n stores: StorageDomains;\n\n constructor(config: LibSQLConfig) {\n if (!config.id || typeof config.id !== 'string' || config.id.trim() === '') {\n throw new Error('LibSQLStore: id must be provided and cannot be empty.');\n }\n super({ id: config.id, name: `LibSQLStore`, disableInit: config.disableInit });\n\n this.maxRetries = config.maxRetries ?? 5;\n this.initialBackoffMs = config.initialBackoffMs ?? 100;\n\n if ('url' in config) {\n // need to re-init every time for in memory dbs or the tables might not exist\n if (config.url.endsWith(':memory:')) {\n this.shouldCacheInit = false;\n }\n\n this.client = createClient({\n url: config.url,\n ...(config.authToken ? { authToken: config.authToken } : {}),\n });\n\n // Set PRAGMAs for better concurrency, especially for file-based databases\n if (config.url.startsWith('file:') || config.url.includes(':memory:')) {\n this.client\n .execute('PRAGMA journal_mode=WAL;')\n .then(() => this.logger.debug('LibSQLStore: PRAGMA journal_mode=WAL set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA journal_mode=WAL.', err));\n this.client\n .execute('PRAGMA busy_timeout = 5000;') // 5 seconds\n .then(() => this.logger.debug('LibSQLStore: PRAGMA busy_timeout=5000 set.'))\n .catch(err => this.logger.warn('LibSQLStore: Failed to set PRAGMA busy_timeout.', err));\n }\n } else {\n this.client = config.client;\n }\n\n const operations = new StoreOperationsLibSQL({\n client: this.client,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n\n const scores = new ScoresLibSQL({ client: this.client, operations });\n const workflows = new WorkflowsLibSQL({ client: this.client, operations });\n const memory = new MemoryLibSQL({ client: this.client, operations });\n const observability = new ObservabilityLibSQL({ operations });\n\n this.stores = {\n operations,\n scores,\n workflows,\n memory,\n observability,\n };\n }\n\n public get supports() {\n return {\n selectByIncludeResourceScope: true,\n resourceWorkingMemory: true,\n hasColumn: true,\n createTable: true,\n deleteMessages: true,\n observabilityInstance: true,\n listScoresBySpan: true,\n };\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n await this.stores.operations.createTable({ tableName, schema });\n }\n\n /**\n * Alters table schema to add columns if they don't exist\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\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 await this.stores.operations.alterTable({ tableName, schema, ifNotExists });\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n await this.stores.operations.clearTable({ tableName });\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n await this.stores.operations.dropTable({ tableName });\n }\n\n public insert(args: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.stores.operations.insert(args);\n }\n\n public batchInsert(args: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.stores.operations.batchInsert(args);\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\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 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 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 const result = await this.stores.memory.saveMessages({ messages: args.messages });\n return { messages: result.messages };\n }\n\n async updateMessages({\n messages,\n }: {\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({ messages });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n return this.stores.memory.deleteMessages(messageIds);\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n return this.stores.scores.getScoreById({ id });\n }\n\n async saveScore(score: Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>): Promise<{ score: ScoreRowData }> {\n return this.stores.scores.saveScore(score);\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination: StoragePagination;\n }): Promise<{ pagination: PaginationInfo; scores: ScoreRowData[] }> {\n return this.stores.scores.listScoresByScorerId({ scorerId, entityId, entityType, source, pagination });\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 /**\n * WORKFLOWS\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 listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.stores.workflows.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n return this.stores.workflows.getWorkflowRunById({ runId, workflowName });\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 async createSpan(span: SpanRecord): Promise<void> {\n return this.stores.observability!.createSpan(span);\n }\n\n async updateSpan(params: {\n spanId: string;\n traceId: string;\n updates: Partial<Omit<SpanRecord, 'spanId' | 'traceId'>>;\n }): Promise<void> {\n return this.stores.observability!.updateSpan(params);\n }\n\n async getTrace(traceId: string): Promise<TraceRecord | null> {\n return this.stores.observability!.getTrace(traceId);\n }\n\n async getTracesPaginated(args: TracesPaginatedArg): Promise<{ pagination: PaginationInfo; spans: SpanRecord[] }> {\n return this.stores.observability!.getTracesPaginated(args);\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 async batchCreateSpans(args: { records: SpanRecord[] }): Promise<void> {\n return this.stores.observability!.batchCreateSpans(args);\n }\n\n async batchUpdateSpans(args: {\n records: { traceId: string; spanId: string; updates: Partial<Omit<SpanRecord, 'spanId' | 'traceId'>> }[];\n }): Promise<void> {\n return this.stores.observability!.batchUpdateSpans(args);\n }\n}\n\nexport { LibSQLStore as DefaultStorage };\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for LibSQL Vector.\n */\nexport const LIBSQL_PROMPT = `When querying LibSQL Vector, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n- $all: Match all values in array\n Example: { \"tags\": { \"$all\": [\"premium\", \"sale\"] } }\n- $elemMatch: Match array elements that meet all specified conditions\n Example: { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 100 } } } }\n- $contains: Check if array contains value\n Example: { \"tags\": { \"$contains\": \"premium\" } }\n\nLogical Operators:\n- $and: Logical AND (implicit when using multiple conditions)\n Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n- $nor: Logical NOR\n Example: { \"$nor\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nSpecial Operators:\n- $size: Array length check\n Example: { \"tags\": { \"$size\": 2 } }\n\nRestrictions:\n- Regex patterns are not supported\n- Direct RegExp patterns will throw an error\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- Array operations work on array fields only\n- Basic operators handle array values as JSON strings\n- Empty arrays in conditions are handled gracefully\n- Only logical operators ($and, $or, $not, $nor) can be used at the top level\n- All other operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n Invalid: { \"$contains\": \"value\" }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- $not operator:\n - Must be an object\n - Cannot be empty\n - Can be used at field level or top level\n - Valid: { \"$not\": { \"field\": \"value\" } }\n - Valid: { \"field\": { \"$not\": { \"$eq\": \"value\" } } }\n- Other logical operators ($and, $or, $nor):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- $elemMatch requires an object with conditions\n Valid: { \"array\": { \"$elemMatch\": { \"field\": \"value\" } } }\n Invalid: { \"array\": { \"$elemMatch\": \"value\" } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"tags\": { \"$all\": [\"premium\", \"sale\"] } },\n { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 50 }, \"inStock\": true } } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]}\n ]\n}`;\n"]}