@mastra/libsql 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-memory-memory-class.md +1 -1
- package/dist/index.cjs +518 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +519 -22
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/mcp-servers/index.d.ts +26 -0
- package/dist/storage/domains/mcp-servers/index.d.ts.map +1 -0
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/package.json +8 -8
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vector/filter.ts","../src/vector/sql-builder.ts","../src/vector/index.ts","../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/domains/workspaces/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","result","parseFieldKey","conditions","operator","operatorValue","MastraVector","createClient","validateTopK","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory","parseSqlIdentifier","error","validateUpsertInput","TABLE_SCHEMAS","buildCondition","safelyParseJSON","MastraBase","createStorageErrorId","getSqlType","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","AgentsStorage","TABLE_AGENTS","AGENTS_SCHEMA","TABLE_AGENT_VERSIONS","AGENT_VERSIONS_SCHEMA","normalizePerPage","calculatePagination","BlobStore","TABLE_SKILL_BLOBS","SKILL_BLOBS_SCHEMA","DatasetsStorage","TABLE_DATASETS","DATASETS_SCHEMA","TABLE_DATASET_ITEMS","DATASET_ITEMS_SCHEMA","TABLE_DATASET_VERSIONS","DATASET_VERSIONS_SCHEMA","ensureDate","TABLE_EXPERIMENT_RESULTS","TABLE_EXPERIMENTS","queryParams","whereClause","countResult","total","perPage","start","perPageForResponse","limitValue","end","ExperimentsStorage","EXPERIMENTS_SCHEMA","EXPERIMENT_RESULTS_SCHEMA","MCPClientsStorage","TABLE_MCP_CLIENTS","MCP_CLIENTS_SCHEMA","TABLE_MCP_CLIENT_VERSIONS","MCP_CLIENT_VERSIONS_SCHEMA","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MessageList","randomUUID","ObservabilityStorage","SPAN_SCHEMA","listTracesArgsSchema","TraceStatus","toTraceSpans","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","PROMPT_BLOCKS_SCHEMA","TABLE_PROMPT_BLOCK_VERSIONS","PROMPT_BLOCK_VERSIONS_SCHEMA","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","SCORER_DEFINITIONS_SCHEMA","TABLE_SCORER_DEFINITION_VERSIONS","SCORER_DEFINITION_VERSIONS_SCHEMA","ScoresStorage","TABLE_SCORERS","SCORERS_SCHEMA","coreTransformScoreRow","saveScorePayloadSchema","SkillsStorage","TABLE_SKILLS","SKILLS_SCHEMA","TABLE_SKILL_VERSIONS","SKILL_VERSIONS_SCHEMA","WorkflowsStorage","SNAPSHOT_FIELDS","WorkspacesStorage","TABLE_WORKSPACES","WORKSPACES_SCHEMA","TABLE_WORKSPACE_VERSIONS","WORKSPACE_VERSIONS_SCHEMA","MastraCompositeStore"],"mappings":"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","file":"index.cjs","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, value: boolean) => {\n const jsonPath = getJsonPath(key);\n return {\n sql:\n value === false\n ? `json_extract(metadata, ${jsonPath}) IS NULL`\n : `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, validateUpsertInput, validateTopK } 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 /**\n * The URL of the LibSQL database.\n * Examples: 'file:./dev.db', 'file::memory:', 'libsql://your-db.turso.io'\n */\n url: 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 url,\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,\n syncUrl,\n authToken,\n syncInterval,\n });\n this.maxRetries = maxRetries;\n this.initialBackoffMs = initialBackoffMs;\n\n if (url.includes(`file:`) || url.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.code === 'SQLITE_LOCKED' ||\n error.code === 'SQLITE_LOCKED_SHAREDCACHE' ||\n (error.message && error.message.toLowerCase().includes('database is locked')) ||\n (error.message && error.message.toLowerCase().includes('database table 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 // Validate topK parameter - throws MastraError directly\n validateTopK('LIBSQL', topK);\n\n if (!Array.isArray(queryVector) || !queryVector.every(x => typeof x === 'number' && Number.isFinite(x))) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'QUERY', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { message: 'queryVector must be an array of finite numbers' },\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 // Validate input parameters\n validateUpsertInput('LIBSQL', vectors, metadata, ids);\n\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 { InValue } from '@libsql/client';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { safelyParseJSON, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\n/**\n * Builds a SQL column list for SELECT statements, wrapping JSONB columns with json()\n * to convert binary JSONB to TEXT.\n *\n * The json() function handles both:\n * - Binary JSONB data (converts to TEXT)\n * - Legacy TEXT JSON data (returns as-is)\n *\n * Note: json_valid() was considered for guarding against malformed legacy TEXT,\n * but it doesn't work correctly with binary JSONB data (returns false for valid JSONB blobs).\n *\n * @param tableName - The table name to get the schema for\n * @returns A comma-separated column list with json() wrappers for JSONB columns\n */\nexport function buildSelectColumns(tableName: TABLE_NAMES): string {\n const schema = TABLE_SCHEMAS[tableName];\n return Object.keys(schema)\n .map(col => {\n const colDef = schema[col];\n const parsedCol = parseSqlIdentifier(col, 'column name');\n // Quote all column names to handle SQL reserved words (e.g. \"references\")\n return colDef?.type === 'jsonb' ? `json(\"${parsedCol}\") as \"${parsedCol}\"` : `\"${parsedCol}\"`;\n })\n .join(', ');\n}\n\n/**\n * Checks if an error is a SQLite lock/busy error that should be retried\n */\nexport function isLockError(error: any): boolean {\n return (\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}\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 attempts = 0;\n let backoff = initialBackoffMs;\n\n while (attempts < maxRetries) {\n try {\n return await operationFn();\n } catch (error: any) {\n logger.debug(`LibSQLStore: Error caught in retry loop for ${operationDescription}`, {\n errorType: error.constructor.name,\n errorCode: error.code,\n errorMessage: error.message,\n attempts,\n maxRetries,\n });\n\n if (isLockError(error)) {\n attempts++;\n if (attempts >= maxRetries) {\n logger.error(\n `LibSQLStore: Operation failed after ${maxRetries} attempts due to database lock: ${error.message}`,\n { error, attempts, maxRetries },\n );\n throw error;\n }\n logger.warn(\n `LibSQLStore: Attempt ${attempts} failed due to database lock during ${operationDescription}. Retrying in ${backoff}ms...`,\n { errorMessage: error.message, attempts, backoff, maxRetries },\n );\n await new Promise(resolve => setTimeout(resolve, backoff));\n backoff *= 2;\n } else {\n logger.error(`LibSQLStore: Non-lock error during ${operationDescription}, not retrying`, { error });\n throw error;\n }\n }\n }\n // TypeScript requires a return/throw here for type safety, but this is unreachable\n // because the loop always exits via return (success) or throw (error)\n throw new Error(`LibSQLStore: Unexpected exit from retry loop for ${operationDescription}`);\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 schema = TABLE_SCHEMAS[tableName];\n const columnNames = Object.keys(record);\n const columns = columnNames.map(col => parseSqlIdentifier(col, 'column name'));\n const values = columnNames.map(col => {\n const v = record[col];\n if (typeof v === `undefined` || v === null) {\n // returning an undefined value will cause libsql to throw\n return null;\n }\n // For jsonb columns, always JSON.stringify (even primitives need to be valid JSON)\n // Must check jsonb BEFORE Date, because JSON.stringify properly serializes Dates\n const colDef = schema[col];\n if (colDef?.type === 'jsonb') {\n return JSON.stringify(v);\n }\n if (v instanceof Date) {\n return v.toISOString();\n }\n return typeof v === 'object' ? JSON.stringify(v) : v;\n });\n const placeholders = columnNames\n .map(col => {\n const colDef = schema[col];\n return colDef?.type === 'jsonb' ? 'jsonb(?)' : '?';\n })\n .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 updateColumnNames = Object.keys(updates);\n const updateColumns = updateColumnNames.map(col => parseSqlIdentifier(col, 'column name'));\n const updateValues = updateColumnNames.map(col => {\n const colDef = schema[col];\n const v = updates[col];\n // For jsonb columns, always JSON.stringify (even primitives need to be valid JSON)\n if (colDef?.type === 'jsonb') {\n return transformToSqlValue(v, true);\n }\n return transformToSqlValue(v, false);\n });\n const setClause = updateColumns\n .map((col, i) => {\n const colDef = schema[updateColumnNames[i]!];\n return colDef?.type === 'jsonb' ? `${col} = jsonb(?)` : `${col} = ?`;\n })\n .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, forceJsonStringify: boolean = false): InValue {\n if (typeof value === 'undefined' || value === null) {\n return null;\n }\n // For jsonb columns, always JSON.stringify (even primitives need to be valid JSON)\n // Must check jsonb BEFORE Date, because JSON.stringify properly serializes Dates\n if (forceJsonStringify) {\n return JSON.stringify(value);\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\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 { createClient } from '@libsql/client';\nimport type { Client, InValue } from '@libsql/client';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n getSqlType,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n buildSelectColumns,\n createExecuteWriteOperationWithRetry,\n prepareDeleteStatement,\n prepareStatement,\n prepareUpdateStatement,\n} from './utils';\n\n/**\n * Base configuration options shared across LibSQL domain configurations\n */\nexport type LibSQLDomainBaseConfig = {\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/**\n * Configuration for LibSQL domains - accepts either credentials or an existing client\n */\nexport type LibSQLDomainConfig =\n | (LibSQLDomainBaseConfig & {\n /** The database connection URL (e.g., \"file:local.db\", \"libsql://...\", \"file::memory:\") */\n url: string;\n /** Optional authentication token for remote databases */\n authToken?: string;\n })\n | (LibSQLDomainBaseConfig & {\n /** An existing LibSQL client instance */\n client: Client;\n });\n\n/**\n * Resolves a LibSQLDomainConfig to a Client instance.\n * Creates a new client if credentials are provided, or returns the existing client.\n *\n * @param config - The domain configuration\n * @returns The resolved LibSQL client\n */\nexport function resolveClient(config: LibSQLDomainConfig): Client {\n if ('client' in config) {\n return config.client;\n }\n return createClient({\n url: config.url,\n ...(config.authToken ? { authToken: config.authToken } : {}),\n });\n}\n\nexport class LibSQLDB extends MastraBase {\n private client: Client;\n maxRetries: number;\n initialBackoffMs: number;\n executeWriteOperationWithRetry: <T>(operationFn: () => Promise<T>, operationDescription: string) => Promise<T>;\n\n constructor({\n client,\n maxRetries,\n initialBackoffMs,\n }: {\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n }) {\n super({\n component: 'STORAGE',\n name: 'LIBSQL_DB_LAYER',\n });\n\n this.client = client;\n this.maxRetries = maxRetries ?? 5;\n this.initialBackoffMs = initialBackoffMs ?? 100;\n\n this.executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n }\n\n /**\n * Checks if a column exists in the specified table.\n *\n * @param table - The name of the table to check\n * @param column - The name of the column to look for\n * @returns `true` if the column exists in the table, `false` otherwise\n */\n async hasColumn(table: string, column: string): Promise<boolean> {\n const sanitizedTable = parseSqlIdentifier(table, 'table name');\n const result = await this.client.execute({\n sql: `PRAGMA table_info(\"${sanitizedTable}\")`,\n });\n return result.rows?.some((row: any) => row.name === column);\n }\n\n /**\n * Internal insert implementation without retry logic.\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 /**\n * Inserts or replaces a record in the specified table with automatic retry on lock errors.\n *\n * @param args - The insert arguments\n * @param args.tableName - The name of the table to insert into\n * @param args.record - The record to insert (key-value pairs)\n */\n public insert(args: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doInsert(args), `insert into table ${args.tableName}`);\n }\n\n /**\n * Internal update implementation without retry logic.\n */\n private async doUpdate({\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 /**\n * Updates a record in the specified table with automatic retry on lock errors.\n *\n * @param args - The update arguments\n * @param args.tableName - The name of the table to update\n * @param args.keys - The key(s) identifying the record to update\n * @param args.data - The fields to update (key-value pairs)\n */\n public update(args: { tableName: TABLE_NAMES; keys: Record<string, any>; data: Record<string, any> }): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doUpdate(args), `update table ${args.tableName}`);\n }\n\n /**\n * Internal batch insert implementation without retry logic.\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 /**\n * Inserts multiple records in a single batch transaction with automatic retry on lock errors.\n *\n * @param args - The batch insert arguments\n * @param args.tableName - The name of the table to insert into\n * @param args.records - Array of records to insert\n * @throws {MastraError} When the batch insert fails after retries\n */\n public async batchInsert(args: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.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 * Internal batch update implementation without retry logic.\n * Each record can be updated based on single or composite keys.\n */\n private async doBatchUpdate({\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 * Updates multiple records in a single batch transaction with automatic retry on lock errors.\n * Each record can be updated based on single or composite keys.\n *\n * @param args - The batch update arguments\n * @param args.tableName - The name of the table to update\n * @param args.updates - Array of update operations, each containing keys and data\n * @throws {MastraError} When the batch update fails after retries\n */\n public async batchUpdate(args: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n return this.executeWriteOperationWithRetry(\n () => this.doBatchUpdate(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 * Internal batch delete implementation without retry logic.\n * Each record can be deleted based on single or composite keys.\n */\n private async doBatchDelete({\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 * Deletes multiple records in a single batch transaction with automatic retry on lock errors.\n * Each record can be deleted based on single or composite keys.\n *\n * @param args - The batch delete arguments\n * @param args.tableName - The name of the table to delete from\n * @param args.keys - Array of key objects identifying records to delete\n * @throws {MastraError} When the batch delete fails after retries\n */\n public async batchDelete({\n tableName,\n keys,\n }: {\n tableName: TABLE_NAMES;\n keys: Array<Record<string, any>>;\n }): Promise<void> {\n return this.executeWriteOperationWithRetry(\n () => this.doBatchDelete({ 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 * Internal single-record delete implementation without retry logic.\n */\n private async doDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<void> {\n await this.client.execute(prepareDeleteStatement({ tableName, keys }));\n }\n\n /**\n * Deletes a single record from the specified table with automatic retry on lock errors.\n *\n * @param args - The delete arguments\n * @param args.tableName - The name of the table to delete from\n * @param args.keys - The key(s) identifying the record to delete\n * @throws {MastraError} When the delete fails after retries\n */\n public async delete(args: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doDelete(args), `delete from table ${args.tableName}`).catch(\n error => {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE', '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 /**\n * Selects a single record from the specified table by key(s).\n * Returns the most recently created record if multiple matches exist.\n * Automatically parses JSON string values back to objects/arrays.\n *\n * @typeParam R - The expected return type of the record\n * @param args - The select arguments\n * @param args.tableName - The name of the table to select from\n * @param args.keys - The key(s) identifying the record to select\n * @returns The matching record or `null` if not found\n */\n async select<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const columns = buildSelectColumns(tableName);\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 ${columns} 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 /**\n * Selects multiple records from the specified table with optional filtering, ordering, and pagination.\n *\n * @typeParam R - The expected return type of each record\n * @param args - The select arguments\n * @param args.tableName - The name of the table to select from\n * @param args.whereClause - Optional WHERE clause with SQL string and arguments\n * @param args.orderBy - Optional ORDER BY clause (e.g., \"createdAt DESC\")\n * @param args.offset - Optional offset for pagination\n * @param args.limit - Optional limit for pagination\n * @param args.args - Optional additional query arguments\n * @returns Array of matching records\n */\n async selectMany<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 const columns = buildSelectColumns(tableName);\n\n let statement = `SELECT ${columns} 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 // Parse JSON columns (same as select())\n return (result.rows ?? []).map(row => {\n return 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 }) as R[];\n }\n\n /**\n * Returns the total count of records matching the optional WHERE clause.\n *\n * @param args - The count arguments\n * @param args.tableName - The name of the table to count from\n * @param args.whereClause - Optional WHERE clause with SQL string and arguments\n * @returns The total count of matching records\n */\n async selectTotalCount({\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 /**\n * Maps a storage column type to its SQLite equivalent.\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 'timestamp':\n return 'TEXT'; // Store timestamps as ISO strings in SQLite\n case 'float':\n return 'REAL'; // SQLite's floating point type\n case 'boolean':\n return 'INTEGER'; // SQLite uses 0/1 for booleans\n case 'jsonb':\n return 'TEXT'; // SQLite: column stores TEXT, we use jsonb()/json() functions for binary optimization\n default:\n return getSqlType(type); // text, integer, uuid all map correctly\n }\n }\n\n /**\n * Creates a table if it doesn't exist based on the provided schema.\n *\n * @param args - The create table arguments\n * @param args.tableName - The name of the table to create\n * @param args.schema - The schema definition for the table columns\n */\n async createTable({\n tableName,\n schema,\n compositePrimaryKey,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n compositePrimaryKey?: string[];\n }): Promise<void> {\n try {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n // Validate composite PK columns exist in schema\n if (compositePrimaryKey) {\n for (const col of compositePrimaryKey) {\n if (!(col in schema)) {\n throw new Error(`compositePrimaryKey column \"${col}\" does not exist in schema for table \"${tableName}\"`);\n }\n }\n }\n\n const compositePKSet = compositePrimaryKey ? new Set(compositePrimaryKey) : null;\n\n // Build column definitions\n const columnDefinitions = Object.entries(schema).map(([colName, colDef]) => {\n const type = this.getSqlType(colDef.type);\n const nullable = colDef.nullable === false ? 'NOT NULL' : '';\n // Skip per-column PRIMARY KEY if column is part of composite PK\n const primaryKey = colDef.primaryKey && !compositePKSet?.has(colName) ? 'PRIMARY KEY' : '';\n return `\"${colName}\" ${type} ${nullable} ${primaryKey}`.trim();\n });\n\n // Add table-level constraints\n const tableConstraints: string[] = [];\n\n if (compositePrimaryKey) {\n const pkCols = compositePrimaryKey.map(c => `\"${c}\"`).join(', ');\n tableConstraints.push(`PRIMARY KEY (${pkCols})`);\n }\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n tableConstraints.push('UNIQUE (workflow_name, run_id)');\n }\n if (tableName === TABLE_SPANS) {\n tableConstraints.push('UNIQUE (spanId, traceId)');\n }\n\n const allDefinitions = [...columnDefinitions, ...tableConstraints].join(',\\n ');\n\n const sql = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (\\n ${allDefinitions}\\n)`;\n\n await this.client.execute(sql);\n this.logger.debug(`LibSQLDB: Created table ${tableName}`);\n\n // Run migrations for Spans table to add any new columns\n if (tableName === TABLE_SPANS) {\n await this.migrateSpansTable();\n }\n } catch (error) {\n // Rethrow MastraError (especially for migration required errors) - these must stop init\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Migrates the spans table schema from OLD_SPAN_SCHEMA to current SPAN_SCHEMA.\n * This adds new columns that don't exist in old schema and ensures required indexes exist.\n */\n private async migrateSpansTable(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_SPANS];\n\n try {\n // Add any columns from current schema that don't exist in the database\n for (const [columnName, columnDef] of Object.entries(schema)) {\n const columnExists = await this.hasColumn(TABLE_SPANS, columnName);\n if (!columnExists) {\n const sqlType = this.getSqlType(columnDef.type);\n // For new columns, use nullable (no default needed) since existing rows will have NULL\n const alterSql = `ALTER TABLE \"${TABLE_SPANS}\" ADD COLUMN \"${columnName}\" ${sqlType}`;\n await this.client.execute(alterSql);\n this.logger.debug(`LibSQLDB: Added column '${columnName}' to ${TABLE_SPANS}`);\n }\n }\n\n // Check if unique index already exists - if so, skip migration\n // This avoids running expensive queries on every init after migration is complete\n const indexExists = await this.spansUniqueIndexExists();\n if (!indexExists) {\n // Check for duplicates before attempting to create unique index\n const duplicateInfo = await this.checkForDuplicateSpans();\n if (duplicateInfo.hasDuplicates) {\n // Duplicates exist - throw error requiring manual migration\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: Duplicate spans detected in ${TABLE_SPANS}\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations.\\n` +\n `\\n` +\n `The spans table requires a unique constraint on (traceId, spanId), but your\\n` +\n `database contains duplicate entries that must be resolved first.\\n` +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Remove duplicate spans (keeping the most complete/recent version)\\n` +\n ` 2. Add the required unique constraint\\n` +\n `\\n` +\n `Note: This migration may take some time for large tables.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'MIGRATION_REQUIRED', 'DUPLICATE_SPANS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n } else {\n // No duplicates - safe to create unique index directly\n await this.client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS \"mastra_ai_spans_spanid_traceid_idx\" ON \"${TABLE_SPANS}\" (\"spanId\", \"traceId\")`,\n );\n this.logger.debug(`LibSQLDB: Created unique index on (spanId, traceId) for ${TABLE_SPANS}`);\n }\n }\n\n this.logger.info(`LibSQLDB: Migration completed for ${TABLE_SPANS}`);\n } catch (error) {\n // Rethrow MastraError (especially for migration required errors) - these must stop init\n if (error instanceof MastraError) {\n throw error;\n }\n // Log warning but don't fail for other errors - schema migrations should be best-effort\n this.logger.warn(`LibSQLDB: Failed to migrate spans table ${TABLE_SPANS}:`, error);\n }\n }\n\n /**\n * Checks if the unique index on (spanId, traceId) already exists on the spans table.\n * Used to skip deduplication when the index already exists (migration already complete).\n */\n private async spansUniqueIndexExists(): Promise<boolean> {\n try {\n const result = await this.client.execute(\n `SELECT 1 FROM sqlite_master WHERE type = 'index' AND name = 'mastra_ai_spans_spanid_traceid_idx'`,\n );\n return (result.rows?.length ?? 0) > 0;\n } catch {\n // If we can't check indexes (e.g., table doesn't exist), assume index doesn't exist\n return false;\n }\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n private async checkForDuplicateSpans(): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n }> {\n try {\n const result = await this.client.execute(`\n SELECT COUNT(*) as duplicate_count FROM (\n SELECT \"spanId\", \"traceId\"\n FROM \"${TABLE_SPANS}\"\n GROUP BY \"spanId\", \"traceId\"\n HAVING COUNT(*) > 1\n )\n `);\n\n const duplicateCount = Number(result.rows?.[0]?.duplicate_count ?? 0);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger.debug(`LibSQLDB: Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0 };\n }\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n // Check if already migrated\n const indexExists = await this.spansUniqueIndexExists();\n if (indexExists) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. Unique index exists on ${TABLE_SPANS}.`,\n };\n }\n\n // Check for duplicates\n const duplicateInfo = await this.checkForDuplicateSpans();\n\n if (duplicateInfo.hasDuplicates) {\n this.logger.info(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting deduplication...`,\n );\n\n // Run deduplication\n await this.deduplicateSpans();\n } else {\n this.logger.info(`No duplicate spans found.`);\n }\n\n // Add unique index\n await this.client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS \"mastra_ai_spans_spanid_traceid_idx\" ON \"${TABLE_SPANS}\" (\"spanId\", \"traceId\")`,\n );\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and added unique index to ${TABLE_SPANS}.`\n : `Migration complete. Added unique index to ${TABLE_SPANS}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const indexExists = await this.spansUniqueIndexExists();\n\n if (indexExists) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: TABLE_SPANS,\n };\n }\n\n const duplicateInfo = await this.checkForDuplicateSpans();\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: TABLE_SPANS,\n };\n }\n\n /**\n * Deduplicates spans table by removing duplicate (spanId, traceId) combinations.\n * Keeps the \"best\" record for each duplicate group based on:\n * 1. Completed spans (endedAt IS NOT NULL) over incomplete ones\n * 2. Most recently updated (updatedAt DESC)\n * 3. Most recently created (createdAt DESC) as tiebreaker\n */\n private async deduplicateSpans(): Promise<void> {\n try {\n // Check if there are any duplicates first\n const duplicateCheck = await this.client.execute(`\n SELECT COUNT(*) as duplicate_count FROM (\n SELECT \"spanId\", \"traceId\"\n FROM \"${TABLE_SPANS}\"\n GROUP BY \"spanId\", \"traceId\"\n HAVING COUNT(*) > 1\n )\n `);\n\n const duplicateCount = Number(duplicateCheck.rows?.[0]?.duplicate_count ?? 0);\n if (duplicateCount === 0) {\n this.logger.debug(`LibSQLDB: No duplicate spans found, skipping deduplication`);\n return;\n }\n\n this.logger.warn(`LibSQLDB: Found ${duplicateCount} duplicate (spanId, traceId) combinations, deduplicating...`);\n\n // Delete duplicate spans, keeping the \"best\" record for each (spanId, traceId) pair.\n // Priority: completed spans > most recently updated > most recently created\n // Uses rowid for SQLite's internal row identifier to delete specific rows\n const deleteResult = await this.client.execute(`\n DELETE FROM \"${TABLE_SPANS}\"\n WHERE rowid NOT IN (\n SELECT MIN(best_rowid) FROM (\n SELECT\n rowid as best_rowid,\n \"spanId\",\n \"traceId\",\n ROW_NUMBER() OVER (\n PARTITION BY \"spanId\", \"traceId\"\n ORDER BY\n CASE WHEN \"endedAt\" IS NOT NULL THEN 0 ELSE 1 END,\n \"updatedAt\" DESC,\n \"createdAt\" DESC\n ) as rn\n FROM \"${TABLE_SPANS}\"\n ) ranked\n WHERE rn = 1\n GROUP BY \"spanId\", \"traceId\"\n )\n AND (\"spanId\", \"traceId\") IN (\n SELECT \"spanId\", \"traceId\"\n FROM \"${TABLE_SPANS}\"\n GROUP BY \"spanId\", \"traceId\"\n HAVING COUNT(*) > 1\n )\n `);\n\n const deletedCount = deleteResult.rowsAffected ?? 0;\n this.logger.warn(`LibSQLDB: Deleted ${deletedCount} duplicate span records`);\n } catch (error) {\n // Log but continue - deduplication should be best-effort\n this.logger.warn(`LibSQLDB: Failed to deduplicate spans:`, error);\n }\n }\n\n /**\n * Gets a default value for a column type (used when adding NOT NULL columns).\n */\n private getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n return \"DEFAULT ''\";\n case 'integer':\n case 'bigint':\n case 'float':\n return 'DEFAULT 0';\n case 'boolean':\n return 'DEFAULT 0';\n case 'jsonb':\n return \"DEFAULT '{}'\";\n case 'timestamp':\n return 'DEFAULT CURRENT_TIMESTAMP';\n default:\n return \"DEFAULT ''\";\n }\n }\n\n /**\n * Alters an existing table to add missing columns.\n * Used for schema migrations when new columns are added.\n *\n * @param args - The alter table arguments\n * @param args.tableName - The name of the table to alter\n * @param args.schema - The full schema definition for the table\n * @param args.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 // Get existing columns\n const tableInfo = await this.client.execute({\n sql: `PRAGMA table_info(\"${parsedTableName}\")`,\n });\n const existingColumns = new Set((tableInfo.rows || []).map((row: any) => row.name?.toLowerCase()));\n\n // Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumns.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n const sqlType = this.getSqlType(columnDef.type);\n // SQLite requires constant defaults for ALTER TABLE ADD COLUMN.\n // Nullable columns use DEFAULT NULL; non-nullable use the type's default.\n const defaultValue = columnDef.nullable ? 'DEFAULT NULL' : this.getDefaultValue(columnDef.type);\n\n // SQLite doesn't support ADD COLUMN IF NOT EXISTS, but we checked above\n const alterSql = `ALTER TABLE ${parsedTableName} ADD COLUMN \"${columnName}\" ${sqlType} ${defaultValue}`;\n await this.client.execute(alterSql);\n this.logger.debug(`LibSQLDB: Added column ${columnName} to table ${tableName}`);\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: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes all records from the specified table.\n * Errors are logged but not thrown.\n *\n * @param args - The delete arguments\n * @param args.tableName - The name of the table to clear\n */\n async deleteData({ 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","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n AGENTS_SCHEMA,\n AGENT_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageAgentType,\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n AgentVersion,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class AgentsLibSQL extends AgentsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n // Migrate from legacy schemas before creating tables\n await this.#migrateFromLegacySchema();\n await this.#migrateVersionsSchema();\n\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n // Add new columns for backwards compatibility with intermediate schema versions\n await this.#db.alterTable({\n tableName: TABLE_AGENTS,\n schema: AGENTS_SCHEMA,\n ifNotExists: ['status', 'authorId'],\n });\n await this.#db.alterTable({\n tableName: TABLE_AGENT_VERSIONS,\n schema: AGENT_VERSIONS_SCHEMA,\n ifNotExists: ['mcpClients', 'requestContextSchema', 'workspace', 'skills', 'skillsFormat'],\n });\n\n // Migrate tools field from string[] to JSONB format\n await this.#migrateToolsToJsonbFormat();\n\n // Clean up any stale draft records from previously failed createAgent calls\n await this.#cleanupStaleDrafts();\n }\n\n /**\n * Migrates from the legacy flat agent schema (where config fields like name, instructions, model\n * were stored directly on mastra_agents) to the new versioned schema (thin agent record + versions table).\n * SQLite cannot drop columns or alter NOT NULL constraints, so we must recreate the table.\n */\n async #migrateFromLegacySchema(): Promise<void> {\n const legacyTable = `${TABLE_AGENTS}_legacy`;\n const hasLegacyColumns = await this.#db.hasColumn(TABLE_AGENTS, 'name');\n\n if (hasLegacyColumns) {\n // Current table has legacy schema — rename it and drop old versions table\n await this.#client.execute({\n sql: `ALTER TABLE \"${TABLE_AGENTS}\" RENAME TO \"${legacyTable}\"`,\n });\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${TABLE_AGENT_VERSIONS}\"`,\n });\n }\n\n // Check if legacy table exists (either just renamed, or left behind by a previous partial migration)\n const legacyExists = await this.#db.hasColumn(legacyTable, 'name');\n if (!legacyExists) return;\n\n // Read all existing agents from the legacy table\n const result = await this.#client.execute({\n sql: `SELECT * FROM \"${legacyTable}\"`,\n });\n const oldAgents = result.rows || [];\n\n // Create new tables (CREATE TABLE IF NOT EXISTS handles idempotency on resume)\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n\n // INSERT OR REPLACE (used by #db.insert) is safe for resumed partial migrations\n for (const row of oldAgents) {\n const agentId = row.id as string;\n if (!agentId) continue;\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n\n await this.#db.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agentId,\n status: 'published',\n activeVersionId: versionId,\n authorId: (row.ownerId as string) ?? (row.authorId as string) ?? null,\n metadata: row.metadata ?? null,\n createdAt: row.createdAt ?? now,\n updatedAt: row.updatedAt ?? now,\n },\n });\n\n await this.#db.insert({\n tableName: TABLE_AGENT_VERSIONS,\n record: {\n id: versionId,\n agentId,\n versionNumber: 1,\n name: (row.name as string) ?? agentId,\n description: row.description ?? null,\n instructions: this.serializeInstructions((row.instructions as string) ?? ''),\n model: row.model ?? '{}',\n tools: row.tools ?? null,\n defaultOptions: row.defaultOptions ?? null,\n workflows: row.workflows ?? null,\n agents: row.agents ?? null,\n integrationTools: row.integrationTools ?? null,\n inputProcessors: row.inputProcessors ?? null,\n outputProcessors: row.outputProcessors ?? null,\n memory: row.memory ?? null,\n scorers: row.scorers ?? null,\n changedFields: null,\n changeMessage: 'Migrated from legacy schema',\n createdAt: row.createdAt ?? now,\n },\n });\n }\n\n // Drop legacy table only after all inserts succeed\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${legacyTable}\"`,\n });\n }\n\n /**\n * Migrates the agent_versions table from the old snapshot-based schema (single `snapshot` JSON column)\n * to the new flat schema (individual config columns). This handles the case where the agents table\n * was already migrated but the versions table still has the old schema.\n */\n async #migrateVersionsSchema(): Promise<void> {\n const hasSnapshotColumn = await this.#db.hasColumn(TABLE_AGENT_VERSIONS, 'snapshot');\n if (!hasSnapshotColumn) return;\n\n // Drop the old versions table - the new schema will be created by init()\n // Any existing version data in snapshot format is not preserved since\n // the snapshot schema predates the stable versioning system\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${TABLE_AGENT_VERSIONS}\"`,\n });\n\n // Also clean up any lingering legacy table from a partial migration\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${TABLE_AGENTS}_legacy\"`,\n });\n }\n\n /**\n * Removes stale draft agent records that have no activeVersionId.\n * These are left behind when createAgent partially fails (inserts thin record\n * but fails to create the version due to schema mismatch).\n */\n async #cleanupStaleDrafts(): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_AGENTS}\" WHERE status = 'draft' AND activeVersionId IS NULL`,\n });\n } catch {\n // Non-critical cleanup, ignore errors\n }\n }\n\n /**\n * Migrates the tools field from string[] format to JSONB format { \"tool-key\": { \"description\": \"...\" } }.\n * This handles the transition from the old format where tools were stored as an array of string keys\n * to the new format where tools can have per-agent description overrides.\n */\n async #migrateToolsToJsonbFormat(): Promise<void> {\n try {\n // Check if any records have tools stored as a JSON array\n const result = await this.#client.execute({\n sql: `SELECT id, tools FROM \"${TABLE_AGENT_VERSIONS}\" WHERE tools IS NOT NULL`,\n });\n\n if (!result.rows || result.rows.length === 0) {\n return; // No records to migrate\n }\n\n for (const row of result.rows) {\n const toolsValue = row.tools;\n\n // Parse the JSON value\n let parsedTools: any;\n try {\n if (typeof toolsValue === 'string') {\n parsedTools = JSON.parse(toolsValue);\n } else if (toolsValue instanceof ArrayBuffer) {\n const decoder = new TextDecoder();\n parsedTools = JSON.parse(decoder.decode(toolsValue));\n } else {\n parsedTools = toolsValue;\n }\n } catch {\n continue; // Skip invalid JSON\n }\n\n // Check if tools is an array (needs migration)\n if (Array.isArray(parsedTools)) {\n const toolsObject: Record<string, { description?: string }> = {};\n\n // Convert each tool string to an object key with empty config\n for (const toolKey of parsedTools) {\n if (typeof toolKey === 'string') {\n toolsObject[toolKey] = {};\n }\n }\n\n // Update the record with the new format\n await this.#client.execute({\n sql: `UPDATE \"${TABLE_AGENT_VERSIONS}\" SET tools = ? WHERE id = ?`,\n args: [JSON.stringify(toolsObject), row.id as string],\n });\n }\n }\n\n this.logger?.info?.(`Migrated agent version tools from array to object format`);\n } catch (error) {\n // Log but don't fail - this is a non-breaking migration\n this.logger?.warn?.('Failed to migrate tools to JSONB format:', error);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_AGENT_VERSIONS });\n await this.#db.deleteData({ tableName: TABLE_AGENTS });\n }\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n\n // Handle ArrayBuffer case (binary JSONB data from LibSQL)\n if (value instanceof ArrayBuffer || (value && value.constructor && value.constructor.name === 'ArrayBuffer')) {\n try {\n const decoder = new TextDecoder();\n const jsonString = decoder.decode(value);\n return JSON.parse(jsonString);\n } catch (error) {\n console.error(`Failed to parse ArrayBuffer for ${fieldName}:`, error);\n return undefined;\n }\n }\n\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseRow(row: any): StorageAgentType {\n return {\n id: row.id as string,\n status: row.status as 'draft' | 'published' | 'archived',\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const result = await this.#db.select<Record<string, any>>({\n tableName: TABLE_AGENTS,\n keys: { id },\n });\n\n return result ? this.parseRow(result) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_AGENT_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n const { agent } = input;\n try {\n const now = new Date();\n\n // 1. Create thin agent record with status='draft'\n await this.#db.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agent.id,\n status: 'draft',\n activeVersionId: null,\n authorId: agent.authorId ?? null,\n metadata: agent.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n });\n\n // 2. Extract config fields from the flat input\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n // Create version 1 from the config\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n agentId: agent.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n // 3. Return the thin agent record (activeVersionId remains null, status remains 'draft')\n const created = await this.getById(agent.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'CREATE_AGENT', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${agent.id} not found after creation`,\n details: { agentId: agent.id },\n });\n }\n\n return created;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: agent.id },\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_AGENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Agent ${id} not found`,\n details: { agentId: id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the agent record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_AGENTS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated agent\n const updatedAgent = await this.getById(id);\n if (!updatedAgent) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${id} not found after update`,\n details: { agentId: id },\n });\n }\n\n return updatedAgent;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n // Delete all versions for this agent first\n await this.deleteVersionsByParentId(id);\n\n // Then delete the agent\n await this.#db.delete({\n tableName: TABLE_AGENTS,\n keys: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_AGENTS', '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\n try {\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (status) {\n conditions.push('status = ?');\n queryParams.push(status);\n }\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_AGENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\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_AGENTS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n agents: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_AGENTS)} FROM \"${TABLE_AGENTS}\" ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, offset],\n });\n\n const rows = result.rows ?? [];\n\n const agents = rows.map(row => this.parseRow(row));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_AGENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Agent Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n try {\n const now = new Date();\n\n await this.#db.insert({\n tableName: TABLE_AGENT_VERSIONS,\n record: {\n id: input.id,\n agentId: input.agentId,\n versionNumber: input.versionNumber,\n name: input.name ?? null,\n description: input.description ?? null,\n instructions: this.serializeInstructions(input.instructions),\n model: input.model,\n tools: input.tools ?? null,\n defaultOptions: input.defaultOptions ?? null,\n workflows: input.workflows ?? null,\n agents: input.agents ?? null,\n integrationTools: input.integrationTools ?? null,\n inputProcessors: input.inputProcessors ?? null,\n outputProcessors: input.outputProcessors ?? null,\n memory: input.memory ?? null,\n scorers: input.scorers ?? null,\n mcpClients: input.mcpClients ?? null,\n requestContextSchema: input.requestContextSchema ?? null,\n workspace: input.workspace ?? null,\n skills: input.skills ?? null,\n skillsFormat: input.skillsFormat ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, agentId: input.agentId },\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<AgentVersion | null> {\n try {\n const result = await this.#db.select<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n keys: { id },\n });\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n try {\n const rows = await this.#db.selectMany<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ? AND versionNumber = ?',\n args: [agentId, versionNumber],\n },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return this.parseVersionRow(rows[0]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId, versionNumber },\n },\n error,\n );\n }\n }\n\n async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n try {\n const rows = await this.#db.selectMany<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n orderBy: 'versionNumber DESC',\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return this.parseVersionRow(rows[0]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_VERSIONS', '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, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const total = await this.#db.selectTotalCount({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n });\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const rows = await this.#db.selectMany<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n orderBy: `\"${field}\" ${direction}`,\n limit: limitValue,\n offset,\n });\n\n const versions = rows.map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#db.delete({\n tableName: TABLE_AGENT_VERSIONS,\n keys: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n // Get all version IDs for this agent\n const versions = await this.#db.selectMany<{ id: string }>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [entityId],\n },\n });\n\n // Delete each version individually\n for (const version of versions) {\n await this.#db.delete({\n tableName: TABLE_AGENT_VERSIONS,\n keys: { id: version.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_VERSIONS_BY_AGENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(agentId: string): Promise<number> {\n try {\n const count = await this.#db.selectTotalCount({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n });\n return count;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private serializeInstructions(instructions: string | AgentInstructionBlock[]): string {\n return Array.isArray(instructions) ? JSON.stringify(instructions) : instructions;\n }\n\n private deserializeInstructions(raw: string): string | AgentInstructionBlock[] {\n if (!raw) return raw;\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n } catch {\n // Not JSON — plain string\n }\n return raw;\n }\n\n private parseVersionRow(row: any): AgentVersion {\n return {\n id: row.id as string,\n agentId: row.agentId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n instructions: this.deserializeInstructions(row.instructions as string),\n model: this.parseJson(row.model, 'model'),\n tools: this.parseJson(row.tools, 'tools'),\n defaultOptions: this.parseJson(row.defaultOptions, 'defaultOptions'),\n workflows: this.parseJson(row.workflows, 'workflows'),\n agents: this.parseJson(row.agents, 'agents'),\n integrationTools: this.parseJson(row.integrationTools, 'integrationTools'),\n inputProcessors: this.parseJson(row.inputProcessors, 'inputProcessors'),\n outputProcessors: this.parseJson(row.outputProcessors, 'outputProcessors'),\n memory: this.parseJson(row.memory, 'memory'),\n scorers: this.parseJson(row.scorers, 'scorers'),\n mcpClients: this.parseJson(row.mcpClients, 'mcpClients'),\n requestContextSchema: this.parseJson(row.requestContextSchema, 'requestContextSchema'),\n workspace: this.parseJson(row.workspace, 'workspace'),\n skills: this.parseJson(row.skills, 'skills'),\n skillsFormat: row.skillsFormat as 'xml' | 'json' | 'markdown' | undefined,\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client } from '@libsql/client';\nimport { BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class BlobsLibSQL extends BlobStore {\n #db: LibSQLDB;\n #client: Client;\n\n static readonly MANAGED_TABLES = [TABLE_SKILL_BLOBS] as const;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SKILL_BLOBS, schema: SKILL_BLOBS_SCHEMA });\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n const now = entry.createdAt ?? new Date();\n await this.#client.execute({\n sql: `INSERT OR IGNORE INTO \"${TABLE_SKILL_BLOBS}\" (\"hash\", \"content\", \"size\", \"mimeType\", \"createdAt\") VALUES (?, ?, ?, ?, ?)`,\n args: [entry.hash, entry.content, entry.size, entry.mimeType ?? null, now.toISOString()],\n });\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_BLOBS)} FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" = ?`,\n args: [hash],\n });\n if (!result.rows.length) return null;\n return this.#parseRow(result.rows[0]!);\n }\n\n async has(hash: string): Promise<boolean> {\n const result = await this.#client.execute({\n sql: `SELECT 1 FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" = ? LIMIT 1`,\n args: [hash],\n });\n return result.rows.length > 0;\n }\n\n async delete(hash: string): Promise<boolean> {\n const result = await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" = ?`,\n args: [hash],\n });\n return result.rowsAffected > 0;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n await this.#db.batchInsert({\n tableName: TABLE_SKILL_BLOBS,\n records: entries.map(entry => ({\n hash: entry.hash,\n content: entry.content,\n size: entry.size,\n mimeType: entry.mimeType ?? null,\n createdAt: (entry.createdAt ?? new Date()).toISOString(),\n })),\n });\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n\n // SQLite has a limit on the number of parameters, batch in groups of 500\n const batchSize = 500;\n for (let i = 0; i < hashes.length; i += batchSize) {\n const batch = hashes.slice(i, i + batchSize);\n const placeholders = batch.map(() => '?').join(', ');\n const queryResult = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_BLOBS)} FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" IN (${placeholders})`,\n args: batch,\n });\n for (const row of queryResult.rows) {\n const entry = this.#parseRow(row);\n result.set(entry.hash, entry);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SKILL_BLOBS });\n }\n\n #parseRow(row: Record<string, unknown>): StorageBlobEntry {\n return {\n hash: row.hash as string,\n content: row.content as string,\n size: Number(row.size),\n mimeType: (row.mimeType as string) || undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n DATASETS_SCHEMA,\n DATASET_ITEMS_SCHEMA,\n DATASET_VERSIONS_SCHEMA,\n DatasetsStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\n/** Serialize a value for a jsonb column. Returns null for null/undefined. */\nfunction jsonbArg(value: unknown): string | null {\n return value === undefined || value === null ? null : JSON.stringify(value);\n}\n\nexport class DatasetsLibSQL extends DatasetsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n // T3.23 — NO item_versions table\n await this.#db.createTable({ tableName: TABLE_DATASETS, schema: DATASETS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_DATASET_ITEMS, schema: DATASET_ITEMS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: DATASET_VERSIONS_SCHEMA });\n\n // T3.24 — SCD-2 indexes on dataset_items\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_validto ON \"${TABLE_DATASET_ITEMS}\" (\"datasetId\", \"validTo\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_version ON \"${TABLE_DATASET_ITEMS}\" (\"datasetId\", \"datasetVersion\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_validto_deleted ON \"${TABLE_DATASET_ITEMS}\" (\"datasetId\", \"validTo\", \"isDeleted\")`,\n args: [],\n });\n\n // T3.25 — indexes on dataset_versions\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_versions_dataset_version ON \"${TABLE_DATASET_VERSIONS}\" (\"datasetId\", \"version\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_dataset_versions_dataset_version_unique ON \"${TABLE_DATASET_VERSIONS}\" (\"datasetId\", \"version\")`,\n args: [],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_DATASET_VERSIONS });\n await this.#db.deleteData({ tableName: TABLE_DATASET_ITEMS });\n await this.#db.deleteData({ tableName: TABLE_DATASETS });\n }\n\n // --- Row transformers ---\n\n private transformDatasetRow(row: Record<string, any>): DatasetRecord {\n return {\n id: row.id as string,\n name: row.name as string,\n description: row.description as string | undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n inputSchema: row.inputSchema ? safelyParseJSON(row.inputSchema) : undefined,\n groundTruthSchema: row.groundTruthSchema ? safelyParseJSON(row.groundTruthSchema) : undefined,\n version: row.version as number,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n };\n }\n\n private transformItemRow(row: Record<string, any>): DatasetItem {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n input: safelyParseJSON(row.input),\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n };\n }\n\n private transformItemRowFull(row: Record<string, any>): DatasetItemRow {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n validTo: row.validTo as number | null,\n isDeleted: Boolean(row.isDeleted),\n input: safelyParseJSON(row.input),\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n };\n }\n\n private transformDatasetVersionRow(row: Record<string, any>): DatasetVersion {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n version: row.version as number,\n createdAt: ensureDate(row.createdAt)!,\n };\n }\n\n // --- Dataset CRUD ---\n\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_DATASETS,\n record: {\n id,\n name: input.name,\n description: input.description ?? null,\n metadata: input.metadata,\n inputSchema: input.inputSchema ?? null,\n groundTruthSchema: input.groundTruthSchema ?? null,\n version: 0,\n createdAt: nowIso,\n updatedAt: nowIso,\n },\n });\n\n return {\n id,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n inputSchema: input.inputSchema ?? undefined,\n groundTruthSchema: input.groundTruthSchema ?? undefined,\n version: 0,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getDatasetById({ id }: { id: string }): Promise<DatasetRecord | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASETS)} FROM ${TABLE_DATASETS} WHERE id = ?`,\n args: [id],\n });\n return result.rows?.[0] ? this.transformDatasetRow(result.rows[0]) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n try {\n const existing = await this.getDatasetById({ id: args.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_DATASET', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.id },\n });\n }\n\n const now = new Date().toISOString();\n const updates: string[] = ['updatedAt = ?'];\n const values: InValue[] = [now];\n\n if (args.name !== undefined) {\n updates.push('name = ?');\n values.push(args.name);\n }\n if (args.description !== undefined) {\n updates.push('description = ?');\n values.push(args.description);\n }\n if (args.metadata !== undefined) {\n updates.push('metadata = ?');\n values.push(JSON.stringify(args.metadata));\n }\n if (args.inputSchema !== undefined) {\n updates.push('inputSchema = ?');\n values.push(args.inputSchema === null ? null : JSON.stringify(args.inputSchema));\n }\n if (args.groundTruthSchema !== undefined) {\n updates.push('groundTruthSchema = ?');\n values.push(args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema));\n }\n\n values.push(args.id);\n\n await this.#client.execute({\n sql: `UPDATE ${TABLE_DATASETS} SET ${updates.join(', ')} WHERE id = ?`,\n args: values,\n });\n\n return {\n ...existing,\n name: args.name ?? existing.name,\n description: args.description ?? existing.description,\n metadata: args.metadata ?? existing.metadata,\n inputSchema: (args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema) ?? undefined,\n groundTruthSchema:\n (args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema) ?? undefined,\n updatedAt: new Date(now),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteDataset({ id }: { id: string }): Promise<void> {\n try {\n // F3 fix: detach experiments (SET NULL) instead of deleting. Delete results for FK safety.\n // Each operation wrapped separately — experiment_results table may not exist even if experiments does.\n try {\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENT_RESULTS} WHERE experimentId IN (SELECT id FROM ${TABLE_EXPERIMENTS} WHERE datasetId = ?)`,\n args: [id],\n });\n } catch {\n // experiment_results table may not exist\n }\n try {\n await this.#client.execute({\n sql: `UPDATE ${TABLE_EXPERIMENTS} SET datasetId = NULL, datasetVersion = NULL WHERE datasetId = ?`,\n args: [id],\n });\n } catch {\n // experiments table may not exist\n }\n\n // Dataset cascade — atomic batch (T3.18)\n await this.#client.batch(\n [\n { sql: `DELETE FROM ${TABLE_DATASET_VERSIONS} WHERE datasetId = ?`, args: [id] },\n { sql: `DELETE FROM ${TABLE_DATASET_ITEMS} WHERE datasetId = ?`, args: [id] },\n { sql: `DELETE FROM ${TABLE_DATASETS} WHERE id = ?`, args: [id] },\n ],\n 'write',\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASETS}`,\n args: [],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n datasets: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASETS)} FROM ${TABLE_DATASETS} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [limitValue, start],\n });\n\n return {\n datasets: result.rows?.map(row => this.transformDatasetRow(row)) ?? [],\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_DATASETS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- SCD-2 item mutations ---\n\n protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n try {\n const id = crypto.randomUUID();\n const versionId = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n // T3.7, T3.21 — atomic batch: bump version, insert item, insert dataset_version\n const results = await this.#client.batch(\n [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [args.datasetId],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n id,\n args.datasetId,\n args.datasetId,\n jsonbArg(args.input)!,\n jsonbArg(args.groundTruth),\n jsonbArg(args.metadata),\n nowIso,\n nowIso,\n ],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, args.datasetId, args.datasetId, nowIso],\n },\n ],\n 'write',\n );\n\n const newVersion = Number(results[0]!.rows[0]!.version);\n\n return {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n input: args.input,\n groundTruth: args.groundTruth,\n metadata: args.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'ADD_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n try {\n // Verify item exists and belongs to dataset\n const existing = await this.getItemById({ id: args.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_ITEM', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: args.id },\n });\n }\n if (existing.datasetId !== args.datasetId) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: args.id, expectedDatasetId: args.datasetId, actualDatasetId: existing.datasetId },\n });\n }\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n // Merge fields\n const mergedInput = args.input ?? existing.input;\n const mergedGroundTruth = args.groundTruth ?? existing.groundTruth;\n const mergedMetadata = args.metadata ?? existing.metadata;\n\n // T3.8, T3.21 — atomic batch: bump version, close old row, insert new row, insert dataset_version\n const results = await this.#client.batch(\n [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [args.datasetId],\n },\n {\n sql: `UPDATE ${TABLE_DATASET_ITEMS} SET validTo = (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?) WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [args.datasetId, args.id],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n args.id,\n args.datasetId,\n args.datasetId,\n jsonbArg(mergedInput)!,\n jsonbArg(mergedGroundTruth),\n jsonbArg(mergedMetadata),\n existing.createdAt.toISOString(),\n nowIso,\n ],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, args.datasetId, args.datasetId, nowIso],\n },\n ],\n 'write',\n );\n\n const newVersion = Number(results[0]!.rows[0]!.version);\n\n return {\n ...existing,\n datasetVersion: newVersion,\n input: mergedInput,\n groundTruth: mergedGroundTruth,\n metadata: mergedMetadata,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doDeleteItem({ id, datasetId }: { id: string; datasetId: string }): Promise<void> {\n try {\n // Get current item — no-op if not found\n const existing = await this.getItemById({ id });\n if (!existing) return;\n if (existing.datasetId !== datasetId) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'DELETE_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: id, expectedDatasetId: datasetId, actualDatasetId: existing.datasetId },\n });\n }\n\n const versionId = crypto.randomUUID();\n const nowIso = new Date().toISOString();\n\n // T3.9, T3.21 — atomic batch: bump version, close old row, insert tombstone, insert dataset_version\n await this.#client.batch(\n [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [datasetId],\n },\n {\n sql: `UPDATE ${TABLE_DATASET_ITEMS} SET validTo = (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?) WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [datasetId, id],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n id,\n datasetId,\n datasetId,\n jsonbArg(existing.input)!,\n jsonbArg(existing.groundTruth),\n jsonbArg(existing.metadata),\n existing.createdAt.toISOString(),\n nowIso,\n ],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, datasetId, datasetId, nowIso],\n },\n ],\n 'write',\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n try {\n let result;\n if (args.datasetVersion !== undefined) {\n // T3.13 — exact version match, exclude deleted\n result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE id = ? AND datasetVersion = ? AND isDeleted = 0`,\n args: [args.id, args.datasetVersion],\n });\n } else {\n // T3.12 — current row (validTo IS NULL AND isDeleted = false)\n result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [args.id],\n });\n }\n return result.rows?.[0] ? this.transformItemRow(result.rows[0]) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n try {\n // T3.14, T3.22 — SCD-2 range query, NO window functions\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE datasetId = ? AND datasetVersion <= ? AND (validTo IS NULL OR validTo > ?) AND isDeleted = 0 ORDER BY createdAt DESC`,\n args: [datasetId, version, version],\n });\n\n return result.rows?.map(row => this.transformItemRow(row)) ?? [];\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ITEMS_BY_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n try {\n // ALL rows including tombstones, ordered by datasetVersion DESC (newest first)\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE id = ? ORDER BY datasetVersion DESC`,\n args: [itemId],\n });\n\n return result.rows?.map(row => this.transformItemRowFull(row)) ?? [];\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ITEM_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n if (args.version !== undefined) {\n // SCD-2 time-travel query — T3.14, T3.22 (no window functions)\n const conditions: string[] = [\n 'datasetId = ?',\n 'datasetVersion <= ?',\n '(validTo IS NULL OR validTo > ?)',\n 'isDeleted = 0',\n ];\n const queryParams: InValue[] = [args.datasetId, args.version, args.version];\n\n if (args.search) {\n conditions.push(`(LOWER(json(input)) LIKE ? OR LOWER(COALESCE(json(groundTruth), '')) LIKE ?)`);\n const searchPattern = `%${args.search.toLowerCase()}%`;\n queryParams.push(searchPattern, searchPattern);\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASET_ITEMS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n items: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n items: result.rows?.map(row => this.transformItemRow(row)) ?? [],\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n\n // T3.16 — current items only (validTo IS NULL AND isDeleted = false)\n const conditions: string[] = ['datasetId = ?', 'validTo IS NULL', 'isDeleted = 0'];\n const queryParams: InValue[] = [args.datasetId];\n\n if (args.search) {\n conditions.push(`(LOWER(json(input)) LIKE ? OR LOWER(COALESCE(json(groundTruth), '')) LIKE ?)`);\n const searchPattern = `%${args.search.toLowerCase()}%`;\n queryParams.push(searchPattern, searchPattern);\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASET_ITEMS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n items: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n items: result.rows?.map(row => this.transformItemRow(row)) ?? [],\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_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Dataset version methods ---\n\n async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: {\n id,\n datasetId,\n version,\n createdAt: nowIso,\n },\n });\n\n return {\n id,\n datasetId,\n version,\n createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_DATASET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n try {\n const { page, perPage: perPageInput } = input.pagination;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASET_VERSIONS} WHERE datasetId = ?`,\n args: [input.datasetId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASET_VERSIONS)} FROM ${TABLE_DATASET_VERSIONS} WHERE datasetId = ? ORDER BY version DESC LIMIT ? OFFSET ?`,\n args: [input.datasetId, limitValue, start],\n });\n\n return {\n versions: result.rows?.map(row => this.transformDatasetVersionRow(row)) ?? [],\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_DATASET_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Bulk operations (SCD-2 internally) ---\n\n protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n try {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'BULK_ADD_ITEMS', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const now = new Date();\n const nowIso = now.toISOString();\n const versionId = crypto.randomUUID();\n\n // T3.19 — single version increment for all items\n const statements: { sql: string; args: InValue[] }[] = [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [input.datasetId],\n },\n ];\n\n const items: { id: string; input: BatchInsertItemsInput['items'][number] }[] = [];\n for (const itemInput of input.items) {\n const id = crypto.randomUUID();\n items.push({ id, input: itemInput });\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n id,\n input.datasetId,\n input.datasetId,\n jsonbArg(itemInput.input)!,\n jsonbArg(itemInput.groundTruth),\n jsonbArg(itemInput.metadata),\n nowIso,\n nowIso,\n ],\n });\n }\n\n // T3.11 — single dataset_version for the bulk operation\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, input.datasetId, input.datasetId, nowIso],\n });\n\n const results = await this.#client.batch(statements, 'write');\n const newVersion = Number(results[0]!.rows[0]!.version);\n\n return items.map(({ id, input: itemInput }) => ({\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n input: itemInput.input,\n groundTruth: itemInput.groundTruth,\n metadata: itemInput.metadata,\n createdAt: now,\n updatedAt: now,\n }));\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BULK_ADD_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n try {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'BULK_DELETE_ITEMS', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n // Fetch current items for tombstone data\n const currentItems: DatasetItem[] = [];\n for (const itemId of input.itemIds) {\n const item = await this.getItemById({ id: itemId });\n if (item && item.datasetId === input.datasetId) {\n currentItems.push(item);\n }\n }\n\n if (currentItems.length === 0) return;\n\n const nowIso = new Date().toISOString();\n const versionId = crypto.randomUUID();\n\n // T3.20 — single version increment\n const statements: { sql: string; args: InValue[] }[] = [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [input.datasetId],\n },\n ];\n\n for (const item of currentItems) {\n // Close old row\n statements.push({\n sql: `UPDATE ${TABLE_DATASET_ITEMS} SET validTo = (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?) WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [input.datasetId, item.id],\n });\n // Insert tombstone\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n item.id,\n input.datasetId,\n input.datasetId,\n jsonbArg(item.input)!,\n jsonbArg(item.groundTruth),\n jsonbArg(item.metadata),\n item.createdAt.toISOString(),\n nowIso,\n ],\n });\n }\n\n // T3.11 — single dataset_version\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, input.datasetId, input.datasetId, nowIso],\n });\n\n await this.#client.batch(statements, 'write');\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BULK_DELETE_ITEMS', '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 {\n createStorageErrorId,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n EXPERIMENTS_SCHEMA,\n EXPERIMENT_RESULTS_SCHEMA,\n ExperimentsStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n Experiment,\n ExperimentResult,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class ExperimentsLibSQL extends ExperimentsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_EXPERIMENTS, schema: EXPERIMENTS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_EXPERIMENT_RESULTS,\n schema: EXPERIMENT_RESULTS_SCHEMA,\n });\n\n // Indexes — idempotent, safe to run on every init\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_experiments_datasetid ON \"${TABLE_EXPERIMENTS}\" (\"datasetId\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_experiment_results_experimentid ON \"${TABLE_EXPERIMENT_RESULTS}\" (\"experimentId\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_experiment_results_exp_item ON \"${TABLE_EXPERIMENT_RESULTS}\" (\"experimentId\", \"itemId\")`,\n args: [],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_EXPERIMENT_RESULTS });\n await this.#db.deleteData({ tableName: TABLE_EXPERIMENTS });\n }\n\n // Helper to transform row to Experiment\n private transformExperimentRow(row: Record<string, unknown>): Experiment {\n return {\n id: row.id as string,\n datasetId: (row.datasetId as string | null) ?? null,\n datasetVersion: row.datasetVersion != null ? (row.datasetVersion as number) : null,\n targetType: row.targetType as Experiment['targetType'],\n targetId: row.targetId as string,\n name: (row.name as string) ?? undefined,\n description: (row.description as string) ?? undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata as string) : undefined,\n status: row.status as Experiment['status'],\n totalItems: row.totalItems as number,\n succeededCount: row.succeededCount as number,\n failedCount: row.failedCount as number,\n skippedCount: (row.skippedCount as number) ?? 0,\n startedAt: row.startedAt ? ensureDate(row.startedAt as string | Date)! : null,\n completedAt: row.completedAt ? ensureDate(row.completedAt as string | Date)! : null,\n createdAt: ensureDate(row.createdAt as string | Date)!,\n updatedAt: ensureDate(row.updatedAt as string | Date)!,\n };\n }\n\n // Helper to transform row to ExperimentResult\n private transformExperimentResultRow(row: Record<string, unknown>): ExperimentResult {\n return {\n id: row.id as string,\n experimentId: row.experimentId as string,\n itemId: row.itemId as string,\n itemDatasetVersion: row.itemDatasetVersion != null ? (row.itemDatasetVersion as number) : null,\n input: safelyParseJSON(row.input as string),\n output: row.output ? safelyParseJSON(row.output as string) : null,\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth as string) : null,\n error: row.error ? safelyParseJSON(row.error as string) : null,\n startedAt: ensureDate(row.startedAt as string | Date)!,\n completedAt: ensureDate(row.completedAt as string | Date)!,\n retryCount: row.retryCount as number,\n traceId: (row.traceId as string | null) ?? null,\n createdAt: ensureDate(row.createdAt as string | Date)!,\n };\n }\n\n // Experiment lifecycle\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n try {\n const id = input.id ?? crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_EXPERIMENTS,\n record: {\n id,\n datasetId: input.datasetId ?? null,\n datasetVersion: input.datasetVersion ?? null,\n targetType: input.targetType,\n targetId: input.targetId,\n name: input.name ?? null,\n description: input.description ?? null,\n metadata: input.metadata ?? null,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n startedAt: null,\n completedAt: null,\n createdAt: nowIso,\n updatedAt: nowIso,\n },\n });\n\n return {\n id,\n datasetId: input.datasetId,\n datasetVersion: input.datasetVersion,\n targetType: input.targetType,\n targetId: input.targetId,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n try {\n const existing = await this.getExperimentById({ id: input.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_EXPERIMENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { experimentId: input.id },\n });\n }\n\n const now = new Date().toISOString();\n const updates: string[] = ['updatedAt = ?'];\n const values: InValue[] = [now];\n\n if (input.status !== undefined) {\n updates.push('status = ?');\n values.push(input.status);\n }\n if (input.succeededCount !== undefined) {\n updates.push('succeededCount = ?');\n values.push(input.succeededCount);\n }\n if (input.failedCount !== undefined) {\n updates.push('failedCount = ?');\n values.push(input.failedCount);\n }\n if (input.startedAt !== undefined) {\n updates.push('startedAt = ?');\n values.push(input.startedAt?.toISOString() ?? null);\n }\n if (input.completedAt !== undefined) {\n updates.push('completedAt = ?');\n values.push(input.completedAt?.toISOString() ?? null);\n }\n if (input.skippedCount !== undefined) {\n updates.push('skippedCount = ?');\n values.push(input.skippedCount);\n }\n if (input.name !== undefined) {\n updates.push('name = ?');\n values.push(input.name);\n }\n if (input.description !== undefined) {\n updates.push('description = ?');\n values.push(input.description);\n }\n if (input.metadata !== undefined) {\n updates.push('metadata = ?');\n values.push(JSON.stringify(input.metadata));\n }\n\n values.push(input.id);\n\n await this.#client.execute({\n sql: `UPDATE ${TABLE_EXPERIMENTS} SET ${updates.join(', ')} WHERE id = ?`,\n args: values,\n });\n\n // Re-SELECT to get all fields correctly transformed (F2 fix)\n const updated = await this.getExperimentById({ id: input.id });\n return updated!;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentById(args: { id: string }): Promise<Experiment | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_EXPERIMENTS)} FROM ${TABLE_EXPERIMENTS} WHERE id = ?`,\n args: [args.id],\n });\n return result.rows?.[0] ? this.transformExperimentRow(result.rows[0] as Record<string, unknown>) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n // Build WHERE clause\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (args.datasetId) {\n conditions.push('datasetId = ?');\n queryParams.push(args.datasetId);\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_EXPERIMENTS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n experiments: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_EXPERIMENTS)} FROM ${TABLE_EXPERIMENTS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n experiments: result.rows?.map(row => this.transformExperimentRow(row as Record<string, unknown>)) ?? [],\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_EXPERIMENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperiment(args: { id: string }): Promise<void> {\n try {\n // Delete results first (foreign key semantics)\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENT_RESULTS} WHERE experimentId = ?`,\n args: [args.id],\n });\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENTS} WHERE id = ?`,\n args: [args.id],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // Results (per-item)\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n try {\n const id = input.id ?? crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_EXPERIMENT_RESULTS,\n record: {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion ?? null,\n input: input.input,\n output: input.output,\n groundTruth: input.groundTruth,\n error: input.error ?? null,\n startedAt: input.startedAt.toISOString(),\n completedAt: input.completedAt.toISOString(),\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n createdAt: nowIso,\n },\n });\n\n return {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion,\n input: input.input,\n output: input.output,\n groundTruth: input.groundTruth,\n error: input.error,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'ADD_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_EXPERIMENT_RESULTS)} FROM ${TABLE_EXPERIMENT_RESULTS} WHERE id = ?`,\n args: [args.id],\n });\n return result.rows?.[0] ? this.transformExperimentResultRow(result.rows[0] as Record<string, unknown>) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n // Build WHERE clause\n const conditions: string[] = ['experimentId = ?'];\n const queryParams: InValue[] = [args.experimentId];\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_EXPERIMENT_RESULTS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n results: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_EXPERIMENT_RESULTS)} FROM ${TABLE_EXPERIMENT_RESULTS} ${whereClause} ORDER BY startedAt ASC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n results: result.rows?.map(row => this.transformExperimentResultRow(row as Record<string, unknown>)) ?? [],\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_EXPERIMENT_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperimentResults(args: { experimentId: string }): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENT_RESULTS} WHERE experimentId = ?`,\n args: [args.experimentId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_EXPERIMENT_RESULTS', '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 {\n MCPClientsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n MCP_CLIENTS_SCHEMA,\n MCP_CLIENT_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageMCPClientType,\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n} from '@mastra/core/storage';\nimport type {\n MCPClientVersion,\n CreateMCPClientVersionInput,\n ListMCPClientVersionsInput,\n ListMCPClientVersionsOutput,\n} from '@mastra/core/storage/domains/mcp-clients';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class MCPClientsLibSQL extends MCPClientsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_MCP_CLIENTS, schema: MCP_CLIENTS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n schema: MCP_CLIENT_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (mcpClientId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_mcp_client_versions_client_version ON \"${TABLE_MCP_CLIENT_VERSIONS}\" (\"mcpClientId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_MCP_CLIENTS });\n await this.#db.deleteData({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n }\n\n // ==========================================================================\n // MCP Client CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENTS)} FROM \"${TABLE_MCP_CLIENTS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseMCPClientRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n const { mcpClient } = input;\n try {\n const now = new Date();\n\n // Insert thin MCP client record\n await this.#db.insert({\n tableName: TABLE_MCP_CLIENTS,\n record: {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpClient.authorId ?? null,\n metadata: mcpClient.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n mcpClientId: mcpClient.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned client record\n await this.#db.delete({ tableName: TABLE_MCP_CLIENTS, keys: { id: mcpClient.id } });\n throw versionError;\n }\n\n return {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: mcpClient.authorId,\n metadata: mcpClient.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`MCP client with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the MCP client record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_MCP_CLIENTS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated MCP client\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_MCP_CLIENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP client ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_CLIENTS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n conditions.push('status = ?');\n queryParams.push(status);\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_CLIENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_CLIENTS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n mcpClients: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_MCP_CLIENTS)} FROM \"${TABLE_MCP_CLIENTS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const mcpClients = result.rows?.map(row => this.#parseMCPClientRow(row)) ?? [];\n\n return {\n mcpClients,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // MCP Client Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n record: {\n id: input.id,\n mcpClientId: input.mcpClientId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n servers: input.servers ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<MCPClientVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ? AND versionNumber = ?`,\n args: [mcpClientId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_CLIENT_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [mcpClientId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n try {\n const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ?`,\n args: [mcpClientId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [mcpClientId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE \"mcpClientId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_CLIENT_VERSIONS_BY_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(mcpClientId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ?`,\n args: [mcpClientId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseMCPClientRow(row: Record<string, unknown>): StorageMCPClientType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StorageMCPClientType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): MCPClientVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n mcpClientId: row.mcpClientId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n servers: safeParseJSON(row.servers) as MCPClientVersion['servers'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport 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 StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n ObservationalMemoryRecord,\n BufferedObservationChunk,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n UpdateBufferedReflectionInput,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\n\n/**\n * Local constant for the observational memory table name.\n * Defined locally to avoid a static import that crashes on older @mastra/core\n * versions that don't export TABLE_OBSERVATIONAL_MEMORY.\n */\nconst OM_TABLE = 'mastra_observational_memory' as const;\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class MemoryLibSQL extends MemoryStorage {\n readonly supportsObservationalMemory = true;\n\n #client: Client;\n #db: LibSQLDB;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n\n // Dynamically import OM schema to avoid crashing on older @mastra/core versions\n let omSchema: Record<string, any> | undefined;\n try {\n const { OBSERVATIONAL_MEMORY_TABLE_SCHEMA } = await import('@mastra/core/storage');\n omSchema = OBSERVATIONAL_MEMORY_TABLE_SCHEMA?.[OM_TABLE];\n } catch {\n // Older @mastra/core without OM support\n }\n\n if (omSchema) {\n await this.#db.createTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n });\n // Add new OM columns for backwards compatibility with existing databases\n await this.#db.alterTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n ifNotExists: [\n 'observedMessageIds',\n 'observedTimezone',\n 'bufferedObservations',\n 'bufferedObservationTokens',\n 'bufferedMessageIds',\n 'bufferedReflection',\n 'bufferedReflectionTokens',\n 'bufferedReflectionInputTokens',\n 'reflectedObservationLineCount',\n 'bufferedObservationChunks',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n ],\n });\n }\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n if (omSchema) {\n // Create index on lookupKey for efficient OM queries\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON \"${OM_TABLE}\" (\"lookupKey\")`,\n args: [],\n });\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_MESSAGES });\n await this.#db.deleteData({ tableName: TABLE_THREADS });\n await this.#db.deleteData({ tableName: TABLE_RESOURCES });\n if (OM_TABLE) {\n await this.#db.deleteData({ tableName: OM_TABLE as any });\n }\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 const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`\"createdAt\" ${startOp} ?`);\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 const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`\"createdAt\" ${endOp} ?`);\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 public async listMessagesByResourceId(\n args: StorageListMessagesByResourceIdInput,\n ): Promise<StorageListMessagesOutput> {\n const { resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n if (!resourceId || typeof resourceId !== 'string' || resourceId.trim().length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MESSAGES', 'INVALID_QUERY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { resourceId: resourceId ?? '' },\n },\n new Error('resourceId is required'),\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\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n // Add resourceId filter (required for listMessagesByResourceId)\n conditions.push(`\"resourceId\" = ?`);\n queryParams.push(resourceId);\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`\"createdAt\" ${startOp} ?`);\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 const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`\"createdAt\" ${endOp} ?`);\n queryParams.push(\n filter.dateRange.end instanceof Date ? filter.dateRange.end.toISOString() : filter.dateRange.end,\n );\n }\n\n const whereClause = `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\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 const hasMore = perPageInput !== false && 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: { resourceId },\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.#db.select<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.#db.insert({\n tableName: TABLE_RESOURCES,\n record: {\n ...resource,\n // metadata is handled by prepareStatement which stringifies jsonb columns\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 = jsonb(?)');\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.#db.select<\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 listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n const whereClauses: string[] = [];\n const queryParams: InValue[] = [];\n\n // Add resourceId filter if provided\n if (filter?.resourceId) {\n whereClauses.push('resourceId = ?');\n queryParams.push(filter.resourceId);\n }\n\n // Add metadata filters if provided (AND logic)\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n // Handle null values specially: json_extract returns SQL NULL for JSON null,\n // and NULL = NULL evaluates to NULL (not true) in SQL\n if (value === null) {\n whereClauses.push(`json_extract(metadata, '$.${key}') IS NULL`);\n } else if (typeof value === 'boolean') {\n // json_extract returns 1 for true, 0 for false (integers, not strings)\n whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(value ? 1 : 0);\n } else if (typeof value === 'number') {\n // Numbers are returned as-is by json_extract\n whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(value);\n } else if (typeof value === 'string') {\n // Strings are returned unquoted by json_extract\n whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(value);\n } else {\n // Objects and arrays are not supported for filtering\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'INVALID_METADATA_VALUE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Metadata filter value for key \"${key}\" must be a scalar type (string, number, boolean, or null), got ${typeof value}`,\n details: { key, valueType: typeof value },\n });\n }\n }\n }\n\n const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n const baseQuery = `FROM ${TABLE_THREADS} ${whereClause}`;\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),\n updatedAt: new Date(row.updatedAt as string),\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 ${buildSelectColumns(TABLE_THREADS)} ${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 // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n throw error;\n }\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n },\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.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n // metadata is handled by prepareStatement which stringifies jsonb columns\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 = jsonb(?) 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 try {\n // Delete messages first (child records), then thread\n // Note: Not using a transaction to avoid SQLITE_BUSY errors when multiple\n // deleteThread calls run concurrently. The two deletes are independent and\n // orphaned messages (if thread delete fails) would be cleaned up on next delete attempt.\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 }\n\n async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n // Get the source thread\n const sourceThread = await this.getThreadById({ threadId: sourceThreadId });\n if (!sourceThread) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Source thread with id ${sourceThreadId} not found`,\n details: { sourceThreadId },\n });\n }\n\n // Use provided ID or generate a new one\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n // Check if the new thread ID already exists\n const existingThread = await this.getThreadById({ threadId: newThreadId });\n if (existingThread) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'CLONE_THREAD', 'THREAD_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread with id ${newThreadId} already exists`,\n details: { newThreadId },\n });\n }\n\n try {\n // Build message query with filters\n let messageQuery = `SELECT id, content, role, type, \"createdAt\", thread_id, \"resourceId\"\n FROM \"${TABLE_MESSAGES}\" WHERE thread_id = ?`;\n const messageParams: InValue[] = [sourceThreadId];\n\n // Apply date filters\n if (options?.messageFilter?.startDate) {\n messageQuery += ` AND \"createdAt\" >= ?`;\n messageParams.push(\n options.messageFilter.startDate instanceof Date\n ? options.messageFilter.startDate.toISOString()\n : options.messageFilter.startDate,\n );\n }\n if (options?.messageFilter?.endDate) {\n messageQuery += ` AND \"createdAt\" <= ?`;\n messageParams.push(\n options.messageFilter.endDate instanceof Date\n ? options.messageFilter.endDate.toISOString()\n : options.messageFilter.endDate,\n );\n }\n\n // Apply message ID filter\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n messageQuery += ` AND id IN (${options.messageFilter.messageIds.map(() => '?').join(', ')})`;\n messageParams.push(...options.messageFilter.messageIds);\n }\n\n messageQuery += ` ORDER BY \"createdAt\" ASC`;\n\n // Apply message limit (from most recent, so we need to reverse order for limit then sort back)\n if (options?.messageLimit && options.messageLimit > 0) {\n const limitQuery = `SELECT * FROM (${messageQuery.replace('ORDER BY \"createdAt\" ASC', 'ORDER BY \"createdAt\" DESC')} LIMIT ?) ORDER BY \"createdAt\" ASC`;\n messageParams.push(options.messageLimit);\n messageQuery = limitQuery;\n }\n\n const sourceMessagesResult = await this.#client.execute({ sql: messageQuery, args: messageParams });\n const sourceMessages = sourceMessagesResult.rows || [];\n\n const now = new Date();\n const nowStr = now.toISOString();\n\n // Determine the last message ID for clone metadata\n const lastMessageId =\n sourceMessages.length > 0 ? (sourceMessages[sourceMessages.length - 1]!.id as string) : undefined;\n\n // Create clone metadata\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n // Create the new thread\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : ''),\n metadata: {\n ...metadata,\n clone: cloneMetadata,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n // Use transaction for consistency\n const tx = await this.#client.transaction('write');\n\n try {\n // Insert the new thread\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_THREADS}\" (id, \"resourceId\", title, metadata, \"createdAt\", \"updatedAt\")\n VALUES (?, ?, ?, jsonb(?), ?, ?)`,\n args: [\n newThread.id,\n newThread.resourceId,\n newThread.title ?? '',\n JSON.stringify(newThread.metadata),\n nowStr,\n nowStr,\n ],\n });\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const targetResourceId = resourceId || sourceThread.resourceId;\n\n for (const sourceMsg of sourceMessages) {\n const newMessageId = crypto.randomUUID();\n const contentStr = sourceMsg.content as string;\n let parsedContent: MastraDBMessage['content'];\n try {\n parsedContent = JSON.parse(contentStr);\n } catch {\n // use content as is - wrap in format 2 structure if needed\n parsedContent = { format: 2, parts: [{ type: 'text', text: contentStr }] };\n }\n\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_MESSAGES}\" (id, thread_id, content, role, type, \"createdAt\", \"resourceId\")\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n args: [\n newMessageId,\n newThreadId,\n contentStr,\n sourceMsg.role as string,\n (sourceMsg.type as string) || 'v2',\n sourceMsg.createdAt as string,\n targetResourceId,\n ],\n });\n\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: parsedContent,\n role: sourceMsg.role as MastraDBMessage['role'],\n type: (sourceMsg.type as string) || undefined,\n createdAt: new Date(sourceMsg.createdAt as string),\n resourceId: targetResourceId,\n });\n }\n\n await tx.commit();\n\n return {\n thread: newThread,\n clonedMessages,\n };\n } catch (error) {\n await tx.rollback();\n throw error;\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n private getOMKey(threadId: string | null, resourceId: string): string {\n return threadId ? `thread:${threadId}` : `resource:${resourceId}`;\n }\n\n private parseOMRow(row: any): ObservationalMemoryRecord {\n return {\n id: row.id,\n scope: row.scope,\n threadId: row.threadId || null,\n resourceId: row.resourceId,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n lastObservedAt: row.lastObservedAt ? new Date(row.lastObservedAt) : undefined,\n originType: row.originType || 'initial',\n generationCount: Number(row.generationCount || 0),\n activeObservations: row.activeObservations || '',\n // Handle new chunk-based structure\n bufferedObservationChunks: row.bufferedObservationChunks\n ? typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks\n : undefined,\n // Deprecated fields (for backward compatibility)\n bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n bufferedMessageIds: undefined, // Use bufferedObservationChunks instead\n bufferedReflection: row.bufferedReflection || undefined,\n bufferedReflectionTokens: row.bufferedReflectionTokens ? Number(row.bufferedReflectionTokens) : undefined,\n bufferedReflectionInputTokens: row.bufferedReflectionInputTokens\n ? Number(row.bufferedReflectionInputTokens)\n : undefined,\n reflectedObservationLineCount: row.reflectedObservationLineCount\n ? Number(row.reflectedObservationLineCount)\n : undefined,\n totalTokensObserved: Number(row.totalTokensObserved || 0),\n observationTokenCount: Number(row.observationTokenCount || 0),\n pendingMessageTokens: Number(row.pendingMessageTokens || 0),\n isReflecting: Boolean(row.isReflecting),\n isObserving: Boolean(row.isObserving),\n isBufferingObservation:\n row.isBufferingObservation === true ||\n row.isBufferingObservation === 'true' ||\n row.isBufferingObservation === 1,\n isBufferingReflection:\n row.isBufferingReflection === true || row.isBufferingReflection === 'true' || row.isBufferingReflection === 1,\n lastBufferedAtTokens:\n typeof row.lastBufferedAtTokens === 'number'\n ? row.lastBufferedAtTokens\n : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n lastBufferedAtTime: row.lastBufferedAtTime ? new Date(String(row.lastBufferedAtTime)) : null,\n config: row.config ? JSON.parse(row.config) : {},\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n observedMessageIds: row.observedMessageIds ? JSON.parse(row.observedMessageIds) : undefined,\n observedTimezone: row.observedTimezone || undefined,\n };\n }\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const result = await this.#client.execute({\n // Use generationCount DESC for reliable ordering (incremented for each new record)\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE \"lookupKey\" = ? ORDER BY \"generationCount\" DESC LIMIT 1`,\n args: [lookupKey],\n });\n if (!result.rows || result.rows.length === 0) return null;\n return this.parseOMRow(result.rows[0]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit: number = 10,\n ): Promise<ObservationalMemoryRecord[]> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const result = await this.#client.execute({\n // Use generationCount DESC for reliable ordering (incremented for each new record)\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE \"lookupKey\" = ? ORDER BY \"generationCount\" DESC LIMIT ?`,\n args: [lookupKey, limit],\n });\n if (!result.rows) return [];\n return result.rows.map(row => this.parseOMRow(row));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_OBSERVATIONAL_MEMORY_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId, limit },\n },\n error,\n );\n }\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.scope,\n threadId: input.threadId,\n resourceId: input.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: undefined,\n originType: 'initial',\n generationCount: 0,\n activeObservations: '',\n totalTokensObserved: 0,\n observationTokenCount: 0,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.config,\n observedTimezone: input.observedTimezone,\n };\n\n await this.#client.execute({\n sql: `INSERT INTO \"${OM_TABLE}\" (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastReflectionAt\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"updatedAt\"\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n lookupKey,\n input.scope,\n input.resourceId,\n input.threadId || null,\n '',\n null,\n 'initial',\n JSON.stringify(input.config),\n 0,\n null,\n null,\n 0,\n 0,\n 0,\n false,\n false,\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n input.observedTimezone || null,\n now.toISOString(),\n now.toISOString(),\n ],\n });\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'INITIALIZE_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: input.threadId, resourceId: input.resourceId },\n },\n error,\n );\n }\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n try {\n const now = new Date();\n\n const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"activeObservations\" = ?,\n \"lastObservedAt\" = ?,\n \"pendingMessageTokens\" = 0,\n \"observationTokenCount\" = ?,\n \"totalTokensObserved\" = \"totalTokensObserved\" + ?,\n \"observedMessageIds\" = ?,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [\n input.observations,\n input.lastObservedAt.toISOString(),\n input.tokenCount,\n input.tokenCount,\n observedMessageIdsJson,\n now.toISOString(),\n input.id,\n ],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_ACTIVE_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_ACTIVE_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.currentRecord.threadId, input.currentRecord.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.currentRecord.scope,\n threadId: input.currentRecord.threadId,\n resourceId: input.currentRecord.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: input.currentRecord.lastObservedAt,\n originType: 'reflection',\n generationCount: input.currentRecord.generationCount + 1,\n activeObservations: input.reflection,\n totalTokensObserved: input.currentRecord.totalTokensObserved,\n observationTokenCount: input.tokenCount,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.currentRecord.config,\n metadata: input.currentRecord.metadata,\n observedTimezone: input.currentRecord.observedTimezone,\n };\n\n await this.#client.execute({\n sql: `INSERT INTO \"${OM_TABLE}\" (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastReflectionAt\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"updatedAt\"\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n lookupKey,\n record.scope,\n record.resourceId,\n record.threadId || null,\n input.reflection,\n null,\n 'reflection',\n JSON.stringify(record.config),\n input.currentRecord.generationCount + 1,\n record.lastObservedAt?.toISOString() || null,\n now.toISOString(),\n record.pendingMessageTokens,\n record.totalTokensObserved,\n record.observationTokenCount,\n false, // isObserving\n false, // isReflecting\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n record.observedTimezone || null,\n now.toISOString(),\n now.toISOString(),\n ],\n });\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_REFLECTION_GENERATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { currentRecordId: input.currentRecord.id },\n },\n error,\n );\n }\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \"isReflecting\" = ?, \"updatedAt\" = ? WHERE id = ?`,\n args: [isReflecting, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_REFLECTING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_REFLECTING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n },\n error,\n );\n }\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \"isObserving\" = ?, \"updatedAt\" = ? WHERE id = ?`,\n args: [isObserving, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_OBSERVING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_OBSERVING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n },\n error,\n );\n }\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n try {\n const nowStr = new Date().toISOString();\n\n let sql: string;\n let args: InValue[];\n\n if (lastBufferedAtTokens !== undefined) {\n sql = `UPDATE \"${OM_TABLE}\" SET \"isBufferingObservation\" = ?, \"lastBufferedAtTokens\" = ?, \"updatedAt\" = ? WHERE id = ?`;\n args = [isBuffering, lastBufferedAtTokens, nowStr, id];\n } else {\n sql = `UPDATE \"${OM_TABLE}\" SET \"isBufferingObservation\" = ?, \"updatedAt\" = ? WHERE id = ?`;\n args = [isBuffering, nowStr, id];\n }\n\n const result = await this.#client.execute({ sql, args });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_OBSERVATION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_OBSERVATION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n },\n error,\n );\n }\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \"isBufferingReflection\" = ?, \"updatedAt\" = ? WHERE id = ?`,\n args: [isBuffering, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_REFLECTION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_REFLECTION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n },\n error,\n );\n }\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n await this.#client.execute({\n sql: `DELETE FROM \"${OM_TABLE}\" WHERE \"lookupKey\" = ?`,\n args: [lookupKey],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CLEAR_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \n \"pendingMessageTokens\" = ?, \n \"updatedAt\" = ? \n WHERE id = ?`,\n args: [tokenCount, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_PENDING_MESSAGE_TOKENS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_PENDING_MESSAGE_TOKENS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Async Buffering Methods\n // ============================================\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n try {\n const nowStr = new Date().toISOString();\n\n // First get current record to get existing chunks\n const current = await this.#client.execute({\n sql: `SELECT \"bufferedObservationChunks\" FROM \"${OM_TABLE}\" WHERE id = ?`,\n args: [input.id],\n });\n\n if (!current.rows || current.rows.length === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n\n const row = current.rows[0]!;\n let existingChunks: BufferedObservationChunk[] = [];\n if (row.bufferedObservationChunks) {\n try {\n const parsed =\n typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks;\n existingChunks = Array.isArray(parsed) ? parsed : [];\n } catch {\n existingChunks = [];\n }\n }\n\n // Create new chunk with ID and timestamp\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${randomUUID()}`,\n cycleId: input.chunk.cycleId,\n observations: input.chunk.observations,\n tokenCount: input.chunk.tokenCount,\n messageIds: input.chunk.messageIds,\n messageTokens: input.chunk.messageTokens,\n lastObservedAt: input.chunk.lastObservedAt,\n createdAt: new Date(),\n suggestedContinuation: input.chunk.suggestedContinuation,\n currentTask: input.chunk.currentTask,\n };\n\n const newChunks = [...existingChunks, newChunk];\n\n const lastBufferedAtTime = input.lastBufferedAtTime ? input.lastBufferedAtTime.toISOString() : null;\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"bufferedObservationChunks\" = ?,\n \"lastBufferedAtTime\" = COALESCE(?, \"lastBufferedAtTime\"),\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [JSON.stringify(newChunks), lastBufferedAtTime, nowStr, input.id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n try {\n const nowStr = new Date().toISOString();\n\n // Get current record\n const current = await this.#client.execute({\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE id = ?`,\n args: [input.id],\n });\n\n if (!current.rows || current.rows.length === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n\n const row = current.rows[0]!;\n\n // Parse buffered chunks\n let chunks: BufferedObservationChunk[] = [];\n if (row.bufferedObservationChunks) {\n try {\n const parsed =\n typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks;\n chunks = Array.isArray(parsed) ? parsed : [];\n } catch {\n chunks = [];\n }\n }\n\n if (chunks.length === 0) {\n return {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n }\n\n // Calculate target message tokens to activate based on new formula:\n // retentionFloor = threshold * (1 - ratio) represents tokens to keep as raw messages\n // targetMessageTokens = max(0, currentPending - retentionFloor) represents tokens to activate\n const retentionFloor = input.messageTokensThreshold * (1 - input.activationRatio);\n const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n // Find the closest chunk boundary to the target, biased under\n let cumulativeMessageTokens = 0;\n let bestBoundary = 0;\n let bestBoundaryMessageTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n // Prefer boundaries that are under the target (leaves more raw messages in context)\n // Only go over if there's no under option\n const isUnder = cumulativeMessageTokens <= targetMessageTokens;\n const bestIsUnder = bestBoundaryMessageTokens <= targetMessageTokens;\n\n if (bestBoundary === 0) {\n // First boundary, take it\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n } else if (isUnder && !bestIsUnder) {\n // Current is under, best is over - prefer under\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n } else if (isUnder && bestIsUnder) {\n // Both under - prefer the one closer to target (higher)\n if (cumulativeMessageTokens > bestBoundaryMessageTokens) {\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n }\n } else if (!isUnder && !bestIsUnder) {\n // Both over - prefer the one closer to target (lower)\n if (cumulativeMessageTokens < bestBoundaryMessageTokens) {\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n }\n }\n // If current is over and best is under, keep best (do nothing)\n }\n\n // If bestBoundary is 0 (no boundary under target), activate at least 1 chunk\n // since we've reached threshold and need to clear some context\n const chunksToActivate = bestBoundary === 0 ? 1 : bestBoundary;\n\n // Split chunks\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = chunks.slice(chunksToActivate);\n\n // Combine activated observations\n const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);\n const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n // Derive lastObservedAt from the latest activated chunk, or use provided value\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const lastObservedAt =\n input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n const lastObservedAtStr = lastObservedAt.toISOString();\n\n // Get existing values\n const existingActive = (row.activeObservations as string) || '';\n const existingTokenCount = Number(row.observationTokenCount || 0);\n\n // Calculate new values\n const newActive = existingActive ? `${existingActive}\\n\\n${activatedContent}` : activatedContent;\n const newTokenCount = existingTokenCount + activatedTokens;\n // NOTE: We intentionally do NOT add message IDs to observedMessageIds during buffered activation.\n // Buffered chunks represent observations of messages as they were at buffering time.\n // With streaming, messages grow after buffering, so we rely on lastObservedAt for filtering.\n // New content after lastObservedAt will be picked up in subsequent observations.\n\n // Decrement pending message tokens (clamped to zero)\n const existingPending = Number(row.pendingMessageTokens || 0);\n const newPending = Math.max(0, existingPending - activatedMessageTokens);\n\n await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"activeObservations\" = ?,\n \"observationTokenCount\" = ?,\n \"pendingMessageTokens\" = ?,\n \"bufferedObservationChunks\" = ?,\n \"lastObservedAt\" = ?,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [\n newActive,\n newTokenCount,\n newPending,\n remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n lastObservedAtStr,\n nowStr,\n input.id,\n ],\n });\n\n return {\n chunksActivated: activatedChunks.length,\n messageTokensActivated: activatedMessageTokens,\n observationTokensActivated: activatedTokens,\n messagesActivated: activatedMessageCount,\n activatedCycleIds,\n activatedMessageIds,\n observations: activatedContent,\n perChunk: activatedChunks.map(c => ({\n cycleId: c.cycleId ?? '',\n messageTokens: c.messageTokens ?? 0,\n observationTokens: c.tokenCount,\n messageCount: c.messageIds.length,\n observations: c.observations,\n })),\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n try {\n const nowStr = new Date().toISOString();\n\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"bufferedReflection\" = CASE\n WHEN \"bufferedReflection\" IS NOT NULL AND \"bufferedReflection\" != ''\n THEN \"bufferedReflection\" || char(10) || char(10) || ?\n ELSE ?\n END,\n \"bufferedReflectionTokens\" = COALESCE(\"bufferedReflectionTokens\", 0) + ?,\n \"bufferedReflectionInputTokens\" = COALESCE(\"bufferedReflectionInputTokens\", 0) + ?,\n \"reflectedObservationLineCount\" = ?,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [\n input.reflection,\n input.reflection,\n input.tokenCount,\n input.inputTokenCount,\n input.reflectedObservationLineCount,\n nowStr,\n input.id,\n ],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_REFLECTION', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_REFLECTION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n try {\n // Get current record\n const current = await this.#client.execute({\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE id = ?`,\n args: [input.currentRecord.id],\n });\n\n if (!current.rows || current.rows.length === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.currentRecord.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n });\n }\n\n const row = current.rows[0]!;\n const bufferedReflection = (row.bufferedReflection as string) || '';\n const reflectedLineCount = Number(row.reflectedObservationLineCount || 0);\n\n if (!bufferedReflection) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NO_CONTENT'),\n text: 'No buffered reflection to swap',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { id: input.currentRecord.id },\n });\n }\n\n // Split current activeObservations by the recorded boundary.\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const currentObservations = (row.activeObservations as string) || '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n // New activeObservations = bufferedReflection + unreflected observations\n const newObservations = unreflectedContent\n ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n : bufferedReflection;\n\n // Create new generation with the merged content.\n // tokenCount is computed by the processor using its token counter on the combined content.\n const newRecord = await this.createReflectionGeneration({\n currentRecord: input.currentRecord,\n reflection: newObservations,\n tokenCount: input.tokenCount,\n });\n\n // Clear buffered state on old record\n const nowStr = new Date().toISOString();\n await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"bufferedReflection\" = NULL,\n \"bufferedReflectionTokens\" = NULL,\n \"bufferedReflectionInputTokens\" = NULL,\n \"reflectedObservationLineCount\" = NULL,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [nowStr, input.currentRecord.id],\n });\n\n return newRecord;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n SPAN_SCHEMA,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n ListTracesArgs,\n ListTracesResponse,\n TracingStorageStrategy,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { transformFromSqlRow } from '../../db/utils';\n\nexport class ObservabilityLibSQL extends ObservabilityStorage {\n #db: LibSQLDB;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SPANS });\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n return this.#db.migrateSpans();\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n return this.#db.checkSpansMigrationStatus();\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const startedAt = span.startedAt instanceof Date ? span.startedAt.toISOString() : span.startedAt;\n const endedAt = span.endedAt instanceof Date ? span.endedAt.toISOString() : span.endedAt;\n const now = new Date().toISOString();\n\n const record = {\n ...span,\n startedAt,\n endedAt,\n createdAt: now,\n updatedAt: now,\n };\n return this.#db.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 name: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const rows = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ? AND spanId = ?', args: [traceId, spanId] },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: rows[0]! }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const rows = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ? AND parentSpanId IS NULL', args: [traceId] },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: rows[0]! }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const spans = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ?', args: [traceId] },\n orderBy: 'startedAt ASC',\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(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString();\n }\n data.updatedAt = new Date().toISOString();\n\n await this.#db.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data,\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 listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n const tableName = parseSqlIdentifier(TABLE_SPANS, 'table name');\n\n try {\n // Build WHERE clause for filters\n const conditions: string[] = ['parentSpanId IS NULL']; // Only root spans\n const queryArgs: any[] = [];\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`startedAt >= ?`);\n queryArgs.push(filters.startedAt.start.toISOString());\n }\n if (filters.startedAt?.end) {\n conditions.push(`startedAt <= ?`);\n queryArgs.push(filters.startedAt.end.toISOString());\n }\n if (filters.endedAt?.start) {\n conditions.push(`endedAt >= ?`);\n queryArgs.push(filters.endedAt.start.toISOString());\n }\n if (filters.endedAt?.end) {\n conditions.push(`endedAt <= ?`);\n queryArgs.push(filters.endedAt.end.toISOString());\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`spanType = ?`);\n queryArgs.push(filters.spanType);\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`entityType = ?`);\n queryArgs.push(filters.entityType);\n }\n if (filters.entityId !== undefined) {\n conditions.push(`entityId = ?`);\n queryArgs.push(filters.entityId);\n }\n if (filters.entityName !== undefined) {\n conditions.push(`entityName = ?`);\n queryArgs.push(filters.entityName);\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`userId = ?`);\n queryArgs.push(filters.userId);\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`organizationId = ?`);\n queryArgs.push(filters.organizationId);\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`resourceId = ?`);\n queryArgs.push(filters.resourceId);\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`runId = ?`);\n queryArgs.push(filters.runId);\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`sessionId = ?`);\n queryArgs.push(filters.sessionId);\n }\n if (filters.threadId !== undefined) {\n conditions.push(`threadId = ?`);\n queryArgs.push(filters.threadId);\n }\n if (filters.requestId !== undefined) {\n conditions.push(`requestId = ?`);\n queryArgs.push(filters.requestId);\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`environment = ?`);\n queryArgs.push(filters.environment);\n }\n if (filters.source !== undefined) {\n conditions.push(`source = ?`);\n queryArgs.push(filters.source);\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`serviceName = ?`);\n queryArgs.push(filters.serviceName);\n }\n\n // Scope filter (JSON containment - SQLite uses json_extract)\n if (filters.scope != null) {\n // For SQLite/libsql, we need to check each key in the scope object\n for (const [key, value] of Object.entries(filters.scope)) {\n // Validate key to prevent SQL injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n conditions.push(`json_extract(scope, '$.${key}') = ?`);\n queryArgs.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n // Metadata filter (JSON containment)\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n // Validate key to prevent SQL injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryArgs.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n // Tags filter (all tags must be present)\n if (filters.tags != null && filters.tags.length > 0) {\n // Use json_each for exact tag matching (LIKE can match substrings)\n for (const tag of filters.tags) {\n conditions.push(`EXISTS (SELECT 1 FROM json_each(${tableName}.tags) WHERE value = ?)`);\n queryArgs.push(tag);\n }\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n conditions.push(`error IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(`endedAt IS NULL AND error IS NULL`);\n break;\n case TraceStatus.SUCCESS:\n conditions.push(`endedAt IS NOT NULL AND error IS NULL`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.traceId = ${tableName}.traceId AND c.error IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.traceId = ${tableName}.traceId AND c.error IS NOT NULL\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Order by clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n // SQLite's natural behavior: NULLs are \"smaller\" than any value\n // - ASC: NULLs first (natural)\n // - DESC: NULLs last (natural)\n // So we need CASE WHEN workarounds to invert the natural behavior for endedAt\n const sortField = orderBy.field;\n const sortDirection = orderBy.direction;\n let orderByClause: string;\n if (sortField === 'endedAt') {\n // endedAt DESC: want NULLs first (running spans on top) - need CASE WHEN\n // endedAt ASC: want NULLs last (oldest completed first) - need CASE WHEN\n orderByClause =\n sortDirection === 'DESC'\n ? `CASE WHEN ${sortField} IS NULL THEN 0 ELSE 1 END, ${sortField} DESC`\n : `CASE WHEN ${sortField} IS NULL THEN 1 ELSE 0 END, ${sortField} ASC`;\n } else {\n orderByClause = `${sortField} ${sortDirection}`;\n }\n\n // Get total count\n const count = await this.#db.selectTotalCount({\n tableName: TABLE_SPANS,\n whereClause: { sql: whereClause, args: queryArgs },\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 // Get paginated spans\n const spans = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: whereClause, args: queryArgs },\n orderBy: orderByClause,\n offset: page * perPage,\n limit: perPage,\n });\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: (page + 1) * perPage < count,\n },\n spans: toTraceSpans(\n spans.map(span => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: span })),\n ),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = new Date().toISOString();\n const records = args.records.map(record => {\n const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n return {\n ...record,\n startedAt,\n endedAt,\n createdAt: now,\n updatedAt: now,\n };\n });\n\n return this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records,\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: BatchUpdateSpansArgs): Promise<void> {\n const now = new Date().toISOString();\n\n try {\n return this.#db.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => {\n const data: Record<string, any> = { ...record.updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString();\n }\n data.updatedAt = now;\n\n return {\n keys: { spanId: record.spanId, traceId: record.traceId },\n data,\n };\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: BatchDeleteTracesArgs): Promise<void> {\n try {\n const keys = args.traceIds.map(traceId => ({ traceId }));\n return this.#db.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 {\n PromptBlocksStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n PROMPT_BLOCKS_SCHEMA,\n PROMPT_BLOCK_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class PromptBlocksLibSQL extends PromptBlocksStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: PROMPT_BLOCKS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, schema: PROMPT_BLOCK_VERSIONS_SCHEMA });\n\n // Unique constraint on (blockId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_prompt_block_versions_block_version ON \"${TABLE_PROMPT_BLOCK_VERSIONS}\" (\"blockId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_PROMPT_BLOCKS });\n await this.#db.deleteData({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n }\n\n // ==========================================================================\n // Prompt Block CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCKS)} FROM \"${TABLE_PROMPT_BLOCKS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseBlockRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n try {\n const now = new Date();\n\n // Insert thin block record\n await this.#db.insert({\n tableName: TABLE_PROMPT_BLOCKS,\n record: {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: null,\n authorId: promptBlock.authorId ?? null,\n metadata: promptBlock.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n return {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: promptBlock.authorId,\n metadata: promptBlock.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`Prompt block with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the block record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_PROMPT_BLOCKS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated block\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Prompt block ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_PROMPT_BLOCKS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n conditions.push('status = ?');\n queryParams.push(status);\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_PROMPT_BLOCKS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_PROMPT_BLOCKS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n promptBlocks: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_PROMPT_BLOCKS)} FROM \"${TABLE_PROMPT_BLOCKS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const promptBlocks = result.rows?.map(row => this.#parseBlockRow(row)) ?? [];\n\n return {\n promptBlocks,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Prompt Block Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n record: {\n id: input.id,\n blockId: input.blockId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n content: input.content,\n rules: input.rules ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<PromptBlockVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ? AND versionNumber = ?`,\n args: [blockId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_PROMPT_BLOCK_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [blockId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n try {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ?`,\n args: [blockId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [blockId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE \"blockId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(blockId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ?`,\n args: [blockId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseBlockRow(row: Record<string, unknown>): StoragePromptBlockType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StoragePromptBlockType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): PromptBlockVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n blockId: row.blockId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n content: row.content as string,\n rules: safeParseJSON(row.rules) as PromptBlockVersion['rules'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ScorerDefinitionsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n SCORER_DEFINITIONS_SCHEMA,\n SCORER_DEFINITION_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n} from '@mastra/core/storage';\nimport type {\n ScorerDefinitionVersion,\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class ScorerDefinitionsLibSQL extends ScorerDefinitionsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORER_DEFINITIONS, schema: SCORER_DEFINITIONS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: SCORER_DEFINITION_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (scorerDefinitionId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_scorer_definition_versions_scorer_version ON \"${TABLE_SCORER_DEFINITION_VERSIONS}\" (\"scorerDefinitionId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SCORER_DEFINITIONS });\n await this.#db.deleteData({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n }\n\n // ==========================================================================\n // Scorer Definition CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITIONS)} FROM \"${TABLE_SCORER_DEFINITIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseScorerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n const { scorerDefinition } = input;\n try {\n const now = new Date();\n\n // Insert thin scorer definition record\n await this.#db.insert({\n tableName: TABLE_SCORER_DEFINITIONS,\n record: {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: null,\n authorId: scorerDefinition.authorId ?? null,\n metadata: scorerDefinition.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n scorerDefinitionId: scorerDefinition.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n return {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: scorerDefinition.authorId,\n metadata: scorerDefinition.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`Scorer definition with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the scorer definition record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_SCORER_DEFINITIONS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated scorer definition\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Scorer definition ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SCORER_DEFINITIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (status) {\n conditions.push('status = ?');\n queryParams.push(status);\n }\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_SCORER_DEFINITIONS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\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_SCORER_DEFINITIONS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n scorerDefinitions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_SCORER_DEFINITIONS)} FROM \"${TABLE_SCORER_DEFINITIONS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const scorerDefinitions = result.rows?.map(row => this.#parseScorerRow(row)) ?? [];\n\n return {\n scorerDefinitions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Scorer Definition Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n record: {\n id: input.id,\n scorerDefinitionId: input.scorerDefinitionId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n type: input.type,\n model: input.model ?? null,\n instructions: input.instructions ?? null,\n scoreRange: input.scoreRange ?? null,\n presetConfig: input.presetConfig ?? null,\n defaultSampling: input.defaultSampling ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ? AND versionNumber = ?`,\n args: [scorerDefinitionId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SCORER_DEFINITION_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [scorerDefinitionId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n try {\n const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ?`,\n args: [scorerDefinitionId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [scorerDefinitionId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE \"scorerDefinitionId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_SCORER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(scorerDefinitionId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ?`,\n args: [scorerDefinitionId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseScorerRow(row: Record<string, unknown>): StorageScorerDefinitionType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StorageScorerDefinitionType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): ScorerDefinitionVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n scorerDefinitionId: row.scorerDefinitionId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n type: row.type as string as ScorerDefinitionVersion['type'],\n model: safeParseJSON(row.model) as ScorerDefinitionVersion['model'],\n instructions: (row.instructions as string) ?? undefined,\n scoreRange: safeParseJSON(row.scoreRange) as ScorerDefinitionVersion['scoreRange'],\n presetConfig: safeParseJSON(row.presetConfig) as ScorerDefinitionVersion['presetConfig'],\n defaultSampling: safeParseJSON(row.defaultSampling) as ScorerDefinitionVersion['defaultSampling'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\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 { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n TABLE_SCORERS,\n SCORERS_SCHEMA,\n ScoresStorage,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class ScoresLibSQL extends ScoresStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: SCORERS_SCHEMA });\n // Add columns for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_SCORERS,\n schema: SCORERS_SCHEMA,\n ifNotExists: ['spanId', 'requestContext'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SCORERS });\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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 */\n private transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row);\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} 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: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\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: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n\n await this.#db.insert({\n tableName: TABLE_SCORERS,\n record: {\n ...parsedScore,\n id,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\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<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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 {\n SkillsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n SKILLS_SCHEMA,\n SKILL_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageSkillType,\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n} from '@mastra/core/storage';\nimport type {\n SkillVersion,\n CreateSkillVersionInput,\n ListSkillVersionsInput,\n ListSkillVersionsOutput,\n} from '@mastra/core/storage/domains/skills';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\n/**\n * Config fields that live on version rows (from StorageSkillSnapshotType).\n */\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'instructions',\n 'license',\n 'compatibility',\n 'source',\n 'references',\n 'scripts',\n 'assets',\n 'metadata',\n 'tree',\n] as const;\n\nexport class SkillsLibSQL extends SkillsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SKILLS, schema: SKILLS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_SKILL_VERSIONS,\n schema: SKILL_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (skillId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_skill_versions_skill_version ON \"${TABLE_SKILL_VERSIONS}\" (\"skillId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SKILLS });\n await this.#db.deleteData({ tableName: TABLE_SKILL_VERSIONS });\n }\n\n // ==========================================================================\n // Skill CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageSkillType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILLS)} FROM \"${TABLE_SKILLS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseSkillRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n const { skill } = input;\n try {\n const now = new Date();\n\n // Insert thin skill record (no metadata on entity table)\n await this.#db.insert({\n tableName: TABLE_SKILLS,\n record: {\n id: skill.id,\n status: 'draft',\n activeVersionId: null,\n authorId: skill.authorId ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, ...snapshotConfig } = skill;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n skillId: skill.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned skill record\n await this.#db.delete({ tableName: TABLE_SKILLS, keys: { id: skill.id } });\n throw versionError;\n }\n\n return {\n id: skill.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: skill.authorId,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Skill ${id} not found`,\n details: { skillId: id },\n });\n }\n\n const { authorId, activeVersionId, status, ...configFields } = updates;\n\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Build update data for the skill record (no metadata on entity table)\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) {\n updateData.status = 'published';\n }\n }\n if (status !== undefined) updateData.status = status;\n\n await this.#db.update({\n tableName: TABLE_SKILLS,\n keys: { id },\n data: updateData,\n });\n\n // If config fields changed, create a new version\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `No versions found for skill ${id}`,\n details: { skillId: id },\n });\n }\n\n const {\n id: _versionId,\n skillId: _skillId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n skillId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Fetch and return updated skill\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Skill ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILLS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n // Note: metadata filter is ignored for skills since the entity table doesn't have a metadata column.\n // Metadata lives on the version table.\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_SKILLS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n skills: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_SKILLS)} FROM \"${TABLE_SKILLS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const skills = result.rows?.map(row => this.#parseSkillRow(row)) ?? [];\n\n return {\n skills,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SKILLS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Skill Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n try {\n const now = new Date();\n // Use raw SQL because \"references\" is a SQL reserved word and needs quoting\n await this.#client.execute({\n sql: `INSERT INTO \"${TABLE_SKILL_VERSIONS}\" (\n id, \"skillId\", \"versionNumber\",\n name, description, instructions, license, compatibility,\n source, \"references\", scripts, assets, metadata, tree,\n \"changedFields\", \"changeMessage\", \"createdAt\"\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n input.id,\n input.skillId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.instructions ?? null,\n input.license ?? null,\n input.compatibility ? JSON.stringify(input.compatibility) : null,\n input.source ? JSON.stringify(input.source) : null,\n input.references ? JSON.stringify(input.references) : null,\n input.scripts ? JSON.stringify(input.scripts) : null,\n input.assets ? JSON.stringify(input.assets) : null,\n input.metadata ? JSON.stringify(input.metadata) : null,\n input.tree ? JSON.stringify(input.tree) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n now.toISOString(),\n ],\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<SkillVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ? AND versionNumber = ?`,\n args: [skillId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SKILL_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [skillId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n try {\n const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ?`,\n args: [skillId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [skillId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILL_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILL_VERSIONS}\" WHERE \"skillId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SKILL_VERSIONS_BY_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(skillId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ?`,\n args: [skillId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseSkillRow(row: Record<string, unknown>): StorageSkillType {\n return {\n id: row.id as string,\n status: (row.status as StorageSkillType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): SkillVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n skillId: row.skillId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n instructions: (row.instructions as string) ?? undefined,\n license: (row.license as string) ?? undefined,\n compatibility: safeParseJSON(row.compatibility) as SkillVersion['compatibility'],\n source: safeParseJSON(row.source) as SkillVersion['source'],\n references: safeParseJSON(row.references) as SkillVersion['references'],\n scripts: safeParseJSON(row.scripts) as SkillVersion['scripts'],\n assets: safeParseJSON(row.assets) as SkillVersion['assets'],\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n tree: safeParseJSON(row.tree) as SkillVersion['tree'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type { WorkflowRunState, StepResult } from '@mastra/core/workflows';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { createExecuteWriteOperationWithRetry } from '../../db/utils';\n\nexport class WorkflowsLibSQL extends WorkflowsStorage {\n #db: LibSQLDB;\n #client: Client;\n private readonly executeWithRetry: <T>(operationFn: () => Promise<T>, operationDescription: string) => Promise<T>;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n const maxRetries = config.maxRetries ?? 5;\n const initialBackoffMs = config.initialBackoffMs ?? 500;\n\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries, initialBackoffMs });\n this.executeWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries,\n initialBackoffMs,\n });\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 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 this.logger.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\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_WORKFLOW_SNAPSHOT });\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 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 json(snapshot) as 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 // Upsert the snapshot within the same transaction\n const now = new Date().toISOString();\n await tx.execute({\n sql: `INSERT INTO ${TABLE_WORKFLOW_SNAPSHOT} (workflow_name, run_id, snapshot, createdAt, updatedAt)\n VALUES (?, ?, jsonb(?), ?, ?)\n ON CONFLICT(workflow_name, run_id)\n DO UPDATE SET snapshot = excluded.snapshot, updatedAt = excluded.updatedAt`,\n args: [workflowName, runId, JSON.stringify(snapshot), now, now],\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 }, 'updateWorkflowResults');\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\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 json(snapshot) as 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 = jsonb(?) 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 }, 'updateWorkflowState');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }) {\n const now = new Date();\n const data = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: createdAt ?? now,\n updatedAt: updatedAt ?? now,\n };\n\n this.logger.debug('Persisting workflow snapshot', { workflowName, runId, data });\n await this.#db.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.#db.select<{ 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 workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt 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 this.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 deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n return this.executeWithRetry(async () => {\n try {\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,\n args: [workflowName, runId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }, 'deleteWorkflowRunById');\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.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push('resourceId = ?');\n args.push(resourceId);\n } else {\n this.logger.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 workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt 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 => this.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 type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n WorkspacesStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n WORKSPACES_SCHEMA,\n WORKSPACE_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageWorkspaceType,\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n} from '@mastra/core/storage';\nimport type {\n WorkspaceVersion,\n CreateWorkspaceVersionInput,\n ListWorkspaceVersionsInput,\n ListWorkspaceVersionsOutput,\n} from '@mastra/core/storage/domains/workspaces';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\n/**\n * Config fields that live on version rows (from StorageWorkspaceSnapshotType).\n */\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'filesystem',\n 'sandbox',\n 'mounts',\n 'search',\n 'skills',\n 'tools',\n 'autoSync',\n 'operationTimeout',\n] as const;\n\nexport class WorkspacesLibSQL extends WorkspacesStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_WORKSPACES, schema: WORKSPACES_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_WORKSPACE_VERSIONS,\n schema: WORKSPACE_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (workspaceId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_versions_workspace_version ON \"${TABLE_WORKSPACE_VERSIONS}\" (\"workspaceId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_WORKSPACES });\n await this.#db.deleteData({ tableName: TABLE_WORKSPACE_VERSIONS });\n }\n\n // ==========================================================================\n // Workspace CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageWorkspaceType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACES)} FROM \"${TABLE_WORKSPACES}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseWorkspaceRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { workspace: StorageCreateWorkspaceInput }): Promise<StorageWorkspaceType> {\n const { workspace } = input;\n try {\n const now = new Date();\n\n // Insert thin workspace record\n await this.#db.insert({\n tableName: TABLE_WORKSPACES,\n record: {\n id: workspace.id,\n status: 'draft',\n activeVersionId: null,\n authorId: workspace.authorId ?? null,\n metadata: workspace.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n workspaceId: workspace.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned workspace record\n await this.#db.delete({ tableName: TABLE_WORKSPACES, keys: { id: workspace.id } });\n throw versionError;\n }\n\n return {\n id: workspace.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: workspace.authorId,\n metadata: workspace.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateWorkspaceInput): Promise<StorageWorkspaceType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_WORKSPACE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Workspace ${id} not found`,\n details: { workspaceId: id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Build update data for the workspace record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) {\n updateData.status = 'published';\n }\n }\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...(existing.metadata || {}), ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_WORKSPACES,\n keys: { id },\n data: updateData,\n });\n\n // If config fields changed, create a new version\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new Error(`No versions found for workspace ${id}`);\n }\n\n const {\n id: _versionId,\n workspaceId: _workspaceId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n workspaceId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Fetch and return updated workspace\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_WORKSPACE', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Workspace ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_WORKSPACES}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListWorkspacesInput): Promise<StorageListWorkspacesOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_WORKSPACES', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\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_WORKSPACES}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n workspaces: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_WORKSPACES)} FROM \"${TABLE_WORKSPACES}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const workspaces = result.rows?.map(row => this.#parseWorkspaceRow(row)) ?? [];\n\n return {\n workspaces,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_WORKSPACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Workspace Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n try {\n const now = new Date();\n await this.#client.execute({\n sql: `INSERT INTO \"${TABLE_WORKSPACE_VERSIONS}\" (\n id, \"workspaceId\", \"versionNumber\",\n name, description, filesystem, sandbox, mounts, search, skills, tools,\n \"autoSync\", \"operationTimeout\",\n \"changedFields\", \"changeMessage\", \"createdAt\"\n) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n input.id,\n input.workspaceId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.filesystem ? JSON.stringify(input.filesystem) : null,\n input.sandbox ? JSON.stringify(input.sandbox) : null,\n input.mounts ? JSON.stringify(input.mounts) : null,\n input.search ? JSON.stringify(input.search) : null,\n input.skills ? JSON.stringify(input.skills) : null,\n input.tools ? JSON.stringify(input.tools) : null,\n input.autoSync ? 1 : 0,\n input.operationTimeout ?? null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n now.toISOString(),\n ],\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<WorkspaceVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(workspaceId: string, versionNumber: number): Promise<WorkspaceVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ? AND \"versionNumber\" = ?`,\n args: [workspaceId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKSPACE_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(workspaceId: string): Promise<WorkspaceVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ? ORDER BY \"versionNumber\" DESC LIMIT 1`,\n args: [workspaceId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListWorkspaceVersionsInput): Promise<ListWorkspaceVersionsOutput> {\n try {\n const { workspaceId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ?`,\n args: [workspaceId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [workspaceId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKSPACE_VERSIONS_BY_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(workspaceId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ?`,\n args: [workspaceId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseWorkspaceRow(row: Record<string, unknown>): StorageWorkspaceType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StorageWorkspaceType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): WorkspaceVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n workspaceId: row.workspaceId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n filesystem: safeParseJSON(row.filesystem) as WorkspaceVersion['filesystem'],\n sandbox: safeParseJSON(row.sandbox) as WorkspaceVersion['sandbox'],\n mounts: safeParseJSON(row.mounts) as WorkspaceVersion['mounts'],\n search: safeParseJSON(row.search) as WorkspaceVersion['search'],\n skills: safeParseJSON(row.skills) as WorkspaceVersion['skills'],\n tools: safeParseJSON(row.tools) as WorkspaceVersion['tools'],\n autoSync: Boolean(row.autoSync),\n operationTimeout: row.operationTimeout != null ? Number(row.operationTimeout) : undefined,\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import { createClient } from '@libsql/client';\nimport type { Client } from '@libsql/client';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { MastraCompositeStore } from '@mastra/core/storage';\n\nimport { AgentsLibSQL } from './domains/agents';\nimport { BlobsLibSQL } from './domains/blobs';\nimport { DatasetsLibSQL } from './domains/datasets';\nimport { ExperimentsLibSQL } from './domains/experiments';\nimport { MCPClientsLibSQL } from './domains/mcp-clients';\nimport { MemoryLibSQL } from './domains/memory';\nimport { ObservabilityLibSQL } from './domains/observability';\nimport { PromptBlocksLibSQL } from './domains/prompt-blocks';\nimport { ScorerDefinitionsLibSQL } from './domains/scorer-definitions';\nimport { ScoresLibSQL } from './domains/scores';\nimport { SkillsLibSQL } from './domains/skills';\nimport { WorkflowsLibSQL } from './domains/workflows';\nimport { WorkspacesLibSQL } from './domains/workspaces';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsLibSQL,\n BlobsLibSQL,\n DatasetsLibSQL,\n ExperimentsLibSQL,\n MCPClientsLibSQL,\n MemoryLibSQL,\n ObservabilityLibSQL,\n PromptBlocksLibSQL,\n ScorerDefinitionsLibSQL,\n ScoresLibSQL,\n SkillsLibSQL,\n WorkflowsLibSQL,\n WorkspacesLibSQL,\n};\nexport type { LibSQLDomainConfig } from './db';\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\n/**\n * LibSQL/Turso storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new LibSQLStore({ id: 'my-store', url: 'file:./dev.db' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class LibSQLStore extends MastraCompositeStore {\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 domainConfig = {\n client: this.client,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n };\n\n const scores = new ScoresLibSQL(domainConfig);\n const workflows = new WorkflowsLibSQL(domainConfig);\n const memory = new MemoryLibSQL(domainConfig);\n const observability = new ObservabilityLibSQL(domainConfig);\n const agents = new AgentsLibSQL(domainConfig);\n const datasets = new DatasetsLibSQL(domainConfig);\n const experiments = new ExperimentsLibSQL(domainConfig);\n const promptBlocks = new PromptBlocksLibSQL(domainConfig);\n const scorerDefinitions = new ScorerDefinitionsLibSQL(domainConfig);\n const mcpClients = new MCPClientsLibSQL(domainConfig);\n const workspaces = new WorkspacesLibSQL(domainConfig);\n const skills = new SkillsLibSQL(domainConfig);\n const blobs = new BlobsLibSQL(domainConfig);\n\n this.stores = {\n scores,\n workflows,\n memory,\n observability,\n agents,\n datasets,\n experiments,\n promptBlocks,\n scorerDefinitions,\n mcpClients,\n workspaces,\n skills,\n blobs,\n };\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/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/mcp-servers/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/domains/workspaces/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","result","parseFieldKey","conditions","operator","operatorValue","MastraVector","createClient","validateTopK","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory","parseSqlIdentifier","error","validateUpsertInput","TABLE_SCHEMAS","buildCondition","safelyParseJSON","MastraBase","createStorageErrorId","getSqlType","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","AgentsStorage","TABLE_AGENTS","AGENTS_SCHEMA","TABLE_AGENT_VERSIONS","AGENT_VERSIONS_SCHEMA","normalizePerPage","calculatePagination","BlobStore","TABLE_SKILL_BLOBS","SKILL_BLOBS_SCHEMA","DatasetsStorage","TABLE_DATASETS","DATASETS_SCHEMA","TABLE_DATASET_ITEMS","DATASET_ITEMS_SCHEMA","TABLE_DATASET_VERSIONS","DATASET_VERSIONS_SCHEMA","ensureDate","TABLE_EXPERIMENT_RESULTS","TABLE_EXPERIMENTS","queryParams","whereClause","countResult","total","perPage","start","perPageForResponse","limitValue","end","ExperimentsStorage","EXPERIMENTS_SCHEMA","EXPERIMENT_RESULTS_SCHEMA","MCPClientsStorage","TABLE_MCP_CLIENTS","MCP_CLIENTS_SCHEMA","TABLE_MCP_CLIENT_VERSIONS","MCP_CLIENT_VERSIONS_SCHEMA","MCPServersStorage","TABLE_MCP_SERVERS","MCP_SERVERS_SCHEMA","TABLE_MCP_SERVER_VERSIONS","MCP_SERVER_VERSIONS_SCHEMA","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MessageList","randomUUID","ObservabilityStorage","SPAN_SCHEMA","listTracesArgsSchema","TraceStatus","toTraceSpans","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","PROMPT_BLOCKS_SCHEMA","TABLE_PROMPT_BLOCK_VERSIONS","PROMPT_BLOCK_VERSIONS_SCHEMA","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","SCORER_DEFINITIONS_SCHEMA","TABLE_SCORER_DEFINITION_VERSIONS","SCORER_DEFINITION_VERSIONS_SCHEMA","ScoresStorage","TABLE_SCORERS","SCORERS_SCHEMA","coreTransformScoreRow","saveScorePayloadSchema","SkillsStorage","TABLE_SKILLS","SKILLS_SCHEMA","TABLE_SKILL_VERSIONS","SKILL_VERSIONS_SCHEMA","WorkflowsStorage","SNAPSHOT_FIELDS","WorkspacesStorage","TABLE_WORKSPACES","WORKSPACES_SCHEMA","TABLE_WORKSPACE_VERSIONS","WORKSPACE_VERSIONS_SCHEMA","MastraCompositeStore"],"mappings":"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","file":"index.cjs","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, value: boolean) => {\n const jsonPath = getJsonPath(key);\n return {\n sql:\n value === false\n ? `json_extract(metadata, ${jsonPath}) IS NULL`\n : `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, validateUpsertInput, validateTopK } 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 /**\n * The URL of the LibSQL database.\n * Examples: 'file:./dev.db', 'file::memory:', 'libsql://your-db.turso.io'\n */\n url: 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 url,\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,\n syncUrl,\n authToken,\n syncInterval,\n });\n this.maxRetries = maxRetries;\n this.initialBackoffMs = initialBackoffMs;\n\n if (url.includes(`file:`) || url.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.code === 'SQLITE_LOCKED' ||\n error.code === 'SQLITE_LOCKED_SHAREDCACHE' ||\n (error.message && error.message.toLowerCase().includes('database is locked')) ||\n (error.message && error.message.toLowerCase().includes('database table 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 // Validate topK parameter - throws MastraError directly\n validateTopK('LIBSQL', topK);\n\n if (!Array.isArray(queryVector) || !queryVector.every(x => typeof x === 'number' && Number.isFinite(x))) {\n throw new MastraError({\n id: createVectorErrorId('LIBSQL', 'QUERY', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { message: 'queryVector must be an array of finite numbers' },\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 // Validate input parameters\n validateUpsertInput('LIBSQL', vectors, metadata, ids);\n\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 { InValue } from '@libsql/client';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { safelyParseJSON, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\n/**\n * Builds a SQL column list for SELECT statements, wrapping JSONB columns with json()\n * to convert binary JSONB to TEXT.\n *\n * The json() function handles both:\n * - Binary JSONB data (converts to TEXT)\n * - Legacy TEXT JSON data (returns as-is)\n *\n * Note: json_valid() was considered for guarding against malformed legacy TEXT,\n * but it doesn't work correctly with binary JSONB data (returns false for valid JSONB blobs).\n *\n * @param tableName - The table name to get the schema for\n * @returns A comma-separated column list with json() wrappers for JSONB columns\n */\nexport function buildSelectColumns(tableName: TABLE_NAMES): string {\n const schema = TABLE_SCHEMAS[tableName];\n return Object.keys(schema)\n .map(col => {\n const colDef = schema[col];\n const parsedCol = parseSqlIdentifier(col, 'column name');\n // Quote all column names to handle SQL reserved words (e.g. \"references\")\n return colDef?.type === 'jsonb' ? `json(\"${parsedCol}\") as \"${parsedCol}\"` : `\"${parsedCol}\"`;\n })\n .join(', ');\n}\n\n/**\n * Checks if an error is a SQLite lock/busy error that should be retried\n */\nexport function isLockError(error: any): boolean {\n return (\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}\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 attempts = 0;\n let backoff = initialBackoffMs;\n\n while (attempts < maxRetries) {\n try {\n return await operationFn();\n } catch (error: any) {\n logger.debug(`LibSQLStore: Error caught in retry loop for ${operationDescription}`, {\n errorType: error.constructor.name,\n errorCode: error.code,\n errorMessage: error.message,\n attempts,\n maxRetries,\n });\n\n if (isLockError(error)) {\n attempts++;\n if (attempts >= maxRetries) {\n logger.error(\n `LibSQLStore: Operation failed after ${maxRetries} attempts due to database lock: ${error.message}`,\n { error, attempts, maxRetries },\n );\n throw error;\n }\n logger.warn(\n `LibSQLStore: Attempt ${attempts} failed due to database lock during ${operationDescription}. Retrying in ${backoff}ms...`,\n { errorMessage: error.message, attempts, backoff, maxRetries },\n );\n await new Promise(resolve => setTimeout(resolve, backoff));\n backoff *= 2;\n } else {\n logger.error(`LibSQLStore: Non-lock error during ${operationDescription}, not retrying`, { error });\n throw error;\n }\n }\n }\n // TypeScript requires a return/throw here for type safety, but this is unreachable\n // because the loop always exits via return (success) or throw (error)\n throw new Error(`LibSQLStore: Unexpected exit from retry loop for ${operationDescription}`);\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 schema = TABLE_SCHEMAS[tableName];\n const columnNames = Object.keys(record);\n const columns = columnNames.map(col => parseSqlIdentifier(col, 'column name'));\n const values = columnNames.map(col => {\n const v = record[col];\n if (typeof v === `undefined` || v === null) {\n // returning an undefined value will cause libsql to throw\n return null;\n }\n // For jsonb columns, always JSON.stringify (even primitives need to be valid JSON)\n // Must check jsonb BEFORE Date, because JSON.stringify properly serializes Dates\n const colDef = schema[col];\n if (colDef?.type === 'jsonb') {\n return JSON.stringify(v);\n }\n if (v instanceof Date) {\n return v.toISOString();\n }\n return typeof v === 'object' ? JSON.stringify(v) : v;\n });\n const placeholders = columnNames\n .map(col => {\n const colDef = schema[col];\n return colDef?.type === 'jsonb' ? 'jsonb(?)' : '?';\n })\n .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 updateColumnNames = Object.keys(updates);\n const updateColumns = updateColumnNames.map(col => parseSqlIdentifier(col, 'column name'));\n const updateValues = updateColumnNames.map(col => {\n const colDef = schema[col];\n const v = updates[col];\n // For jsonb columns, always JSON.stringify (even primitives need to be valid JSON)\n if (colDef?.type === 'jsonb') {\n return transformToSqlValue(v, true);\n }\n return transformToSqlValue(v, false);\n });\n const setClause = updateColumns\n .map((col, i) => {\n const colDef = schema[updateColumnNames[i]!];\n return colDef?.type === 'jsonb' ? `${col} = jsonb(?)` : `${col} = ?`;\n })\n .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, forceJsonStringify: boolean = false): InValue {\n if (typeof value === 'undefined' || value === null) {\n return null;\n }\n // For jsonb columns, always JSON.stringify (even primitives need to be valid JSON)\n // Must check jsonb BEFORE Date, because JSON.stringify properly serializes Dates\n if (forceJsonStringify) {\n return JSON.stringify(value);\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\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 { createClient } from '@libsql/client';\nimport type { Client, InValue } from '@libsql/client';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n getSqlType,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n buildSelectColumns,\n createExecuteWriteOperationWithRetry,\n prepareDeleteStatement,\n prepareStatement,\n prepareUpdateStatement,\n} from './utils';\n\n/**\n * Base configuration options shared across LibSQL domain configurations\n */\nexport type LibSQLDomainBaseConfig = {\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/**\n * Configuration for LibSQL domains - accepts either credentials or an existing client\n */\nexport type LibSQLDomainConfig =\n | (LibSQLDomainBaseConfig & {\n /** The database connection URL (e.g., \"file:local.db\", \"libsql://...\", \"file::memory:\") */\n url: string;\n /** Optional authentication token for remote databases */\n authToken?: string;\n })\n | (LibSQLDomainBaseConfig & {\n /** An existing LibSQL client instance */\n client: Client;\n });\n\n/**\n * Resolves a LibSQLDomainConfig to a Client instance.\n * Creates a new client if credentials are provided, or returns the existing client.\n *\n * @param config - The domain configuration\n * @returns The resolved LibSQL client\n */\nexport function resolveClient(config: LibSQLDomainConfig): Client {\n if ('client' in config) {\n return config.client;\n }\n return createClient({\n url: config.url,\n ...(config.authToken ? { authToken: config.authToken } : {}),\n });\n}\n\nexport class LibSQLDB extends MastraBase {\n private client: Client;\n maxRetries: number;\n initialBackoffMs: number;\n executeWriteOperationWithRetry: <T>(operationFn: () => Promise<T>, operationDescription: string) => Promise<T>;\n\n constructor({\n client,\n maxRetries,\n initialBackoffMs,\n }: {\n client: Client;\n maxRetries?: number;\n initialBackoffMs?: number;\n }) {\n super({\n component: 'STORAGE',\n name: 'LIBSQL_DB_LAYER',\n });\n\n this.client = client;\n this.maxRetries = maxRetries ?? 5;\n this.initialBackoffMs = initialBackoffMs ?? 100;\n\n this.executeWriteOperationWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n });\n }\n\n /**\n * Checks if a column exists in the specified table.\n *\n * @param table - The name of the table to check\n * @param column - The name of the column to look for\n * @returns `true` if the column exists in the table, `false` otherwise\n */\n async hasColumn(table: string, column: string): Promise<boolean> {\n const sanitizedTable = parseSqlIdentifier(table, 'table name');\n const result = await this.client.execute({\n sql: `PRAGMA table_info(\"${sanitizedTable}\")`,\n });\n return result.rows?.some((row: any) => row.name === column);\n }\n\n /**\n * Internal insert implementation without retry logic.\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 /**\n * Inserts or replaces a record in the specified table with automatic retry on lock errors.\n *\n * @param args - The insert arguments\n * @param args.tableName - The name of the table to insert into\n * @param args.record - The record to insert (key-value pairs)\n */\n public insert(args: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doInsert(args), `insert into table ${args.tableName}`);\n }\n\n /**\n * Internal update implementation without retry logic.\n */\n private async doUpdate({\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 /**\n * Updates a record in the specified table with automatic retry on lock errors.\n *\n * @param args - The update arguments\n * @param args.tableName - The name of the table to update\n * @param args.keys - The key(s) identifying the record to update\n * @param args.data - The fields to update (key-value pairs)\n */\n public update(args: { tableName: TABLE_NAMES; keys: Record<string, any>; data: Record<string, any> }): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doUpdate(args), `update table ${args.tableName}`);\n }\n\n /**\n * Internal batch insert implementation without retry logic.\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 /**\n * Inserts multiple records in a single batch transaction with automatic retry on lock errors.\n *\n * @param args - The batch insert arguments\n * @param args.tableName - The name of the table to insert into\n * @param args.records - Array of records to insert\n * @throws {MastraError} When the batch insert fails after retries\n */\n public async batchInsert(args: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n return this.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 * Internal batch update implementation without retry logic.\n * Each record can be updated based on single or composite keys.\n */\n private async doBatchUpdate({\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 * Updates multiple records in a single batch transaction with automatic retry on lock errors.\n * Each record can be updated based on single or composite keys.\n *\n * @param args - The batch update arguments\n * @param args.tableName - The name of the table to update\n * @param args.updates - Array of update operations, each containing keys and data\n * @throws {MastraError} When the batch update fails after retries\n */\n public async batchUpdate(args: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n return this.executeWriteOperationWithRetry(\n () => this.doBatchUpdate(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 * Internal batch delete implementation without retry logic.\n * Each record can be deleted based on single or composite keys.\n */\n private async doBatchDelete({\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 * Deletes multiple records in a single batch transaction with automatic retry on lock errors.\n * Each record can be deleted based on single or composite keys.\n *\n * @param args - The batch delete arguments\n * @param args.tableName - The name of the table to delete from\n * @param args.keys - Array of key objects identifying records to delete\n * @throws {MastraError} When the batch delete fails after retries\n */\n public async batchDelete({\n tableName,\n keys,\n }: {\n tableName: TABLE_NAMES;\n keys: Array<Record<string, any>>;\n }): Promise<void> {\n return this.executeWriteOperationWithRetry(\n () => this.doBatchDelete({ 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 * Internal single-record delete implementation without retry logic.\n */\n private async doDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<void> {\n await this.client.execute(prepareDeleteStatement({ tableName, keys }));\n }\n\n /**\n * Deletes a single record from the specified table with automatic retry on lock errors.\n *\n * @param args - The delete arguments\n * @param args.tableName - The name of the table to delete from\n * @param args.keys - The key(s) identifying the record to delete\n * @throws {MastraError} When the delete fails after retries\n */\n public async delete(args: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<void> {\n return this.executeWriteOperationWithRetry(() => this.doDelete(args), `delete from table ${args.tableName}`).catch(\n error => {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE', '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 /**\n * Selects a single record from the specified table by key(s).\n * Returns the most recently created record if multiple matches exist.\n * Automatically parses JSON string values back to objects/arrays.\n *\n * @typeParam R - The expected return type of the record\n * @param args - The select arguments\n * @param args.tableName - The name of the table to select from\n * @param args.keys - The key(s) identifying the record to select\n * @returns The matching record or `null` if not found\n */\n async select<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const columns = buildSelectColumns(tableName);\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 ${columns} 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 /**\n * Selects multiple records from the specified table with optional filtering, ordering, and pagination.\n *\n * @typeParam R - The expected return type of each record\n * @param args - The select arguments\n * @param args.tableName - The name of the table to select from\n * @param args.whereClause - Optional WHERE clause with SQL string and arguments\n * @param args.orderBy - Optional ORDER BY clause (e.g., \"createdAt DESC\")\n * @param args.offset - Optional offset for pagination\n * @param args.limit - Optional limit for pagination\n * @param args.args - Optional additional query arguments\n * @returns Array of matching records\n */\n async selectMany<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 const columns = buildSelectColumns(tableName);\n\n let statement = `SELECT ${columns} 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 // Parse JSON columns (same as select())\n return (result.rows ?? []).map(row => {\n return 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 }) as R[];\n }\n\n /**\n * Returns the total count of records matching the optional WHERE clause.\n *\n * @param args - The count arguments\n * @param args.tableName - The name of the table to count from\n * @param args.whereClause - Optional WHERE clause with SQL string and arguments\n * @returns The total count of matching records\n */\n async selectTotalCount({\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 /**\n * Maps a storage column type to its SQLite equivalent.\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 'timestamp':\n return 'TEXT'; // Store timestamps as ISO strings in SQLite\n case 'float':\n return 'REAL'; // SQLite's floating point type\n case 'boolean':\n return 'INTEGER'; // SQLite uses 0/1 for booleans\n case 'jsonb':\n return 'TEXT'; // SQLite: column stores TEXT, we use jsonb()/json() functions for binary optimization\n default:\n return getSqlType(type); // text, integer, uuid all map correctly\n }\n }\n\n /**\n * Creates a table if it doesn't exist based on the provided schema.\n *\n * @param args - The create table arguments\n * @param args.tableName - The name of the table to create\n * @param args.schema - The schema definition for the table columns\n */\n async createTable({\n tableName,\n schema,\n compositePrimaryKey,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n compositePrimaryKey?: string[];\n }): Promise<void> {\n try {\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n\n // Validate composite PK columns exist in schema\n if (compositePrimaryKey) {\n for (const col of compositePrimaryKey) {\n if (!(col in schema)) {\n throw new Error(`compositePrimaryKey column \"${col}\" does not exist in schema for table \"${tableName}\"`);\n }\n }\n }\n\n const compositePKSet = compositePrimaryKey ? new Set(compositePrimaryKey) : null;\n\n // Build column definitions\n const columnDefinitions = Object.entries(schema).map(([colName, colDef]) => {\n const type = this.getSqlType(colDef.type);\n const nullable = colDef.nullable === false ? 'NOT NULL' : '';\n // Skip per-column PRIMARY KEY if column is part of composite PK\n const primaryKey = colDef.primaryKey && !compositePKSet?.has(colName) ? 'PRIMARY KEY' : '';\n return `\"${colName}\" ${type} ${nullable} ${primaryKey}`.trim();\n });\n\n // Add table-level constraints\n const tableConstraints: string[] = [];\n\n if (compositePrimaryKey) {\n const pkCols = compositePrimaryKey.map(c => `\"${c}\"`).join(', ');\n tableConstraints.push(`PRIMARY KEY (${pkCols})`);\n }\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n tableConstraints.push('UNIQUE (workflow_name, run_id)');\n }\n if (tableName === TABLE_SPANS) {\n tableConstraints.push('UNIQUE (spanId, traceId)');\n }\n\n const allDefinitions = [...columnDefinitions, ...tableConstraints].join(',\\n ');\n\n const sql = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (\\n ${allDefinitions}\\n)`;\n\n await this.client.execute(sql);\n this.logger.debug(`LibSQLDB: Created table ${tableName}`);\n\n // Run migrations for Spans table to add any new columns\n if (tableName === TABLE_SPANS) {\n await this.migrateSpansTable();\n }\n } catch (error) {\n // Rethrow MastraError (especially for migration required errors) - these must stop init\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Migrates the spans table schema from OLD_SPAN_SCHEMA to current SPAN_SCHEMA.\n * This adds new columns that don't exist in old schema and ensures required indexes exist.\n */\n private async migrateSpansTable(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_SPANS];\n\n try {\n // Add any columns from current schema that don't exist in the database\n for (const [columnName, columnDef] of Object.entries(schema)) {\n const columnExists = await this.hasColumn(TABLE_SPANS, columnName);\n if (!columnExists) {\n const sqlType = this.getSqlType(columnDef.type);\n // For new columns, use nullable (no default needed) since existing rows will have NULL\n const alterSql = `ALTER TABLE \"${TABLE_SPANS}\" ADD COLUMN \"${columnName}\" ${sqlType}`;\n await this.client.execute(alterSql);\n this.logger.debug(`LibSQLDB: Added column '${columnName}' to ${TABLE_SPANS}`);\n }\n }\n\n // Check if unique index already exists - if so, skip migration\n // This avoids running expensive queries on every init after migration is complete\n const indexExists = await this.spansUniqueIndexExists();\n if (!indexExists) {\n // Check for duplicates before attempting to create unique index\n const duplicateInfo = await this.checkForDuplicateSpans();\n if (duplicateInfo.hasDuplicates) {\n // Duplicates exist - throw error requiring manual migration\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: Duplicate spans detected in ${TABLE_SPANS}\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations.\\n` +\n `\\n` +\n `The spans table requires a unique constraint on (traceId, spanId), but your\\n` +\n `database contains duplicate entries that must be resolved first.\\n` +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Remove duplicate spans (keeping the most complete/recent version)\\n` +\n ` 2. Add the required unique constraint\\n` +\n `\\n` +\n `Note: This migration may take some time for large tables.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'MIGRATION_REQUIRED', 'DUPLICATE_SPANS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n } else {\n // No duplicates - safe to create unique index directly\n await this.client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS \"mastra_ai_spans_spanid_traceid_idx\" ON \"${TABLE_SPANS}\" (\"spanId\", \"traceId\")`,\n );\n this.logger.debug(`LibSQLDB: Created unique index on (spanId, traceId) for ${TABLE_SPANS}`);\n }\n }\n\n this.logger.info(`LibSQLDB: Migration completed for ${TABLE_SPANS}`);\n } catch (error) {\n // Rethrow MastraError (especially for migration required errors) - these must stop init\n if (error instanceof MastraError) {\n throw error;\n }\n // Log warning but don't fail for other errors - schema migrations should be best-effort\n this.logger.warn(`LibSQLDB: Failed to migrate spans table ${TABLE_SPANS}:`, error);\n }\n }\n\n /**\n * Checks if the unique index on (spanId, traceId) already exists on the spans table.\n * Used to skip deduplication when the index already exists (migration already complete).\n */\n private async spansUniqueIndexExists(): Promise<boolean> {\n try {\n const result = await this.client.execute(\n `SELECT 1 FROM sqlite_master WHERE type = 'index' AND name = 'mastra_ai_spans_spanid_traceid_idx'`,\n );\n return (result.rows?.length ?? 0) > 0;\n } catch {\n // If we can't check indexes (e.g., table doesn't exist), assume index doesn't exist\n return false;\n }\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n private async checkForDuplicateSpans(): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n }> {\n try {\n const result = await this.client.execute(`\n SELECT COUNT(*) as duplicate_count FROM (\n SELECT \"spanId\", \"traceId\"\n FROM \"${TABLE_SPANS}\"\n GROUP BY \"spanId\", \"traceId\"\n HAVING COUNT(*) > 1\n )\n `);\n\n const duplicateCount = Number(result.rows?.[0]?.duplicate_count ?? 0);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger.debug(`LibSQLDB: Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0 };\n }\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n // Check if already migrated\n const indexExists = await this.spansUniqueIndexExists();\n if (indexExists) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. Unique index exists on ${TABLE_SPANS}.`,\n };\n }\n\n // Check for duplicates\n const duplicateInfo = await this.checkForDuplicateSpans();\n\n if (duplicateInfo.hasDuplicates) {\n this.logger.info(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting deduplication...`,\n );\n\n // Run deduplication\n await this.deduplicateSpans();\n } else {\n this.logger.info(`No duplicate spans found.`);\n }\n\n // Add unique index\n await this.client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS \"mastra_ai_spans_spanid_traceid_idx\" ON \"${TABLE_SPANS}\" (\"spanId\", \"traceId\")`,\n );\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and added unique index to ${TABLE_SPANS}.`\n : `Migration complete. Added unique index to ${TABLE_SPANS}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const indexExists = await this.spansUniqueIndexExists();\n\n if (indexExists) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: TABLE_SPANS,\n };\n }\n\n const duplicateInfo = await this.checkForDuplicateSpans();\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: TABLE_SPANS,\n };\n }\n\n /**\n * Deduplicates spans table by removing duplicate (spanId, traceId) combinations.\n * Keeps the \"best\" record for each duplicate group based on:\n * 1. Completed spans (endedAt IS NOT NULL) over incomplete ones\n * 2. Most recently updated (updatedAt DESC)\n * 3. Most recently created (createdAt DESC) as tiebreaker\n */\n private async deduplicateSpans(): Promise<void> {\n try {\n // Check if there are any duplicates first\n const duplicateCheck = await this.client.execute(`\n SELECT COUNT(*) as duplicate_count FROM (\n SELECT \"spanId\", \"traceId\"\n FROM \"${TABLE_SPANS}\"\n GROUP BY \"spanId\", \"traceId\"\n HAVING COUNT(*) > 1\n )\n `);\n\n const duplicateCount = Number(duplicateCheck.rows?.[0]?.duplicate_count ?? 0);\n if (duplicateCount === 0) {\n this.logger.debug(`LibSQLDB: No duplicate spans found, skipping deduplication`);\n return;\n }\n\n this.logger.warn(`LibSQLDB: Found ${duplicateCount} duplicate (spanId, traceId) combinations, deduplicating...`);\n\n // Delete duplicate spans, keeping the \"best\" record for each (spanId, traceId) pair.\n // Priority: completed spans > most recently updated > most recently created\n // Uses rowid for SQLite's internal row identifier to delete specific rows\n const deleteResult = await this.client.execute(`\n DELETE FROM \"${TABLE_SPANS}\"\n WHERE rowid NOT IN (\n SELECT MIN(best_rowid) FROM (\n SELECT\n rowid as best_rowid,\n \"spanId\",\n \"traceId\",\n ROW_NUMBER() OVER (\n PARTITION BY \"spanId\", \"traceId\"\n ORDER BY\n CASE WHEN \"endedAt\" IS NOT NULL THEN 0 ELSE 1 END,\n \"updatedAt\" DESC,\n \"createdAt\" DESC\n ) as rn\n FROM \"${TABLE_SPANS}\"\n ) ranked\n WHERE rn = 1\n GROUP BY \"spanId\", \"traceId\"\n )\n AND (\"spanId\", \"traceId\") IN (\n SELECT \"spanId\", \"traceId\"\n FROM \"${TABLE_SPANS}\"\n GROUP BY \"spanId\", \"traceId\"\n HAVING COUNT(*) > 1\n )\n `);\n\n const deletedCount = deleteResult.rowsAffected ?? 0;\n this.logger.warn(`LibSQLDB: Deleted ${deletedCount} duplicate span records`);\n } catch (error) {\n // Log but continue - deduplication should be best-effort\n this.logger.warn(`LibSQLDB: Failed to deduplicate spans:`, error);\n }\n }\n\n /**\n * Gets a default value for a column type (used when adding NOT NULL columns).\n */\n private getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n case 'uuid':\n return \"DEFAULT ''\";\n case 'integer':\n case 'bigint':\n case 'float':\n return 'DEFAULT 0';\n case 'boolean':\n return 'DEFAULT 0';\n case 'jsonb':\n return \"DEFAULT '{}'\";\n case 'timestamp':\n return 'DEFAULT CURRENT_TIMESTAMP';\n default:\n return \"DEFAULT ''\";\n }\n }\n\n /**\n * Alters an existing table to add missing columns.\n * Used for schema migrations when new columns are added.\n *\n * @param args - The alter table arguments\n * @param args.tableName - The name of the table to alter\n * @param args.schema - The full schema definition for the table\n * @param args.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 // Get existing columns\n const tableInfo = await this.client.execute({\n sql: `PRAGMA table_info(\"${parsedTableName}\")`,\n });\n const existingColumns = new Set((tableInfo.rows || []).map((row: any) => row.name?.toLowerCase()));\n\n // Add missing columns\n for (const columnName of ifNotExists) {\n if (!existingColumns.has(columnName.toLowerCase()) && schema[columnName]) {\n const columnDef = schema[columnName];\n const sqlType = this.getSqlType(columnDef.type);\n // SQLite requires constant defaults for ALTER TABLE ADD COLUMN.\n // Nullable columns use DEFAULT NULL; non-nullable use the type's default.\n const defaultValue = columnDef.nullable ? 'DEFAULT NULL' : this.getDefaultValue(columnDef.type);\n\n // SQLite doesn't support ADD COLUMN IF NOT EXISTS, but we checked above\n const alterSql = `ALTER TABLE ${parsedTableName} ADD COLUMN \"${columnName}\" ${sqlType} ${defaultValue}`;\n await this.client.execute(alterSql);\n this.logger.debug(`LibSQLDB: Added column ${columnName} to table ${tableName}`);\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: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes all records from the specified table.\n * Errors are logged but not thrown.\n *\n * @param args - The delete arguments\n * @param args.tableName - The name of the table to clear\n */\n async deleteData({ 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","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n AGENTS_SCHEMA,\n AGENT_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageAgentType,\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n AgentVersion,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class AgentsLibSQL extends AgentsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n // Migrate from legacy schemas before creating tables\n await this.#migrateFromLegacySchema();\n await this.#migrateVersionsSchema();\n\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n // Add new columns for backwards compatibility with intermediate schema versions\n await this.#db.alterTable({\n tableName: TABLE_AGENTS,\n schema: AGENTS_SCHEMA,\n ifNotExists: ['status', 'authorId'],\n });\n await this.#db.alterTable({\n tableName: TABLE_AGENT_VERSIONS,\n schema: AGENT_VERSIONS_SCHEMA,\n ifNotExists: ['mcpClients', 'requestContextSchema', 'workspace', 'skills', 'skillsFormat'],\n });\n\n // Migrate tools field from string[] to JSONB format\n await this.#migrateToolsToJsonbFormat();\n\n // Clean up any stale draft records from previously failed createAgent calls\n await this.#cleanupStaleDrafts();\n }\n\n /**\n * Migrates from the legacy flat agent schema (where config fields like name, instructions, model\n * were stored directly on mastra_agents) to the new versioned schema (thin agent record + versions table).\n * SQLite cannot drop columns or alter NOT NULL constraints, so we must recreate the table.\n */\n async #migrateFromLegacySchema(): Promise<void> {\n const legacyTable = `${TABLE_AGENTS}_legacy`;\n const hasLegacyColumns = await this.#db.hasColumn(TABLE_AGENTS, 'name');\n\n if (hasLegacyColumns) {\n // Current table has legacy schema — rename it and drop old versions table\n await this.#client.execute({\n sql: `ALTER TABLE \"${TABLE_AGENTS}\" RENAME TO \"${legacyTable}\"`,\n });\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${TABLE_AGENT_VERSIONS}\"`,\n });\n }\n\n // Check if legacy table exists (either just renamed, or left behind by a previous partial migration)\n const legacyExists = await this.#db.hasColumn(legacyTable, 'name');\n if (!legacyExists) return;\n\n // Read all existing agents from the legacy table\n const result = await this.#client.execute({\n sql: `SELECT * FROM \"${legacyTable}\"`,\n });\n const oldAgents = result.rows || [];\n\n // Create new tables (CREATE TABLE IF NOT EXISTS handles idempotency on resume)\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n\n // INSERT OR REPLACE (used by #db.insert) is safe for resumed partial migrations\n for (const row of oldAgents) {\n const agentId = row.id as string;\n if (!agentId) continue;\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n\n await this.#db.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agentId,\n status: 'published',\n activeVersionId: versionId,\n authorId: (row.ownerId as string) ?? (row.authorId as string) ?? null,\n metadata: row.metadata ?? null,\n createdAt: row.createdAt ?? now,\n updatedAt: row.updatedAt ?? now,\n },\n });\n\n await this.#db.insert({\n tableName: TABLE_AGENT_VERSIONS,\n record: {\n id: versionId,\n agentId,\n versionNumber: 1,\n name: (row.name as string) ?? agentId,\n description: row.description ?? null,\n instructions: this.serializeInstructions((row.instructions as string) ?? ''),\n model: row.model ?? '{}',\n tools: row.tools ?? null,\n defaultOptions: row.defaultOptions ?? null,\n workflows: row.workflows ?? null,\n agents: row.agents ?? null,\n integrationTools: row.integrationTools ?? null,\n inputProcessors: row.inputProcessors ?? null,\n outputProcessors: row.outputProcessors ?? null,\n memory: row.memory ?? null,\n scorers: row.scorers ?? null,\n changedFields: null,\n changeMessage: 'Migrated from legacy schema',\n createdAt: row.createdAt ?? now,\n },\n });\n }\n\n // Drop legacy table only after all inserts succeed\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${legacyTable}\"`,\n });\n }\n\n /**\n * Migrates the agent_versions table from the old snapshot-based schema (single `snapshot` JSON column)\n * to the new flat schema (individual config columns). This handles the case where the agents table\n * was already migrated but the versions table still has the old schema.\n */\n async #migrateVersionsSchema(): Promise<void> {\n const hasSnapshotColumn = await this.#db.hasColumn(TABLE_AGENT_VERSIONS, 'snapshot');\n if (!hasSnapshotColumn) return;\n\n // Drop the old versions table - the new schema will be created by init()\n // Any existing version data in snapshot format is not preserved since\n // the snapshot schema predates the stable versioning system\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${TABLE_AGENT_VERSIONS}\"`,\n });\n\n // Also clean up any lingering legacy table from a partial migration\n await this.#client.execute({\n sql: `DROP TABLE IF EXISTS \"${TABLE_AGENTS}_legacy\"`,\n });\n }\n\n /**\n * Removes stale draft agent records that have no activeVersionId.\n * These are left behind when createAgent partially fails (inserts thin record\n * but fails to create the version due to schema mismatch).\n */\n async #cleanupStaleDrafts(): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_AGENTS}\" WHERE status = 'draft' AND activeVersionId IS NULL`,\n });\n } catch {\n // Non-critical cleanup, ignore errors\n }\n }\n\n /**\n * Migrates the tools field from string[] format to JSONB format { \"tool-key\": { \"description\": \"...\" } }.\n * This handles the transition from the old format where tools were stored as an array of string keys\n * to the new format where tools can have per-agent description overrides.\n */\n async #migrateToolsToJsonbFormat(): Promise<void> {\n try {\n // Check if any records have tools stored as a JSON array\n const result = await this.#client.execute({\n sql: `SELECT id, tools FROM \"${TABLE_AGENT_VERSIONS}\" WHERE tools IS NOT NULL`,\n });\n\n if (!result.rows || result.rows.length === 0) {\n return; // No records to migrate\n }\n\n for (const row of result.rows) {\n const toolsValue = row.tools;\n\n // Parse the JSON value\n let parsedTools: any;\n try {\n if (typeof toolsValue === 'string') {\n parsedTools = JSON.parse(toolsValue);\n } else if (toolsValue instanceof ArrayBuffer) {\n const decoder = new TextDecoder();\n parsedTools = JSON.parse(decoder.decode(toolsValue));\n } else {\n parsedTools = toolsValue;\n }\n } catch {\n continue; // Skip invalid JSON\n }\n\n // Check if tools is an array (needs migration)\n if (Array.isArray(parsedTools)) {\n const toolsObject: Record<string, { description?: string }> = {};\n\n // Convert each tool string to an object key with empty config\n for (const toolKey of parsedTools) {\n if (typeof toolKey === 'string') {\n toolsObject[toolKey] = {};\n }\n }\n\n // Update the record with the new format\n await this.#client.execute({\n sql: `UPDATE \"${TABLE_AGENT_VERSIONS}\" SET tools = ? WHERE id = ?`,\n args: [JSON.stringify(toolsObject), row.id as string],\n });\n }\n }\n\n this.logger?.info?.(`Migrated agent version tools from array to object format`);\n } catch (error) {\n // Log but don't fail - this is a non-breaking migration\n this.logger?.warn?.('Failed to migrate tools to JSONB format:', error);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_AGENT_VERSIONS });\n await this.#db.deleteData({ tableName: TABLE_AGENTS });\n }\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n\n // Handle ArrayBuffer case (binary JSONB data from LibSQL)\n if (value instanceof ArrayBuffer || (value && value.constructor && value.constructor.name === 'ArrayBuffer')) {\n try {\n const decoder = new TextDecoder();\n const jsonString = decoder.decode(value);\n return JSON.parse(jsonString);\n } catch (error) {\n console.error(`Failed to parse ArrayBuffer for ${fieldName}:`, error);\n return undefined;\n }\n }\n\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseRow(row: any): StorageAgentType {\n return {\n id: row.id as string,\n status: row.status as 'draft' | 'published' | 'archived',\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const result = await this.#db.select<Record<string, any>>({\n tableName: TABLE_AGENTS,\n keys: { id },\n });\n\n return result ? this.parseRow(result) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_AGENT_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n const { agent } = input;\n try {\n const now = new Date();\n\n // 1. Create thin agent record with status='draft'\n await this.#db.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agent.id,\n status: 'draft',\n activeVersionId: null,\n authorId: agent.authorId ?? null,\n metadata: agent.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n });\n\n // 2. Extract config fields from the flat input\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n // Create version 1 from the config\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n agentId: agent.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n // 3. Return the thin agent record (activeVersionId remains null, status remains 'draft')\n const created = await this.getById(agent.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'CREATE_AGENT', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${agent.id} not found after creation`,\n details: { agentId: agent.id },\n });\n }\n\n return created;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: agent.id },\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_AGENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Agent ${id} not found`,\n details: { agentId: id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the agent record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_AGENTS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated agent\n const updatedAgent = await this.getById(id);\n if (!updatedAgent) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${id} not found after update`,\n details: { agentId: id },\n });\n }\n\n return updatedAgent;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n // Delete all versions for this agent first\n await this.deleteVersionsByParentId(id);\n\n // Then delete the agent\n await this.#db.delete({\n tableName: TABLE_AGENTS,\n keys: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_AGENTS', '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\n try {\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (status) {\n conditions.push('status = ?');\n queryParams.push(status);\n }\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_AGENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\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_AGENTS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n agents: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_AGENTS)} FROM \"${TABLE_AGENTS}\" ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, offset],\n });\n\n const rows = result.rows ?? [];\n\n const agents = rows.map(row => this.parseRow(row));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_AGENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Agent Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n try {\n const now = new Date();\n\n await this.#db.insert({\n tableName: TABLE_AGENT_VERSIONS,\n record: {\n id: input.id,\n agentId: input.agentId,\n versionNumber: input.versionNumber,\n name: input.name ?? null,\n description: input.description ?? null,\n instructions: this.serializeInstructions(input.instructions),\n model: input.model,\n tools: input.tools ?? null,\n defaultOptions: input.defaultOptions ?? null,\n workflows: input.workflows ?? null,\n agents: input.agents ?? null,\n integrationTools: input.integrationTools ?? null,\n inputProcessors: input.inputProcessors ?? null,\n outputProcessors: input.outputProcessors ?? null,\n memory: input.memory ?? null,\n scorers: input.scorers ?? null,\n mcpClients: input.mcpClients ?? null,\n requestContextSchema: input.requestContextSchema ?? null,\n workspace: input.workspace ?? null,\n skills: input.skills ?? null,\n skillsFormat: input.skillsFormat ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, agentId: input.agentId },\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<AgentVersion | null> {\n try {\n const result = await this.#db.select<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n keys: { id },\n });\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n try {\n const rows = await this.#db.selectMany<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ? AND versionNumber = ?',\n args: [agentId, versionNumber],\n },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return this.parseVersionRow(rows[0]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId, versionNumber },\n },\n error,\n );\n }\n }\n\n async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n try {\n const rows = await this.#db.selectMany<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n orderBy: 'versionNumber DESC',\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return this.parseVersionRow(rows[0]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_VERSIONS', '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, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const total = await this.#db.selectTotalCount({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n });\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const rows = await this.#db.selectMany<Record<string, any>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n orderBy: `\"${field}\" ${direction}`,\n limit: limitValue,\n offset,\n });\n\n const versions = rows.map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#db.delete({\n tableName: TABLE_AGENT_VERSIONS,\n keys: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n // Get all version IDs for this agent\n const versions = await this.#db.selectMany<{ id: string }>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [entityId],\n },\n });\n\n // Delete each version individually\n for (const version of versions) {\n await this.#db.delete({\n tableName: TABLE_AGENT_VERSIONS,\n keys: { id: version.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_VERSIONS_BY_AGENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(agentId: string): Promise<number> {\n try {\n const count = await this.#db.selectTotalCount({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: 'WHERE agentId = ?',\n args: [agentId],\n },\n });\n return count;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private serializeInstructions(instructions: string | AgentInstructionBlock[]): string {\n return Array.isArray(instructions) ? JSON.stringify(instructions) : instructions;\n }\n\n private deserializeInstructions(raw: string): string | AgentInstructionBlock[] {\n if (!raw) return raw;\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n } catch {\n // Not JSON — plain string\n }\n return raw;\n }\n\n private parseVersionRow(row: any): AgentVersion {\n return {\n id: row.id as string,\n agentId: row.agentId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n instructions: this.deserializeInstructions(row.instructions as string),\n model: this.parseJson(row.model, 'model'),\n tools: this.parseJson(row.tools, 'tools'),\n defaultOptions: this.parseJson(row.defaultOptions, 'defaultOptions'),\n workflows: this.parseJson(row.workflows, 'workflows'),\n agents: this.parseJson(row.agents, 'agents'),\n integrationTools: this.parseJson(row.integrationTools, 'integrationTools'),\n inputProcessors: this.parseJson(row.inputProcessors, 'inputProcessors'),\n outputProcessors: this.parseJson(row.outputProcessors, 'outputProcessors'),\n memory: this.parseJson(row.memory, 'memory'),\n scorers: this.parseJson(row.scorers, 'scorers'),\n mcpClients: this.parseJson(row.mcpClients, 'mcpClients'),\n requestContextSchema: this.parseJson(row.requestContextSchema, 'requestContextSchema'),\n workspace: this.parseJson(row.workspace, 'workspace'),\n skills: this.parseJson(row.skills, 'skills'),\n skillsFormat: row.skillsFormat as 'xml' | 'json' | 'markdown' | undefined,\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client } from '@libsql/client';\nimport { BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\n\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class BlobsLibSQL extends BlobStore {\n #db: LibSQLDB;\n #client: Client;\n\n static readonly MANAGED_TABLES = [TABLE_SKILL_BLOBS] as const;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SKILL_BLOBS, schema: SKILL_BLOBS_SCHEMA });\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n const now = entry.createdAt ?? new Date();\n await this.#client.execute({\n sql: `INSERT OR IGNORE INTO \"${TABLE_SKILL_BLOBS}\" (\"hash\", \"content\", \"size\", \"mimeType\", \"createdAt\") VALUES (?, ?, ?, ?, ?)`,\n args: [entry.hash, entry.content, entry.size, entry.mimeType ?? null, now.toISOString()],\n });\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_BLOBS)} FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" = ?`,\n args: [hash],\n });\n if (!result.rows.length) return null;\n return this.#parseRow(result.rows[0]!);\n }\n\n async has(hash: string): Promise<boolean> {\n const result = await this.#client.execute({\n sql: `SELECT 1 FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" = ? LIMIT 1`,\n args: [hash],\n });\n return result.rows.length > 0;\n }\n\n async delete(hash: string): Promise<boolean> {\n const result = await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" = ?`,\n args: [hash],\n });\n return result.rowsAffected > 0;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n await this.#db.batchInsert({\n tableName: TABLE_SKILL_BLOBS,\n records: entries.map(entry => ({\n hash: entry.hash,\n content: entry.content,\n size: entry.size,\n mimeType: entry.mimeType ?? null,\n createdAt: (entry.createdAt ?? new Date()).toISOString(),\n })),\n });\n }\n\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n\n // SQLite has a limit on the number of parameters, batch in groups of 500\n const batchSize = 500;\n for (let i = 0; i < hashes.length; i += batchSize) {\n const batch = hashes.slice(i, i + batchSize);\n const placeholders = batch.map(() => '?').join(', ');\n const queryResult = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_BLOBS)} FROM \"${TABLE_SKILL_BLOBS}\" WHERE \"hash\" IN (${placeholders})`,\n args: batch,\n });\n for (const row of queryResult.rows) {\n const entry = this.#parseRow(row);\n result.set(entry.hash, entry);\n }\n }\n return result;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SKILL_BLOBS });\n }\n\n #parseRow(row: Record<string, unknown>): StorageBlobEntry {\n return {\n hash: row.hash as string,\n content: row.content as string,\n size: Number(row.size),\n mimeType: (row.mimeType as string) || undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n DATASETS_SCHEMA,\n DATASET_ITEMS_SCHEMA,\n DATASET_VERSIONS_SCHEMA,\n DatasetsStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\n/** Serialize a value for a jsonb column. Returns null for null/undefined. */\nfunction jsonbArg(value: unknown): string | null {\n return value === undefined || value === null ? null : JSON.stringify(value);\n}\n\nexport class DatasetsLibSQL extends DatasetsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n // T3.23 — NO item_versions table\n await this.#db.createTable({ tableName: TABLE_DATASETS, schema: DATASETS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_DATASET_ITEMS, schema: DATASET_ITEMS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: DATASET_VERSIONS_SCHEMA });\n\n // T3.24 — SCD-2 indexes on dataset_items\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_validto ON \"${TABLE_DATASET_ITEMS}\" (\"datasetId\", \"validTo\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_version ON \"${TABLE_DATASET_ITEMS}\" (\"datasetId\", \"datasetVersion\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_validto_deleted ON \"${TABLE_DATASET_ITEMS}\" (\"datasetId\", \"validTo\", \"isDeleted\")`,\n args: [],\n });\n\n // T3.25 — indexes on dataset_versions\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_dataset_versions_dataset_version ON \"${TABLE_DATASET_VERSIONS}\" (\"datasetId\", \"version\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_dataset_versions_dataset_version_unique ON \"${TABLE_DATASET_VERSIONS}\" (\"datasetId\", \"version\")`,\n args: [],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_DATASET_VERSIONS });\n await this.#db.deleteData({ tableName: TABLE_DATASET_ITEMS });\n await this.#db.deleteData({ tableName: TABLE_DATASETS });\n }\n\n // --- Row transformers ---\n\n private transformDatasetRow(row: Record<string, any>): DatasetRecord {\n return {\n id: row.id as string,\n name: row.name as string,\n description: row.description as string | undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n inputSchema: row.inputSchema ? safelyParseJSON(row.inputSchema) : undefined,\n groundTruthSchema: row.groundTruthSchema ? safelyParseJSON(row.groundTruthSchema) : undefined,\n version: row.version as number,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n };\n }\n\n private transformItemRow(row: Record<string, any>): DatasetItem {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n input: safelyParseJSON(row.input),\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n };\n }\n\n private transformItemRowFull(row: Record<string, any>): DatasetItemRow {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n validTo: row.validTo as number | null,\n isDeleted: Boolean(row.isDeleted),\n input: safelyParseJSON(row.input),\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n };\n }\n\n private transformDatasetVersionRow(row: Record<string, any>): DatasetVersion {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n version: row.version as number,\n createdAt: ensureDate(row.createdAt)!,\n };\n }\n\n // --- Dataset CRUD ---\n\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_DATASETS,\n record: {\n id,\n name: input.name,\n description: input.description ?? null,\n metadata: input.metadata,\n inputSchema: input.inputSchema ?? null,\n groundTruthSchema: input.groundTruthSchema ?? null,\n version: 0,\n createdAt: nowIso,\n updatedAt: nowIso,\n },\n });\n\n return {\n id,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n inputSchema: input.inputSchema ?? undefined,\n groundTruthSchema: input.groundTruthSchema ?? undefined,\n version: 0,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getDatasetById({ id }: { id: string }): Promise<DatasetRecord | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASETS)} FROM ${TABLE_DATASETS} WHERE id = ?`,\n args: [id],\n });\n return result.rows?.[0] ? this.transformDatasetRow(result.rows[0]) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n try {\n const existing = await this.getDatasetById({ id: args.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_DATASET', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.id },\n });\n }\n\n const now = new Date().toISOString();\n const updates: string[] = ['updatedAt = ?'];\n const values: InValue[] = [now];\n\n if (args.name !== undefined) {\n updates.push('name = ?');\n values.push(args.name);\n }\n if (args.description !== undefined) {\n updates.push('description = ?');\n values.push(args.description);\n }\n if (args.metadata !== undefined) {\n updates.push('metadata = ?');\n values.push(JSON.stringify(args.metadata));\n }\n if (args.inputSchema !== undefined) {\n updates.push('inputSchema = ?');\n values.push(args.inputSchema === null ? null : JSON.stringify(args.inputSchema));\n }\n if (args.groundTruthSchema !== undefined) {\n updates.push('groundTruthSchema = ?');\n values.push(args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema));\n }\n\n values.push(args.id);\n\n await this.#client.execute({\n sql: `UPDATE ${TABLE_DATASETS} SET ${updates.join(', ')} WHERE id = ?`,\n args: values,\n });\n\n return {\n ...existing,\n name: args.name ?? existing.name,\n description: args.description ?? existing.description,\n metadata: args.metadata ?? existing.metadata,\n inputSchema: (args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema) ?? undefined,\n groundTruthSchema:\n (args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema) ?? undefined,\n updatedAt: new Date(now),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteDataset({ id }: { id: string }): Promise<void> {\n try {\n // F3 fix: detach experiments (SET NULL) instead of deleting. Delete results for FK safety.\n // Each operation wrapped separately — experiment_results table may not exist even if experiments does.\n try {\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENT_RESULTS} WHERE experimentId IN (SELECT id FROM ${TABLE_EXPERIMENTS} WHERE datasetId = ?)`,\n args: [id],\n });\n } catch {\n // experiment_results table may not exist\n }\n try {\n await this.#client.execute({\n sql: `UPDATE ${TABLE_EXPERIMENTS} SET datasetId = NULL, datasetVersion = NULL WHERE datasetId = ?`,\n args: [id],\n });\n } catch {\n // experiments table may not exist\n }\n\n // Dataset cascade — atomic batch (T3.18)\n await this.#client.batch(\n [\n { sql: `DELETE FROM ${TABLE_DATASET_VERSIONS} WHERE datasetId = ?`, args: [id] },\n { sql: `DELETE FROM ${TABLE_DATASET_ITEMS} WHERE datasetId = ?`, args: [id] },\n { sql: `DELETE FROM ${TABLE_DATASETS} WHERE id = ?`, args: [id] },\n ],\n 'write',\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASETS}`,\n args: [],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n datasets: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASETS)} FROM ${TABLE_DATASETS} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [limitValue, start],\n });\n\n return {\n datasets: result.rows?.map(row => this.transformDatasetRow(row)) ?? [],\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_DATASETS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- SCD-2 item mutations ---\n\n protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n try {\n const id = crypto.randomUUID();\n const versionId = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n // T3.7, T3.21 — atomic batch: bump version, insert item, insert dataset_version\n const results = await this.#client.batch(\n [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [args.datasetId],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n id,\n args.datasetId,\n args.datasetId,\n jsonbArg(args.input)!,\n jsonbArg(args.groundTruth),\n jsonbArg(args.metadata),\n nowIso,\n nowIso,\n ],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, args.datasetId, args.datasetId, nowIso],\n },\n ],\n 'write',\n );\n\n const newVersion = Number(results[0]!.rows[0]!.version);\n\n return {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n input: args.input,\n groundTruth: args.groundTruth,\n metadata: args.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'ADD_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n try {\n // Verify item exists and belongs to dataset\n const existing = await this.getItemById({ id: args.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_ITEM', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: args.id },\n });\n }\n if (existing.datasetId !== args.datasetId) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: args.id, expectedDatasetId: args.datasetId, actualDatasetId: existing.datasetId },\n });\n }\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n // Merge fields\n const mergedInput = args.input ?? existing.input;\n const mergedGroundTruth = args.groundTruth ?? existing.groundTruth;\n const mergedMetadata = args.metadata ?? existing.metadata;\n\n // T3.8, T3.21 — atomic batch: bump version, close old row, insert new row, insert dataset_version\n const results = await this.#client.batch(\n [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [args.datasetId],\n },\n {\n sql: `UPDATE ${TABLE_DATASET_ITEMS} SET validTo = (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?) WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [args.datasetId, args.id],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n args.id,\n args.datasetId,\n args.datasetId,\n jsonbArg(mergedInput)!,\n jsonbArg(mergedGroundTruth),\n jsonbArg(mergedMetadata),\n existing.createdAt.toISOString(),\n nowIso,\n ],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, args.datasetId, args.datasetId, nowIso],\n },\n ],\n 'write',\n );\n\n const newVersion = Number(results[0]!.rows[0]!.version);\n\n return {\n ...existing,\n datasetVersion: newVersion,\n input: mergedInput,\n groundTruth: mergedGroundTruth,\n metadata: mergedMetadata,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doDeleteItem({ id, datasetId }: { id: string; datasetId: string }): Promise<void> {\n try {\n // Get current item — no-op if not found\n const existing = await this.getItemById({ id });\n if (!existing) return;\n if (existing.datasetId !== datasetId) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'DELETE_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: id, expectedDatasetId: datasetId, actualDatasetId: existing.datasetId },\n });\n }\n\n const versionId = crypto.randomUUID();\n const nowIso = new Date().toISOString();\n\n // T3.9, T3.21 — atomic batch: bump version, close old row, insert tombstone, insert dataset_version\n await this.#client.batch(\n [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [datasetId],\n },\n {\n sql: `UPDATE ${TABLE_DATASET_ITEMS} SET validTo = (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?) WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [datasetId, id],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n id,\n datasetId,\n datasetId,\n jsonbArg(existing.input)!,\n jsonbArg(existing.groundTruth),\n jsonbArg(existing.metadata),\n existing.createdAt.toISOString(),\n nowIso,\n ],\n },\n {\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, datasetId, datasetId, nowIso],\n },\n ],\n 'write',\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n try {\n let result;\n if (args.datasetVersion !== undefined) {\n // T3.13 — exact version match, exclude deleted\n result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE id = ? AND datasetVersion = ? AND isDeleted = 0`,\n args: [args.id, args.datasetVersion],\n });\n } else {\n // T3.12 — current row (validTo IS NULL AND isDeleted = false)\n result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [args.id],\n });\n }\n return result.rows?.[0] ? this.transformItemRow(result.rows[0]) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n try {\n // T3.14, T3.22 — SCD-2 range query, NO window functions\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE datasetId = ? AND datasetVersion <= ? AND (validTo IS NULL OR validTo > ?) AND isDeleted = 0 ORDER BY createdAt DESC`,\n args: [datasetId, version, version],\n });\n\n return result.rows?.map(row => this.transformItemRow(row)) ?? [];\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ITEMS_BY_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n try {\n // ALL rows including tombstones, ordered by datasetVersion DESC (newest first)\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} WHERE id = ? ORDER BY datasetVersion DESC`,\n args: [itemId],\n });\n\n return result.rows?.map(row => this.transformItemRowFull(row)) ?? [];\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ITEM_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n if (args.version !== undefined) {\n // SCD-2 time-travel query — T3.14, T3.22 (no window functions)\n const conditions: string[] = [\n 'datasetId = ?',\n 'datasetVersion <= ?',\n '(validTo IS NULL OR validTo > ?)',\n 'isDeleted = 0',\n ];\n const queryParams: InValue[] = [args.datasetId, args.version, args.version];\n\n if (args.search) {\n conditions.push(`(LOWER(json(input)) LIKE ? OR LOWER(COALESCE(json(groundTruth), '')) LIKE ?)`);\n const searchPattern = `%${args.search.toLowerCase()}%`;\n queryParams.push(searchPattern, searchPattern);\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASET_ITEMS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n items: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n items: result.rows?.map(row => this.transformItemRow(row)) ?? [],\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n };\n }\n\n // T3.16 — current items only (validTo IS NULL AND isDeleted = false)\n const conditions: string[] = ['datasetId = ?', 'validTo IS NULL', 'isDeleted = 0'];\n const queryParams: InValue[] = [args.datasetId];\n\n if (args.search) {\n conditions.push(`(LOWER(json(input)) LIKE ? OR LOWER(COALESCE(json(groundTruth), '')) LIKE ?)`);\n const searchPattern = `%${args.search.toLowerCase()}%`;\n queryParams.push(searchPattern, searchPattern);\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASET_ITEMS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n items: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASET_ITEMS)} FROM ${TABLE_DATASET_ITEMS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n items: result.rows?.map(row => this.transformItemRow(row)) ?? [],\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_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Dataset version methods ---\n\n async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: {\n id,\n datasetId,\n version,\n createdAt: nowIso,\n },\n });\n\n return {\n id,\n datasetId,\n version,\n createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_DATASET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n try {\n const { page, perPage: perPageInput } = input.pagination;\n\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_DATASET_VERSIONS} WHERE datasetId = ?`,\n args: [input.datasetId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_DATASET_VERSIONS)} FROM ${TABLE_DATASET_VERSIONS} WHERE datasetId = ? ORDER BY version DESC LIMIT ? OFFSET ?`,\n args: [input.datasetId, limitValue, start],\n });\n\n return {\n versions: result.rows?.map(row => this.transformDatasetVersionRow(row)) ?? [],\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_DATASET_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Bulk operations (SCD-2 internally) ---\n\n protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n try {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'BULK_ADD_ITEMS', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const now = new Date();\n const nowIso = now.toISOString();\n const versionId = crypto.randomUUID();\n\n // T3.19 — single version increment for all items\n const statements: { sql: string; args: InValue[] }[] = [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [input.datasetId],\n },\n ];\n\n const items: { id: string; input: BatchInsertItemsInput['items'][number] }[] = [];\n for (const itemInput of input.items) {\n const id = crypto.randomUUID();\n items.push({ id, input: itemInput });\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n id,\n input.datasetId,\n input.datasetId,\n jsonbArg(itemInput.input)!,\n jsonbArg(itemInput.groundTruth),\n jsonbArg(itemInput.metadata),\n nowIso,\n nowIso,\n ],\n });\n }\n\n // T3.11 — single dataset_version for the bulk operation\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, input.datasetId, input.datasetId, nowIso],\n });\n\n const results = await this.#client.batch(statements, 'write');\n const newVersion = Number(results[0]!.rows[0]!.version);\n\n return items.map(({ id, input: itemInput }) => ({\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n input: itemInput.input,\n groundTruth: itemInput.groundTruth,\n metadata: itemInput.metadata,\n createdAt: now,\n updatedAt: now,\n }));\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BULK_ADD_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n try {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'BULK_DELETE_ITEMS', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n // Fetch current items for tombstone data\n const currentItems: DatasetItem[] = [];\n for (const itemId of input.itemIds) {\n const item = await this.getItemById({ id: itemId });\n if (item && item.datasetId === input.datasetId) {\n currentItems.push(item);\n }\n }\n\n if (currentItems.length === 0) return;\n\n const nowIso = new Date().toISOString();\n const versionId = crypto.randomUUID();\n\n // T3.20 — single version increment\n const statements: { sql: string; args: InValue[] }[] = [\n {\n sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,\n args: [input.datasetId],\n },\n ];\n\n for (const item of currentItems) {\n // Close old row\n statements.push({\n sql: `UPDATE ${TABLE_DATASET_ITEMS} SET validTo = (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?) WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n args: [input.datasetId, item.id],\n });\n // Insert tombstone\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, validTo, isDeleted, input, groundTruth, metadata, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), ?, ?)`,\n args: [\n item.id,\n input.datasetId,\n input.datasetId,\n jsonbArg(item.input)!,\n jsonbArg(item.groundTruth),\n jsonbArg(item.metadata),\n item.createdAt.toISOString(),\n nowIso,\n ],\n });\n }\n\n // T3.11 — single dataset_version\n statements.push({\n sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,\n args: [versionId, input.datasetId, input.datasetId, nowIso],\n });\n\n await this.#client.batch(statements, 'write');\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'BULK_DELETE_ITEMS', '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 {\n createStorageErrorId,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n EXPERIMENTS_SCHEMA,\n EXPERIMENT_RESULTS_SCHEMA,\n ExperimentsStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n Experiment,\n ExperimentResult,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class ExperimentsLibSQL extends ExperimentsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_EXPERIMENTS, schema: EXPERIMENTS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_EXPERIMENT_RESULTS,\n schema: EXPERIMENT_RESULTS_SCHEMA,\n });\n\n // Indexes — idempotent, safe to run on every init\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_experiments_datasetid ON \"${TABLE_EXPERIMENTS}\" (\"datasetId\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_experiment_results_experimentid ON \"${TABLE_EXPERIMENT_RESULTS}\" (\"experimentId\")`,\n args: [],\n });\n await this.#client.execute({\n sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_experiment_results_exp_item ON \"${TABLE_EXPERIMENT_RESULTS}\" (\"experimentId\", \"itemId\")`,\n args: [],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_EXPERIMENT_RESULTS });\n await this.#db.deleteData({ tableName: TABLE_EXPERIMENTS });\n }\n\n // Helper to transform row to Experiment\n private transformExperimentRow(row: Record<string, unknown>): Experiment {\n return {\n id: row.id as string,\n datasetId: (row.datasetId as string | null) ?? null,\n datasetVersion: row.datasetVersion != null ? (row.datasetVersion as number) : null,\n targetType: row.targetType as Experiment['targetType'],\n targetId: row.targetId as string,\n name: (row.name as string) ?? undefined,\n description: (row.description as string) ?? undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata as string) : undefined,\n status: row.status as Experiment['status'],\n totalItems: row.totalItems as number,\n succeededCount: row.succeededCount as number,\n failedCount: row.failedCount as number,\n skippedCount: (row.skippedCount as number) ?? 0,\n startedAt: row.startedAt ? ensureDate(row.startedAt as string | Date)! : null,\n completedAt: row.completedAt ? ensureDate(row.completedAt as string | Date)! : null,\n createdAt: ensureDate(row.createdAt as string | Date)!,\n updatedAt: ensureDate(row.updatedAt as string | Date)!,\n };\n }\n\n // Helper to transform row to ExperimentResult\n private transformExperimentResultRow(row: Record<string, unknown>): ExperimentResult {\n return {\n id: row.id as string,\n experimentId: row.experimentId as string,\n itemId: row.itemId as string,\n itemDatasetVersion: row.itemDatasetVersion != null ? (row.itemDatasetVersion as number) : null,\n input: safelyParseJSON(row.input as string),\n output: row.output ? safelyParseJSON(row.output as string) : null,\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth as string) : null,\n error: row.error ? safelyParseJSON(row.error as string) : null,\n startedAt: ensureDate(row.startedAt as string | Date)!,\n completedAt: ensureDate(row.completedAt as string | Date)!,\n retryCount: row.retryCount as number,\n traceId: (row.traceId as string | null) ?? null,\n createdAt: ensureDate(row.createdAt as string | Date)!,\n };\n }\n\n // Experiment lifecycle\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n try {\n const id = input.id ?? crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_EXPERIMENTS,\n record: {\n id,\n datasetId: input.datasetId ?? null,\n datasetVersion: input.datasetVersion ?? null,\n targetType: input.targetType,\n targetId: input.targetId,\n name: input.name ?? null,\n description: input.description ?? null,\n metadata: input.metadata ?? null,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n startedAt: null,\n completedAt: null,\n createdAt: nowIso,\n updatedAt: nowIso,\n },\n });\n\n return {\n id,\n datasetId: input.datasetId,\n datasetVersion: input.datasetVersion,\n targetType: input.targetType,\n targetId: input.targetId,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n try {\n const existing = await this.getExperimentById({ id: input.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_EXPERIMENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { experimentId: input.id },\n });\n }\n\n const now = new Date().toISOString();\n const updates: string[] = ['updatedAt = ?'];\n const values: InValue[] = [now];\n\n if (input.status !== undefined) {\n updates.push('status = ?');\n values.push(input.status);\n }\n if (input.succeededCount !== undefined) {\n updates.push('succeededCount = ?');\n values.push(input.succeededCount);\n }\n if (input.failedCount !== undefined) {\n updates.push('failedCount = ?');\n values.push(input.failedCount);\n }\n if (input.startedAt !== undefined) {\n updates.push('startedAt = ?');\n values.push(input.startedAt?.toISOString() ?? null);\n }\n if (input.completedAt !== undefined) {\n updates.push('completedAt = ?');\n values.push(input.completedAt?.toISOString() ?? null);\n }\n if (input.skippedCount !== undefined) {\n updates.push('skippedCount = ?');\n values.push(input.skippedCount);\n }\n if (input.name !== undefined) {\n updates.push('name = ?');\n values.push(input.name);\n }\n if (input.description !== undefined) {\n updates.push('description = ?');\n values.push(input.description);\n }\n if (input.metadata !== undefined) {\n updates.push('metadata = ?');\n values.push(JSON.stringify(input.metadata));\n }\n\n values.push(input.id);\n\n await this.#client.execute({\n sql: `UPDATE ${TABLE_EXPERIMENTS} SET ${updates.join(', ')} WHERE id = ?`,\n args: values,\n });\n\n // Re-SELECT to get all fields correctly transformed (F2 fix)\n const updated = await this.getExperimentById({ id: input.id });\n return updated!;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentById(args: { id: string }): Promise<Experiment | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_EXPERIMENTS)} FROM ${TABLE_EXPERIMENTS} WHERE id = ?`,\n args: [args.id],\n });\n return result.rows?.[0] ? this.transformExperimentRow(result.rows[0] as Record<string, unknown>) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n // Build WHERE clause\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (args.datasetId) {\n conditions.push('datasetId = ?');\n queryParams.push(args.datasetId);\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_EXPERIMENTS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n experiments: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_EXPERIMENTS)} FROM ${TABLE_EXPERIMENTS} ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n experiments: result.rows?.map(row => this.transformExperimentRow(row as Record<string, unknown>)) ?? [],\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_EXPERIMENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperiment(args: { id: string }): Promise<void> {\n try {\n // Delete results first (foreign key semantics)\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENT_RESULTS} WHERE experimentId = ?`,\n args: [args.id],\n });\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENTS} WHERE id = ?`,\n args: [args.id],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // Results (per-item)\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n try {\n const id = input.id ?? crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_EXPERIMENT_RESULTS,\n record: {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion ?? null,\n input: input.input,\n output: input.output,\n groundTruth: input.groundTruth,\n error: input.error ?? null,\n startedAt: input.startedAt.toISOString(),\n completedAt: input.completedAt.toISOString(),\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n createdAt: nowIso,\n },\n });\n\n return {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion,\n input: input.input,\n output: input.output,\n groundTruth: input.groundTruth,\n error: input.error,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'ADD_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_EXPERIMENT_RESULTS)} FROM ${TABLE_EXPERIMENT_RESULTS} WHERE id = ?`,\n args: [args.id],\n });\n return result.rows?.[0] ? this.transformExperimentResultRow(result.rows[0] as Record<string, unknown>) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n\n // Build WHERE clause\n const conditions: string[] = ['experimentId = ?'];\n const queryParams: InValue[] = [args.experimentId];\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM ${TABLE_EXPERIMENT_RESULTS} ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n results: [],\n pagination: { total: 0, page, perPage: perPageInput, hasMore: false },\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 ${buildSelectColumns(TABLE_EXPERIMENT_RESULTS)} FROM ${TABLE_EXPERIMENT_RESULTS} ${whereClause} ORDER BY startedAt ASC LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n return {\n results: result.rows?.map(row => this.transformExperimentResultRow(row as Record<string, unknown>)) ?? [],\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_EXPERIMENT_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperimentResults(args: { experimentId: string }): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_EXPERIMENT_RESULTS} WHERE experimentId = ?`,\n args: [args.experimentId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_EXPERIMENT_RESULTS', '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 {\n MCPClientsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n MCP_CLIENTS_SCHEMA,\n MCP_CLIENT_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageMCPClientType,\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n} from '@mastra/core/storage';\nimport type {\n MCPClientVersion,\n CreateMCPClientVersionInput,\n ListMCPClientVersionsInput,\n ListMCPClientVersionsOutput,\n} from '@mastra/core/storage/domains/mcp-clients';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class MCPClientsLibSQL extends MCPClientsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_MCP_CLIENTS, schema: MCP_CLIENTS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n schema: MCP_CLIENT_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (mcpClientId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_mcp_client_versions_client_version ON \"${TABLE_MCP_CLIENT_VERSIONS}\" (\"mcpClientId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_MCP_CLIENTS });\n await this.#db.deleteData({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n }\n\n // ==========================================================================\n // MCP Client CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENTS)} FROM \"${TABLE_MCP_CLIENTS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseMCPClientRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n const { mcpClient } = input;\n try {\n const now = new Date();\n\n // Insert thin MCP client record\n await this.#db.insert({\n tableName: TABLE_MCP_CLIENTS,\n record: {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpClient.authorId ?? null,\n metadata: mcpClient.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n mcpClientId: mcpClient.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned client record\n await this.#db.delete({ tableName: TABLE_MCP_CLIENTS, keys: { id: mcpClient.id } });\n throw versionError;\n }\n\n return {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: mcpClient.authorId,\n metadata: mcpClient.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`MCP client with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the MCP client record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_MCP_CLIENTS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated MCP client\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_MCP_CLIENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP client ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_CLIENTS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n conditions.push('status = ?');\n queryParams.push(status);\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_CLIENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_CLIENTS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n mcpClients: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_MCP_CLIENTS)} FROM \"${TABLE_MCP_CLIENTS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const mcpClients = result.rows?.map(row => this.#parseMCPClientRow(row)) ?? [];\n\n return {\n mcpClients,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // MCP Client Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n record: {\n id: input.id,\n mcpClientId: input.mcpClientId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n servers: input.servers ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<MCPClientVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ? AND versionNumber = ?`,\n args: [mcpClientId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_CLIENT_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [mcpClientId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n try {\n const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ?`,\n args: [mcpClientId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_MCP_CLIENT_VERSIONS)} FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [mcpClientId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE \"mcpClientId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_CLIENT_VERSIONS_BY_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(mcpClientId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_CLIENT_VERSIONS}\" WHERE mcpClientId = ?`,\n args: [mcpClientId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseMCPClientRow(row: Record<string, unknown>): StorageMCPClientType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StorageMCPClientType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): MCPClientVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n mcpClientId: row.mcpClientId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n servers: safeParseJSON(row.servers) as MCPClientVersion['servers'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n MCPServersStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_MCP_SERVERS,\n TABLE_MCP_SERVER_VERSIONS,\n MCP_SERVERS_SCHEMA,\n MCP_SERVER_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageMCPServerType,\n StorageCreateMCPServerInput,\n StorageUpdateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n} from '@mastra/core/storage';\nimport type {\n MCPServerVersion,\n CreateMCPServerVersionInput,\n ListMCPServerVersionsInput,\n ListMCPServerVersionsOutput,\n} from '@mastra/core/storage/domains/mcp-servers';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class MCPServersLibSQL extends MCPServersStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_MCP_SERVERS, schema: MCP_SERVERS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n schema: MCP_SERVER_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (mcpServerId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_mcp_server_versions_server_version ON \"${TABLE_MCP_SERVER_VERSIONS}\" (\"mcpServerId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_MCP_SERVERS });\n await this.#db.deleteData({ tableName: TABLE_MCP_SERVER_VERSIONS });\n }\n\n // ==========================================================================\n // MCP Server CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageMCPServerType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_SERVERS)} FROM \"${TABLE_MCP_SERVERS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseMCPServerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { mcpServer: StorageCreateMCPServerInput }): Promise<StorageMCPServerType> {\n const { mcpServer } = input;\n try {\n const now = new Date();\n\n // Insert thin MCP server record\n await this.#db.insert({\n tableName: TABLE_MCP_SERVERS,\n record: {\n id: mcpServer.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpServer.authorId ?? null,\n metadata: mcpServer.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpServer;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n mcpServerId: mcpServer.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned server record\n await this.#db.delete({ tableName: TABLE_MCP_SERVERS, keys: { id: mcpServer.id } });\n throw versionError;\n }\n\n return {\n id: mcpServer.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: mcpServer.authorId,\n metadata: mcpServer.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateMCPServerInput): Promise<StorageMCPServerType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`MCP server with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the MCP server record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_MCP_SERVERS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated MCP server\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_MCP_SERVER', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP server ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_SERVERS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListMCPServersInput): Promise<StorageListMCPServersOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n conditions.push('status = ?');\n queryParams.push(status);\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_SERVERS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_SERVERS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n mcpServers: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_MCP_SERVERS)} FROM \"${TABLE_MCP_SERVERS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const mcpServers = result.rows?.map(row => this.#parseMCPServerRow(row)) ?? [];\n\n return {\n mcpServers,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_SERVERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // MCP Server Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n record: {\n id: input.id,\n mcpServerId: input.mcpServerId,\n versionNumber: input.versionNumber,\n name: input.name,\n version: input.version,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n repository: input.repository ?? null,\n releaseDate: input.releaseDate ?? null,\n isLatest: input.isLatest ?? null,\n packageCanonical: input.packageCanonical ?? null,\n tools: input.tools ?? null,\n agents: input.agents ?? null,\n workflows: input.workflows ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<MCPServerVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_SERVER_VERSIONS)} FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(mcpServerId: string, versionNumber: number): Promise<MCPServerVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_SERVER_VERSIONS)} FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE mcpServerId = ? AND versionNumber = ?`,\n args: [mcpServerId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_MCP_SERVER_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(mcpServerId: string): Promise<MCPServerVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_MCP_SERVER_VERSIONS)} FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE mcpServerId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [mcpServerId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListMCPServerVersionsInput): Promise<ListMCPServerVersionsOutput> {\n try {\n const { mcpServerId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE mcpServerId = ?`,\n args: [mcpServerId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_MCP_SERVER_VERSIONS)} FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE mcpServerId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [mcpServerId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE \"mcpServerId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_MCP_SERVER_VERSIONS_BY_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(mcpServerId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_MCP_SERVER_VERSIONS}\" WHERE mcpServerId = ?`,\n args: [mcpServerId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #safeParseJSON(val: unknown): unknown {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n }\n\n #parseMCPServerRow(row: Record<string, unknown>): StorageMCPServerType {\n return {\n id: row.id as string,\n status: (row.status as StorageMCPServerType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: this.#safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): MCPServerVersion {\n return {\n id: row.id as string,\n mcpServerId: row.mcpServerId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n version: row.version as string,\n description: (row.description as string) ?? undefined,\n instructions: (row.instructions as string) ?? undefined,\n repository: this.#safeParseJSON(row.repository) as MCPServerVersion['repository'],\n releaseDate: (row.releaseDate as string) ?? undefined,\n isLatest: row.isLatest === null || row.isLatest === undefined ? undefined : Boolean(row.isLatest),\n packageCanonical: (row.packageCanonical as string) ?? undefined,\n tools: this.#safeParseJSON(row.tools) as MCPServerVersion['tools'],\n agents: this.#safeParseJSON(row.agents) as MCPServerVersion['agents'],\n workflows: this.#safeParseJSON(row.workflows) as MCPServerVersion['workflows'],\n changedFields: this.#safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport 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 StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n ObservationalMemoryRecord,\n BufferedObservationChunk,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n UpdateBufferedReflectionInput,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\n\n/**\n * Local constant for the observational memory table name.\n * Defined locally to avoid a static import that crashes on older @mastra/core\n * versions that don't export TABLE_OBSERVATIONAL_MEMORY.\n */\nconst OM_TABLE = 'mastra_observational_memory' as const;\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class MemoryLibSQL extends MemoryStorage {\n readonly supportsObservationalMemory = true;\n\n #client: Client;\n #db: LibSQLDB;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n\n // Dynamically import OM schema to avoid crashing on older @mastra/core versions\n let omSchema: Record<string, any> | undefined;\n try {\n const { OBSERVATIONAL_MEMORY_TABLE_SCHEMA } = await import('@mastra/core/storage');\n omSchema = OBSERVATIONAL_MEMORY_TABLE_SCHEMA?.[OM_TABLE];\n } catch {\n // Older @mastra/core without OM support\n }\n\n if (omSchema) {\n await this.#db.createTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n });\n // Add new OM columns for backwards compatibility with existing databases\n await this.#db.alterTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n ifNotExists: [\n 'observedMessageIds',\n 'observedTimezone',\n 'bufferedObservations',\n 'bufferedObservationTokens',\n 'bufferedMessageIds',\n 'bufferedReflection',\n 'bufferedReflectionTokens',\n 'bufferedReflectionInputTokens',\n 'reflectedObservationLineCount',\n 'bufferedObservationChunks',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n ],\n });\n }\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n if (omSchema) {\n // Create index on lookupKey for efficient OM queries\n await this.#client.execute({\n sql: `CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON \"${OM_TABLE}\" (\"lookupKey\")`,\n args: [],\n });\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_MESSAGES });\n await this.#db.deleteData({ tableName: TABLE_THREADS });\n await this.#db.deleteData({ tableName: TABLE_RESOURCES });\n if (OM_TABLE) {\n await this.#db.deleteData({ tableName: OM_TABLE as any });\n }\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 const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`\"createdAt\" ${startOp} ?`);\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 const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`\"createdAt\" ${endOp} ?`);\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 public async listMessagesByResourceId(\n args: StorageListMessagesByResourceIdInput,\n ): Promise<StorageListMessagesOutput> {\n const { resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n if (!resourceId || typeof resourceId !== 'string' || resourceId.trim().length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_MESSAGES', 'INVALID_QUERY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { resourceId: resourceId ?? '' },\n },\n new Error('resourceId is required'),\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\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n // Add resourceId filter (required for listMessagesByResourceId)\n conditions.push(`\"resourceId\" = ?`);\n queryParams.push(resourceId);\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`\"createdAt\" ${startOp} ?`);\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 const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`\"createdAt\" ${endOp} ?`);\n queryParams.push(\n filter.dateRange.end instanceof Date ? filter.dateRange.end.toISOString() : filter.dateRange.end,\n );\n }\n\n const whereClause = `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\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 const hasMore = perPageInput !== false && 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: { resourceId },\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.#db.select<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.#db.insert({\n tableName: TABLE_RESOURCES,\n record: {\n ...resource,\n // metadata is handled by prepareStatement which stringifies jsonb columns\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 = jsonb(?)');\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.#db.select<\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 listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n const whereClauses: string[] = [];\n const queryParams: InValue[] = [];\n\n // Add resourceId filter if provided\n if (filter?.resourceId) {\n whereClauses.push('resourceId = ?');\n queryParams.push(filter.resourceId);\n }\n\n // Add metadata filters if provided (AND logic)\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n // Handle null values specially: json_extract returns SQL NULL for JSON null,\n // and NULL = NULL evaluates to NULL (not true) in SQL\n if (value === null) {\n whereClauses.push(`json_extract(metadata, '$.${key}') IS NULL`);\n } else if (typeof value === 'boolean') {\n // json_extract returns 1 for true, 0 for false (integers, not strings)\n whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(value ? 1 : 0);\n } else if (typeof value === 'number') {\n // Numbers are returned as-is by json_extract\n whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(value);\n } else if (typeof value === 'string') {\n // Strings are returned unquoted by json_extract\n whereClauses.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(value);\n } else {\n // Objects and arrays are not supported for filtering\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'INVALID_METADATA_VALUE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Metadata filter value for key \"${key}\" must be a scalar type (string, number, boolean, or null), got ${typeof value}`,\n details: { key, valueType: typeof value },\n });\n }\n }\n }\n\n const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n const baseQuery = `FROM ${TABLE_THREADS} ${whereClause}`;\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),\n updatedAt: new Date(row.updatedAt as string),\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 ${buildSelectColumns(TABLE_THREADS)} ${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 // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n throw error;\n }\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n },\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.#db.insert({\n tableName: TABLE_THREADS,\n record: {\n ...thread,\n // metadata is handled by prepareStatement which stringifies jsonb columns\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 = jsonb(?) 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 try {\n // Delete messages first (child records), then thread\n // Note: Not using a transaction to avoid SQLITE_BUSY errors when multiple\n // deleteThread calls run concurrently. The two deletes are independent and\n // orphaned messages (if thread delete fails) would be cleaned up on next delete attempt.\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 }\n\n async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n // Get the source thread\n const sourceThread = await this.getThreadById({ threadId: sourceThreadId });\n if (!sourceThread) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Source thread with id ${sourceThreadId} not found`,\n details: { sourceThreadId },\n });\n }\n\n // Use provided ID or generate a new one\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n // Check if the new thread ID already exists\n const existingThread = await this.getThreadById({ threadId: newThreadId });\n if (existingThread) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'CLONE_THREAD', 'THREAD_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread with id ${newThreadId} already exists`,\n details: { newThreadId },\n });\n }\n\n try {\n // Build message query with filters\n let messageQuery = `SELECT id, content, role, type, \"createdAt\", thread_id, \"resourceId\"\n FROM \"${TABLE_MESSAGES}\" WHERE thread_id = ?`;\n const messageParams: InValue[] = [sourceThreadId];\n\n // Apply date filters\n if (options?.messageFilter?.startDate) {\n messageQuery += ` AND \"createdAt\" >= ?`;\n messageParams.push(\n options.messageFilter.startDate instanceof Date\n ? options.messageFilter.startDate.toISOString()\n : options.messageFilter.startDate,\n );\n }\n if (options?.messageFilter?.endDate) {\n messageQuery += ` AND \"createdAt\" <= ?`;\n messageParams.push(\n options.messageFilter.endDate instanceof Date\n ? options.messageFilter.endDate.toISOString()\n : options.messageFilter.endDate,\n );\n }\n\n // Apply message ID filter\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n messageQuery += ` AND id IN (${options.messageFilter.messageIds.map(() => '?').join(', ')})`;\n messageParams.push(...options.messageFilter.messageIds);\n }\n\n messageQuery += ` ORDER BY \"createdAt\" ASC`;\n\n // Apply message limit (from most recent, so we need to reverse order for limit then sort back)\n if (options?.messageLimit && options.messageLimit > 0) {\n const limitQuery = `SELECT * FROM (${messageQuery.replace('ORDER BY \"createdAt\" ASC', 'ORDER BY \"createdAt\" DESC')} LIMIT ?) ORDER BY \"createdAt\" ASC`;\n messageParams.push(options.messageLimit);\n messageQuery = limitQuery;\n }\n\n const sourceMessagesResult = await this.#client.execute({ sql: messageQuery, args: messageParams });\n const sourceMessages = sourceMessagesResult.rows || [];\n\n const now = new Date();\n const nowStr = now.toISOString();\n\n // Determine the last message ID for clone metadata\n const lastMessageId =\n sourceMessages.length > 0 ? (sourceMessages[sourceMessages.length - 1]!.id as string) : undefined;\n\n // Create clone metadata\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n // Create the new thread\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : ''),\n metadata: {\n ...metadata,\n clone: cloneMetadata,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n // Use transaction for consistency\n const tx = await this.#client.transaction('write');\n\n try {\n // Insert the new thread\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_THREADS}\" (id, \"resourceId\", title, metadata, \"createdAt\", \"updatedAt\")\n VALUES (?, ?, ?, jsonb(?), ?, ?)`,\n args: [\n newThread.id,\n newThread.resourceId,\n newThread.title ?? '',\n JSON.stringify(newThread.metadata),\n nowStr,\n nowStr,\n ],\n });\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const targetResourceId = resourceId || sourceThread.resourceId;\n\n for (const sourceMsg of sourceMessages) {\n const newMessageId = crypto.randomUUID();\n const contentStr = sourceMsg.content as string;\n let parsedContent: MastraDBMessage['content'];\n try {\n parsedContent = JSON.parse(contentStr);\n } catch {\n // use content as is - wrap in format 2 structure if needed\n parsedContent = { format: 2, parts: [{ type: 'text', text: contentStr }] };\n }\n\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_MESSAGES}\" (id, thread_id, content, role, type, \"createdAt\", \"resourceId\")\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n args: [\n newMessageId,\n newThreadId,\n contentStr,\n sourceMsg.role as string,\n (sourceMsg.type as string) || 'v2',\n sourceMsg.createdAt as string,\n targetResourceId,\n ],\n });\n\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: parsedContent,\n role: sourceMsg.role as MastraDBMessage['role'],\n type: (sourceMsg.type as string) || undefined,\n createdAt: new Date(sourceMsg.createdAt as string),\n resourceId: targetResourceId,\n });\n }\n\n await tx.commit();\n\n return {\n thread: newThread,\n clonedMessages,\n };\n } catch (error) {\n await tx.rollback();\n throw error;\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n private getOMKey(threadId: string | null, resourceId: string): string {\n return threadId ? `thread:${threadId}` : `resource:${resourceId}`;\n }\n\n private parseOMRow(row: any): ObservationalMemoryRecord {\n return {\n id: row.id,\n scope: row.scope,\n threadId: row.threadId || null,\n resourceId: row.resourceId,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n lastObservedAt: row.lastObservedAt ? new Date(row.lastObservedAt) : undefined,\n originType: row.originType || 'initial',\n generationCount: Number(row.generationCount || 0),\n activeObservations: row.activeObservations || '',\n // Handle new chunk-based structure\n bufferedObservationChunks: row.bufferedObservationChunks\n ? typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks\n : undefined,\n // Deprecated fields (for backward compatibility)\n bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n bufferedMessageIds: undefined, // Use bufferedObservationChunks instead\n bufferedReflection: row.bufferedReflection || undefined,\n bufferedReflectionTokens: row.bufferedReflectionTokens ? Number(row.bufferedReflectionTokens) : undefined,\n bufferedReflectionInputTokens: row.bufferedReflectionInputTokens\n ? Number(row.bufferedReflectionInputTokens)\n : undefined,\n reflectedObservationLineCount: row.reflectedObservationLineCount\n ? Number(row.reflectedObservationLineCount)\n : undefined,\n totalTokensObserved: Number(row.totalTokensObserved || 0),\n observationTokenCount: Number(row.observationTokenCount || 0),\n pendingMessageTokens: Number(row.pendingMessageTokens || 0),\n isReflecting: Boolean(row.isReflecting),\n isObserving: Boolean(row.isObserving),\n isBufferingObservation:\n row.isBufferingObservation === true ||\n row.isBufferingObservation === 'true' ||\n row.isBufferingObservation === 1,\n isBufferingReflection:\n row.isBufferingReflection === true || row.isBufferingReflection === 'true' || row.isBufferingReflection === 1,\n lastBufferedAtTokens:\n typeof row.lastBufferedAtTokens === 'number'\n ? row.lastBufferedAtTokens\n : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n lastBufferedAtTime: row.lastBufferedAtTime ? new Date(String(row.lastBufferedAtTime)) : null,\n config: row.config ? JSON.parse(row.config) : {},\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n observedMessageIds: row.observedMessageIds ? JSON.parse(row.observedMessageIds) : undefined,\n observedTimezone: row.observedTimezone || undefined,\n };\n }\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const result = await this.#client.execute({\n // Use generationCount DESC for reliable ordering (incremented for each new record)\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE \"lookupKey\" = ? ORDER BY \"generationCount\" DESC LIMIT 1`,\n args: [lookupKey],\n });\n if (!result.rows || result.rows.length === 0) return null;\n return this.parseOMRow(result.rows[0]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit: number = 10,\n ): Promise<ObservationalMemoryRecord[]> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const result = await this.#client.execute({\n // Use generationCount DESC for reliable ordering (incremented for each new record)\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE \"lookupKey\" = ? ORDER BY \"generationCount\" DESC LIMIT ?`,\n args: [lookupKey, limit],\n });\n if (!result.rows) return [];\n return result.rows.map(row => this.parseOMRow(row));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_OBSERVATIONAL_MEMORY_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId, limit },\n },\n error,\n );\n }\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.scope,\n threadId: input.threadId,\n resourceId: input.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: undefined,\n originType: 'initial',\n generationCount: 0,\n activeObservations: '',\n totalTokensObserved: 0,\n observationTokenCount: 0,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.config,\n observedTimezone: input.observedTimezone,\n };\n\n await this.#client.execute({\n sql: `INSERT INTO \"${OM_TABLE}\" (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastReflectionAt\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"updatedAt\"\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n lookupKey,\n input.scope,\n input.resourceId,\n input.threadId || null,\n '',\n null,\n 'initial',\n JSON.stringify(input.config),\n 0,\n null,\n null,\n 0,\n 0,\n 0,\n false,\n false,\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n input.observedTimezone || null,\n now.toISOString(),\n now.toISOString(),\n ],\n });\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'INITIALIZE_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: input.threadId, resourceId: input.resourceId },\n },\n error,\n );\n }\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n try {\n const now = new Date();\n\n const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"activeObservations\" = ?,\n \"lastObservedAt\" = ?,\n \"pendingMessageTokens\" = 0,\n \"observationTokenCount\" = ?,\n \"totalTokensObserved\" = \"totalTokensObserved\" + ?,\n \"observedMessageIds\" = ?,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [\n input.observations,\n input.lastObservedAt.toISOString(),\n input.tokenCount,\n input.tokenCount,\n observedMessageIdsJson,\n now.toISOString(),\n input.id,\n ],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_ACTIVE_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_ACTIVE_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.currentRecord.threadId, input.currentRecord.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.currentRecord.scope,\n threadId: input.currentRecord.threadId,\n resourceId: input.currentRecord.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: input.currentRecord.lastObservedAt,\n originType: 'reflection',\n generationCount: input.currentRecord.generationCount + 1,\n activeObservations: input.reflection,\n totalTokensObserved: input.currentRecord.totalTokensObserved,\n observationTokenCount: input.tokenCount,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.currentRecord.config,\n metadata: input.currentRecord.metadata,\n observedTimezone: input.currentRecord.observedTimezone,\n };\n\n await this.#client.execute({\n sql: `INSERT INTO \"${OM_TABLE}\" (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastReflectionAt\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"updatedAt\"\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n lookupKey,\n record.scope,\n record.resourceId,\n record.threadId || null,\n input.reflection,\n null,\n 'reflection',\n JSON.stringify(record.config),\n input.currentRecord.generationCount + 1,\n record.lastObservedAt?.toISOString() || null,\n now.toISOString(),\n record.pendingMessageTokens,\n record.totalTokensObserved,\n record.observationTokenCount,\n false, // isObserving\n false, // isReflecting\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n record.observedTimezone || null,\n now.toISOString(),\n now.toISOString(),\n ],\n });\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_REFLECTION_GENERATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { currentRecordId: input.currentRecord.id },\n },\n error,\n );\n }\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \"isReflecting\" = ?, \"updatedAt\" = ? WHERE id = ?`,\n args: [isReflecting, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_REFLECTING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_REFLECTING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n },\n error,\n );\n }\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \"isObserving\" = ?, \"updatedAt\" = ? WHERE id = ?`,\n args: [isObserving, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_OBSERVING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_OBSERVING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n },\n error,\n );\n }\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n try {\n const nowStr = new Date().toISOString();\n\n let sql: string;\n let args: InValue[];\n\n if (lastBufferedAtTokens !== undefined) {\n sql = `UPDATE \"${OM_TABLE}\" SET \"isBufferingObservation\" = ?, \"lastBufferedAtTokens\" = ?, \"updatedAt\" = ? WHERE id = ?`;\n args = [isBuffering, lastBufferedAtTokens, nowStr, id];\n } else {\n sql = `UPDATE \"${OM_TABLE}\" SET \"isBufferingObservation\" = ?, \"updatedAt\" = ? WHERE id = ?`;\n args = [isBuffering, nowStr, id];\n }\n\n const result = await this.#client.execute({ sql, args });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_OBSERVATION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_OBSERVATION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n },\n error,\n );\n }\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \"isBufferingReflection\" = ?, \"updatedAt\" = ? WHERE id = ?`,\n args: [isBuffering, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_REFLECTION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_BUFFERING_REFLECTION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n },\n error,\n );\n }\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n await this.#client.execute({\n sql: `DELETE FROM \"${OM_TABLE}\" WHERE \"lookupKey\" = ?`,\n args: [lookupKey],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CLEAR_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n try {\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET \n \"pendingMessageTokens\" = ?, \n \"updatedAt\" = ? \n WHERE id = ?`,\n args: [tokenCount, new Date().toISOString(), id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SET_PENDING_MESSAGE_TOKENS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SET_PENDING_MESSAGE_TOKENS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Async Buffering Methods\n // ============================================\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n try {\n const nowStr = new Date().toISOString();\n\n // First get current record to get existing chunks\n const current = await this.#client.execute({\n sql: `SELECT \"bufferedObservationChunks\" FROM \"${OM_TABLE}\" WHERE id = ?`,\n args: [input.id],\n });\n\n if (!current.rows || current.rows.length === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n\n const row = current.rows[0]!;\n let existingChunks: BufferedObservationChunk[] = [];\n if (row.bufferedObservationChunks) {\n try {\n const parsed =\n typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks;\n existingChunks = Array.isArray(parsed) ? parsed : [];\n } catch {\n existingChunks = [];\n }\n }\n\n // Create new chunk with ID and timestamp\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${randomUUID()}`,\n cycleId: input.chunk.cycleId,\n observations: input.chunk.observations,\n tokenCount: input.chunk.tokenCount,\n messageIds: input.chunk.messageIds,\n messageTokens: input.chunk.messageTokens,\n lastObservedAt: input.chunk.lastObservedAt,\n createdAt: new Date(),\n suggestedContinuation: input.chunk.suggestedContinuation,\n currentTask: input.chunk.currentTask,\n };\n\n const newChunks = [...existingChunks, newChunk];\n\n const lastBufferedAtTime = input.lastBufferedAtTime ? input.lastBufferedAtTime.toISOString() : null;\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"bufferedObservationChunks\" = ?,\n \"lastBufferedAtTime\" = COALESCE(?, \"lastBufferedAtTime\"),\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [JSON.stringify(newChunks), lastBufferedAtTime, nowStr, input.id],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n try {\n const nowStr = new Date().toISOString();\n\n // Get current record\n const current = await this.#client.execute({\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE id = ?`,\n args: [input.id],\n });\n\n if (!current.rows || current.rows.length === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n\n const row = current.rows[0]!;\n\n // Parse buffered chunks\n let chunks: BufferedObservationChunk[] = [];\n if (row.bufferedObservationChunks) {\n try {\n const parsed =\n typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks;\n chunks = Array.isArray(parsed) ? parsed : [];\n } catch {\n chunks = [];\n }\n }\n\n if (chunks.length === 0) {\n return {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n }\n\n // Calculate target message tokens to activate based on new formula:\n // retentionFloor = threshold * (1 - ratio) represents tokens to keep as raw messages\n // targetMessageTokens = max(0, currentPending - retentionFloor) represents tokens to activate\n const retentionFloor = input.messageTokensThreshold * (1 - input.activationRatio);\n const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n // Find the closest chunk boundary to the target, biased over (prefer removing\n // slightly more than the target so remaining context lands at or below retentionFloor).\n // Track both best-over and best-under boundaries so we can fall back to under\n // if the over boundary would overshoot by too much.\n let cumulativeMessageTokens = 0;\n let bestOverBoundary = 0;\n let bestOverTokens = 0;\n let bestUnderBoundary = 0;\n let bestUnderTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n if (cumulativeMessageTokens >= targetMessageTokens) {\n // Over or equal — track the closest (lowest) over boundary\n if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n bestOverBoundary = boundary;\n bestOverTokens = cumulativeMessageTokens;\n }\n } else {\n // Under — track the closest (highest) under boundary\n if (cumulativeMessageTokens > bestUnderTokens) {\n bestUnderBoundary = boundary;\n bestUnderTokens = cumulativeMessageTokens;\n }\n }\n }\n\n // Safeguard: if the over boundary would eat into more than 95% of the\n // retention floor, fall back to the best under boundary instead.\n // This prevents edge cases where a large chunk overshoots dramatically.\n // When forceMaxActivation is set (above blockAfter), skip the safeguard\n // and always prefer the over boundary to aggressively reduce context.\n // Additionally, never bias over if it would leave fewer than 1000 tokens\n // remaining — at that level the agent may lose all meaningful context.\n const maxOvershoot = retentionFloor * 0.95;\n const overshoot = bestOverTokens - targetMessageTokens;\n const remainingAfterOver = input.currentPendingTokens - bestOverTokens;\n\n let chunksToActivate: number;\n if (input.forceMaxActivation && bestOverBoundary > 0) {\n chunksToActivate = bestOverBoundary;\n } else if (\n bestOverBoundary > 0 &&\n overshoot <= maxOvershoot &&\n (remainingAfterOver >= 1000 || retentionFloor === 0)\n ) {\n chunksToActivate = bestOverBoundary;\n } else if (bestUnderBoundary > 0) {\n chunksToActivate = bestUnderBoundary;\n } else if (bestOverBoundary > 0) {\n // All boundaries are over and exceed the safeguard — still activate\n // the closest over boundary (better than nothing)\n chunksToActivate = bestOverBoundary;\n } else {\n chunksToActivate = 1;\n }\n\n // Split chunks\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = chunks.slice(chunksToActivate);\n\n // Combine activated observations\n const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);\n const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n // Derive lastObservedAt from the latest activated chunk, or use provided value\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const lastObservedAt =\n input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n const lastObservedAtStr = lastObservedAt.toISOString();\n\n // Get existing values\n const existingActive = (row.activeObservations as string) || '';\n const existingTokenCount = Number(row.observationTokenCount || 0);\n\n // Calculate new values\n const newActive = existingActive ? `${existingActive}\\n\\n${activatedContent}` : activatedContent;\n const newTokenCount = existingTokenCount + activatedTokens;\n // NOTE: We intentionally do NOT add message IDs to observedMessageIds during buffered activation.\n // Buffered chunks represent observations of messages as they were at buffering time.\n // With streaming, messages grow after buffering, so we rely on lastObservedAt for filtering.\n // New content after lastObservedAt will be picked up in subsequent observations.\n\n // Decrement pending message tokens (clamped to zero)\n const existingPending = Number(row.pendingMessageTokens || 0);\n const newPending = Math.max(0, existingPending - activatedMessageTokens);\n\n await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"activeObservations\" = ?,\n \"observationTokenCount\" = ?,\n \"pendingMessageTokens\" = ?,\n \"bufferedObservationChunks\" = ?,\n \"lastObservedAt\" = ?,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [\n newActive,\n newTokenCount,\n newPending,\n remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n lastObservedAtStr,\n nowStr,\n input.id,\n ],\n });\n\n // Use hints from the most recent activated chunk only — stale hints from older chunks are discarded\n const latestChunkHints = activatedChunks[activatedChunks.length - 1];\n\n return {\n chunksActivated: activatedChunks.length,\n messageTokensActivated: activatedMessageTokens,\n observationTokensActivated: activatedTokens,\n messagesActivated: activatedMessageCount,\n activatedCycleIds,\n activatedMessageIds,\n observations: activatedContent,\n perChunk: activatedChunks.map(c => ({\n cycleId: c.cycleId ?? '',\n messageTokens: c.messageTokens ?? 0,\n observationTokens: c.tokenCount,\n messageCount: c.messageIds.length,\n observations: c.observations,\n })),\n suggestedContinuation: latestChunkHints?.suggestedContinuation ?? undefined,\n currentTask: latestChunkHints?.currentTask ?? undefined,\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n try {\n const nowStr = new Date().toISOString();\n\n const result = await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"bufferedReflection\" = CASE\n WHEN \"bufferedReflection\" IS NOT NULL AND \"bufferedReflection\" != ''\n THEN \"bufferedReflection\" || char(10) || char(10) || ?\n ELSE ?\n END,\n \"bufferedReflectionTokens\" = COALESCE(\"bufferedReflectionTokens\", 0) + ?,\n \"bufferedReflectionInputTokens\" = COALESCE(\"bufferedReflectionInputTokens\", 0) + ?,\n \"reflectedObservationLineCount\" = ?,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [\n input.reflection,\n input.reflection,\n input.tokenCount,\n input.inputTokenCount,\n input.reflectedObservationLineCount,\n nowStr,\n input.id,\n ],\n });\n\n if (result.rowsAffected === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_REFLECTION', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_BUFFERED_REFLECTION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n try {\n // Get current record\n const current = await this.#client.execute({\n sql: `SELECT * FROM \"${OM_TABLE}\" WHERE id = ?`,\n args: [input.currentRecord.id],\n });\n\n if (!current.rows || current.rows.length === 0) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.currentRecord.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n });\n }\n\n const row = current.rows[0]!;\n const bufferedReflection = (row.bufferedReflection as string) || '';\n const reflectedLineCount = Number(row.reflectedObservationLineCount || 0);\n\n if (!bufferedReflection) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NO_CONTENT'),\n text: 'No buffered reflection to swap',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { id: input.currentRecord.id },\n });\n }\n\n // Split current activeObservations by the recorded boundary.\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const currentObservations = (row.activeObservations as string) || '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n // New activeObservations = bufferedReflection + unreflected observations\n const newObservations = unreflectedContent\n ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n : bufferedReflection;\n\n // Create new generation with the merged content.\n // tokenCount is computed by the processor using its token counter on the combined content.\n const newRecord = await this.createReflectionGeneration({\n currentRecord: input.currentRecord,\n reflection: newObservations,\n tokenCount: input.tokenCount,\n });\n\n // Clear buffered state on old record\n const nowStr = new Date().toISOString();\n await this.#client.execute({\n sql: `UPDATE \"${OM_TABLE}\" SET\n \"bufferedReflection\" = NULL,\n \"bufferedReflectionTokens\" = NULL,\n \"bufferedReflectionInputTokens\" = NULL,\n \"reflectedObservationLineCount\" = NULL,\n \"updatedAt\" = ?\n WHERE id = ?`,\n args: [nowStr, input.currentRecord.id],\n });\n\n return newRecord;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n SPAN_SCHEMA,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n ListTracesArgs,\n ListTracesResponse,\n TracingStorageStrategy,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { transformFromSqlRow } from '../../db/utils';\n\nexport class ObservabilityLibSQL extends ObservabilityStorage {\n #db: LibSQLDB;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SPANS });\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n return this.#db.migrateSpans();\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n return this.#db.checkSpansMigrationStatus();\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const startedAt = span.startedAt instanceof Date ? span.startedAt.toISOString() : span.startedAt;\n const endedAt = span.endedAt instanceof Date ? span.endedAt.toISOString() : span.endedAt;\n const now = new Date().toISOString();\n\n const record = {\n ...span,\n startedAt,\n endedAt,\n createdAt: now,\n updatedAt: now,\n };\n return this.#db.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 name: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const rows = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ? AND spanId = ?', args: [traceId, spanId] },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: rows[0]! }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const rows = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ? AND parentSpanId IS NULL', args: [traceId] },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: rows[0]! }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const spans = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: ' WHERE traceId = ?', args: [traceId] },\n orderBy: 'startedAt ASC',\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(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString();\n }\n data.updatedAt = new Date().toISOString();\n\n await this.#db.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data,\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 listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n const tableName = parseSqlIdentifier(TABLE_SPANS, 'table name');\n\n try {\n // Build WHERE clause for filters\n const conditions: string[] = ['parentSpanId IS NULL']; // Only root spans\n const queryArgs: any[] = [];\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`startedAt >= ?`);\n queryArgs.push(filters.startedAt.start.toISOString());\n }\n if (filters.startedAt?.end) {\n conditions.push(`startedAt <= ?`);\n queryArgs.push(filters.startedAt.end.toISOString());\n }\n if (filters.endedAt?.start) {\n conditions.push(`endedAt >= ?`);\n queryArgs.push(filters.endedAt.start.toISOString());\n }\n if (filters.endedAt?.end) {\n conditions.push(`endedAt <= ?`);\n queryArgs.push(filters.endedAt.end.toISOString());\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`spanType = ?`);\n queryArgs.push(filters.spanType);\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`entityType = ?`);\n queryArgs.push(filters.entityType);\n }\n if (filters.entityId !== undefined) {\n conditions.push(`entityId = ?`);\n queryArgs.push(filters.entityId);\n }\n if (filters.entityName !== undefined) {\n conditions.push(`entityName = ?`);\n queryArgs.push(filters.entityName);\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`userId = ?`);\n queryArgs.push(filters.userId);\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`organizationId = ?`);\n queryArgs.push(filters.organizationId);\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`resourceId = ?`);\n queryArgs.push(filters.resourceId);\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`runId = ?`);\n queryArgs.push(filters.runId);\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`sessionId = ?`);\n queryArgs.push(filters.sessionId);\n }\n if (filters.threadId !== undefined) {\n conditions.push(`threadId = ?`);\n queryArgs.push(filters.threadId);\n }\n if (filters.requestId !== undefined) {\n conditions.push(`requestId = ?`);\n queryArgs.push(filters.requestId);\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`environment = ?`);\n queryArgs.push(filters.environment);\n }\n if (filters.source !== undefined) {\n conditions.push(`source = ?`);\n queryArgs.push(filters.source);\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`serviceName = ?`);\n queryArgs.push(filters.serviceName);\n }\n\n // Scope filter (JSON containment - SQLite uses json_extract)\n if (filters.scope != null) {\n // For SQLite/libsql, we need to check each key in the scope object\n for (const [key, value] of Object.entries(filters.scope)) {\n // Validate key to prevent SQL injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n conditions.push(`json_extract(scope, '$.${key}') = ?`);\n queryArgs.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n // Metadata filter (JSON containment)\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata)) {\n // Validate key to prevent SQL injection in JSON path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryArgs.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n // Tags filter (all tags must be present)\n if (filters.tags != null && filters.tags.length > 0) {\n // Use json_each for exact tag matching (LIKE can match substrings)\n for (const tag of filters.tags) {\n conditions.push(`EXISTS (SELECT 1 FROM json_each(${tableName}.tags) WHERE value = ?)`);\n queryArgs.push(tag);\n }\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n conditions.push(`error IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(`endedAt IS NULL AND error IS NULL`);\n break;\n case TraceStatus.SUCCESS:\n conditions.push(`endedAt IS NOT NULL AND error IS NULL`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.traceId = ${tableName}.traceId AND c.error IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.traceId = ${tableName}.traceId AND c.error IS NOT NULL\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Order by clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n // SQLite's natural behavior: NULLs are \"smaller\" than any value\n // - ASC: NULLs first (natural)\n // - DESC: NULLs last (natural)\n // So we need CASE WHEN workarounds to invert the natural behavior for endedAt\n const sortField = orderBy.field;\n const sortDirection = orderBy.direction;\n let orderByClause: string;\n if (sortField === 'endedAt') {\n // endedAt DESC: want NULLs first (running spans on top) - need CASE WHEN\n // endedAt ASC: want NULLs last (oldest completed first) - need CASE WHEN\n orderByClause =\n sortDirection === 'DESC'\n ? `CASE WHEN ${sortField} IS NULL THEN 0 ELSE 1 END, ${sortField} DESC`\n : `CASE WHEN ${sortField} IS NULL THEN 1 ELSE 0 END, ${sortField} ASC`;\n } else {\n orderByClause = `${sortField} ${sortDirection}`;\n }\n\n // Get total count\n const count = await this.#db.selectTotalCount({\n tableName: TABLE_SPANS,\n whereClause: { sql: whereClause, args: queryArgs },\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 // Get paginated spans\n const spans = await this.#db.selectMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: { sql: whereClause, args: queryArgs },\n orderBy: orderByClause,\n offset: page * perPage,\n limit: perPage,\n });\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: (page + 1) * perPage < count,\n },\n spans: toTraceSpans(\n spans.map(span => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: span })),\n ),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = new Date().toISOString();\n const records = args.records.map(record => {\n const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n return {\n ...record,\n startedAt,\n endedAt,\n createdAt: now,\n updatedAt: now,\n };\n });\n\n return this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records,\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: BatchUpdateSpansArgs): Promise<void> {\n const now = new Date().toISOString();\n\n try {\n return this.#db.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => {\n const data: Record<string, any> = { ...record.updates };\n if (data.endedAt instanceof Date) {\n data.endedAt = data.endedAt.toISOString();\n }\n if (data.startedAt instanceof Date) {\n data.startedAt = data.startedAt.toISOString();\n }\n data.updatedAt = now;\n\n return {\n keys: { spanId: record.spanId, traceId: record.traceId },\n data,\n };\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: BatchDeleteTracesArgs): Promise<void> {\n try {\n const keys = args.traceIds.map(traceId => ({ traceId }));\n return this.#db.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 {\n PromptBlocksStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n PROMPT_BLOCKS_SCHEMA,\n PROMPT_BLOCK_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n} from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class PromptBlocksLibSQL extends PromptBlocksStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: PROMPT_BLOCKS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, schema: PROMPT_BLOCK_VERSIONS_SCHEMA });\n\n // Unique constraint on (blockId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_prompt_block_versions_block_version ON \"${TABLE_PROMPT_BLOCK_VERSIONS}\" (\"blockId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_PROMPT_BLOCKS });\n await this.#db.deleteData({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n }\n\n // ==========================================================================\n // Prompt Block CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCKS)} FROM \"${TABLE_PROMPT_BLOCKS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseBlockRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n try {\n const now = new Date();\n\n // Insert thin block record\n await this.#db.insert({\n tableName: TABLE_PROMPT_BLOCKS,\n record: {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: null,\n authorId: promptBlock.authorId ?? null,\n metadata: promptBlock.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n return {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: promptBlock.authorId,\n metadata: promptBlock.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`Prompt block with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the block record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_PROMPT_BLOCKS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated block\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Prompt block ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_PROMPT_BLOCKS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n conditions.push('status = ?');\n queryParams.push(status);\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_PROMPT_BLOCKS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_PROMPT_BLOCKS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n promptBlocks: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_PROMPT_BLOCKS)} FROM \"${TABLE_PROMPT_BLOCKS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const promptBlocks = result.rows?.map(row => this.#parseBlockRow(row)) ?? [];\n\n return {\n promptBlocks,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Prompt Block Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n record: {\n id: input.id,\n blockId: input.blockId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n content: input.content,\n rules: input.rules ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<PromptBlockVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ? AND versionNumber = ?`,\n args: [blockId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_PROMPT_BLOCK_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [blockId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n try {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ?`,\n args: [blockId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_PROMPT_BLOCK_VERSIONS)} FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [blockId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE \"blockId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(blockId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_PROMPT_BLOCK_VERSIONS}\" WHERE blockId = ?`,\n args: [blockId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseBlockRow(row: Record<string, unknown>): StoragePromptBlockType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StoragePromptBlockType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): PromptBlockVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n blockId: row.blockId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n content: row.content as string,\n rules: safeParseJSON(row.rules) as PromptBlockVersion['rules'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ScorerDefinitionsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n SCORER_DEFINITIONS_SCHEMA,\n SCORER_DEFINITION_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n} from '@mastra/core/storage';\nimport type {\n ScorerDefinitionVersion,\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class ScorerDefinitionsLibSQL extends ScorerDefinitionsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORER_DEFINITIONS, schema: SCORER_DEFINITIONS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: SCORER_DEFINITION_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (scorerDefinitionId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_scorer_definition_versions_scorer_version ON \"${TABLE_SCORER_DEFINITION_VERSIONS}\" (\"scorerDefinitionId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SCORER_DEFINITIONS });\n await this.#db.deleteData({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n }\n\n // ==========================================================================\n // Scorer Definition CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITIONS)} FROM \"${TABLE_SCORER_DEFINITIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseScorerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n const { scorerDefinition } = input;\n try {\n const now = new Date();\n\n // Insert thin scorer definition record\n await this.#db.insert({\n tableName: TABLE_SCORER_DEFINITIONS,\n record: {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: null,\n authorId: scorerDefinition.authorId ?? null,\n metadata: scorerDefinition.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n scorerDefinitionId: scorerDefinition.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n return {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: scorerDefinition.authorId,\n metadata: scorerDefinition.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new Error(`Scorer definition with id ${id} not found`);\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n\n // Build update data for the scorer definition record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) updateData.activeVersionId = activeVersionId;\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...existing.metadata, ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_SCORER_DEFINITIONS,\n keys: { id },\n data: updateData,\n });\n\n // Fetch and return updated scorer definition\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Scorer definition ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SCORER_DEFINITIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (status) {\n conditions.push('status = ?');\n queryParams.push(status);\n }\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_SCORER_DEFINITIONS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\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_SCORER_DEFINITIONS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n scorerDefinitions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_SCORER_DEFINITIONS)} FROM \"${TABLE_SCORER_DEFINITIONS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const scorerDefinitions = result.rows?.map(row => this.#parseScorerRow(row)) ?? [];\n\n return {\n scorerDefinitions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Scorer Definition Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const now = new Date();\n await this.#db.insert({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n record: {\n id: input.id,\n scorerDefinitionId: input.scorerDefinitionId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n type: input.type,\n model: input.model ?? null,\n instructions: input.instructions ?? null,\n scoreRange: input.scoreRange ?? null,\n presetConfig: input.presetConfig ?? null,\n defaultSampling: input.defaultSampling ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now.toISOString(),\n },\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ? AND versionNumber = ?`,\n args: [scorerDefinitionId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SCORER_DEFINITION_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [scorerDefinitionId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n try {\n const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ?`,\n args: [scorerDefinitionId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_SCORER_DEFINITION_VERSIONS)} FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [scorerDefinitionId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE \"scorerDefinitionId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_SCORER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(scorerDefinitionId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SCORER_DEFINITION_VERSIONS}\" WHERE scorerDefinitionId = ?`,\n args: [scorerDefinitionId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseScorerRow(row: Record<string, unknown>): StorageScorerDefinitionType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StorageScorerDefinitionType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): ScorerDefinitionVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n scorerDefinitionId: row.scorerDefinitionId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n type: row.type as string as ScorerDefinitionVersion['type'],\n model: safeParseJSON(row.model) as ScorerDefinitionVersion['model'],\n instructions: (row.instructions as string) ?? undefined,\n scoreRange: safeParseJSON(row.scoreRange) as ScorerDefinitionVersion['scoreRange'],\n presetConfig: safeParseJSON(row.presetConfig) as ScorerDefinitionVersion['presetConfig'],\n defaultSampling: safeParseJSON(row.defaultSampling) as ScorerDefinitionVersion['defaultSampling'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\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 { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n TABLE_SCORERS,\n SCORERS_SCHEMA,\n ScoresStorage,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\nexport class ScoresLibSQL extends ScoresStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: SCORERS_SCHEMA });\n // Add columns for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_SCORERS,\n schema: SCORERS_SCHEMA,\n ifNotExists: ['spanId', 'requestContext'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SCORERS });\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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 */\n private transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row);\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SCORERS)} 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: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\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: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n\n await this.#db.insert({\n tableName: TABLE_SCORERS,\n record: {\n ...parsedScore,\n id,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\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<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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<ListScoresResponse> {\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 ${buildSelectColumns(TABLE_SCORERS)} 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 {\n SkillsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n SKILLS_SCHEMA,\n SKILL_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageSkillType,\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n} from '@mastra/core/storage';\nimport type {\n SkillVersion,\n CreateSkillVersionInput,\n ListSkillVersionsInput,\n ListSkillVersionsOutput,\n} from '@mastra/core/storage/domains/skills';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\n/**\n * Config fields that live on version rows (from StorageSkillSnapshotType).\n */\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'instructions',\n 'license',\n 'compatibility',\n 'source',\n 'references',\n 'scripts',\n 'assets',\n 'metadata',\n 'tree',\n] as const;\n\nexport class SkillsLibSQL extends SkillsStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SKILLS, schema: SKILLS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_SKILL_VERSIONS,\n schema: SKILL_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (skillId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_skill_versions_skill_version ON \"${TABLE_SKILL_VERSIONS}\" (\"skillId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_SKILLS });\n await this.#db.deleteData({ tableName: TABLE_SKILL_VERSIONS });\n }\n\n // ==========================================================================\n // Skill CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageSkillType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILLS)} FROM \"${TABLE_SKILLS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseSkillRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n const { skill } = input;\n try {\n const now = new Date();\n\n // Insert thin skill record (no metadata on entity table)\n await this.#db.insert({\n tableName: TABLE_SKILLS,\n record: {\n id: skill.id,\n status: 'draft',\n activeVersionId: null,\n authorId: skill.authorId ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, ...snapshotConfig } = skill;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n skillId: skill.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned skill record\n await this.#db.delete({ tableName: TABLE_SKILLS, keys: { id: skill.id } });\n throw versionError;\n }\n\n return {\n id: skill.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: skill.authorId,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Skill ${id} not found`,\n details: { skillId: id },\n });\n }\n\n const { authorId, activeVersionId, status, ...configFields } = updates;\n\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Build update data for the skill record (no metadata on entity table)\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) {\n updateData.status = 'published';\n }\n }\n if (status !== undefined) updateData.status = status;\n\n await this.#db.update({\n tableName: TABLE_SKILLS,\n keys: { id },\n data: updateData,\n });\n\n // If config fields changed, create a new version\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `No versions found for skill ${id}`,\n details: { skillId: id },\n });\n }\n\n const {\n id: _versionId,\n skillId: _skillId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n skillId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Fetch and return updated skill\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Skill ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILLS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n // Note: metadata filter is ignored for skills since the entity table doesn't have a metadata column.\n // Metadata lives on the version table.\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_SKILLS}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n skills: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_SKILLS)} FROM \"${TABLE_SKILLS}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const skills = result.rows?.map(row => this.#parseSkillRow(row)) ?? [];\n\n return {\n skills,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SKILLS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Skill Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n try {\n const now = new Date();\n // Use raw SQL because \"references\" is a SQL reserved word and needs quoting\n await this.#client.execute({\n sql: `INSERT INTO \"${TABLE_SKILL_VERSIONS}\" (\n id, \"skillId\", \"versionNumber\",\n name, description, instructions, license, compatibility,\n source, \"references\", scripts, assets, metadata, tree,\n \"changedFields\", \"changeMessage\", \"createdAt\"\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n input.id,\n input.skillId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.instructions ?? null,\n input.license ?? null,\n input.compatibility ? JSON.stringify(input.compatibility) : null,\n input.source ? JSON.stringify(input.source) : null,\n input.references ? JSON.stringify(input.references) : null,\n input.scripts ? JSON.stringify(input.scripts) : null,\n input.assets ? JSON.stringify(input.assets) : null,\n input.metadata ? JSON.stringify(input.metadata) : null,\n input.tree ? JSON.stringify(input.tree) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n now.toISOString(),\n ],\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<SkillVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ? AND versionNumber = ?`,\n args: [skillId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_SKILL_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ? ORDER BY versionNumber DESC LIMIT 1`,\n args: [skillId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n try {\n const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ?`,\n args: [skillId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_SKILL_VERSIONS)} FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [skillId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILL_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_SKILL_VERSIONS}\" WHERE \"skillId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_SKILL_VERSIONS_BY_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(skillId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_SKILL_VERSIONS}\" WHERE skillId = ?`,\n args: [skillId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseSkillRow(row: Record<string, unknown>): StorageSkillType {\n return {\n id: row.id as string,\n status: (row.status as StorageSkillType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): SkillVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n skillId: row.skillId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n instructions: (row.instructions as string) ?? undefined,\n license: (row.license as string) ?? undefined,\n compatibility: safeParseJSON(row.compatibility) as SkillVersion['compatibility'],\n source: safeParseJSON(row.source) as SkillVersion['source'],\n references: safeParseJSON(row.references) as SkillVersion['references'],\n scripts: safeParseJSON(row.scripts) as SkillVersion['scripts'],\n assets: safeParseJSON(row.assets) as SkillVersion['assets'],\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n tree: safeParseJSON(row.tree) as SkillVersion['tree'],\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type { WorkflowRunState, StepResult } from '@mastra/core/workflows';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { createExecuteWriteOperationWithRetry } from '../../db/utils';\n\nexport class WorkflowsLibSQL extends WorkflowsStorage {\n #db: LibSQLDB;\n #client: Client;\n private readonly executeWithRetry: <T>(operationFn: () => Promise<T>, operationDescription: string) => Promise<T>;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n const maxRetries = config.maxRetries ?? 5;\n const initialBackoffMs = config.initialBackoffMs ?? 500;\n\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries, initialBackoffMs });\n this.executeWithRetry = createExecuteWriteOperationWithRetry({\n logger: this.logger,\n maxRetries,\n initialBackoffMs,\n });\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 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 this.logger.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\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_WORKFLOW_SNAPSHOT });\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 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 json(snapshot) as 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 // Upsert the snapshot within the same transaction\n const now = new Date().toISOString();\n await tx.execute({\n sql: `INSERT INTO ${TABLE_WORKFLOW_SNAPSHOT} (workflow_name, run_id, snapshot, createdAt, updatedAt)\n VALUES (?, ?, jsonb(?), ?, ?)\n ON CONFLICT(workflow_name, run_id)\n DO UPDATE SET snapshot = excluded.snapshot, updatedAt = excluded.updatedAt`,\n args: [workflowName, runId, JSON.stringify(snapshot), now, now],\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 }, 'updateWorkflowResults');\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\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 json(snapshot) as 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 = jsonb(?) 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 }, 'updateWorkflowState');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }) {\n const now = new Date();\n const data = {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot,\n createdAt: createdAt ?? now,\n updatedAt: updatedAt ?? now,\n };\n\n this.logger.debug('Persisting workflow snapshot', { workflowName, runId, data });\n await this.#db.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.#db.select<{ 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 workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt 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 this.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 deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n return this.executeWithRetry(async () => {\n try {\n await this.#client.execute({\n sql: `DELETE FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,\n args: [workflowName, runId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }, 'deleteWorkflowRunById');\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.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push('resourceId = ?');\n args.push(resourceId);\n } else {\n this.logger.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 workflow_name, run_id, resourceId, json(snapshot) as snapshot, createdAt, updatedAt 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 => this.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 type { Client, InValue } from '@libsql/client';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n WorkspacesStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n WORKSPACES_SCHEMA,\n WORKSPACE_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n StorageWorkspaceType,\n StorageCreateWorkspaceInput,\n StorageUpdateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n} from '@mastra/core/storage';\nimport type {\n WorkspaceVersion,\n CreateWorkspaceVersionInput,\n ListWorkspaceVersionsInput,\n ListWorkspaceVersionsOutput,\n} from '@mastra/core/storage/domains/workspaces';\nimport { LibSQLDB, resolveClient } from '../../db';\nimport type { LibSQLDomainConfig } from '../../db';\nimport { buildSelectColumns } from '../../db/utils';\n\n/**\n * Config fields that live on version rows (from StorageWorkspaceSnapshotType).\n */\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'filesystem',\n 'sandbox',\n 'mounts',\n 'search',\n 'skills',\n 'tools',\n 'autoSync',\n 'operationTimeout',\n] as const;\n\nexport class WorkspacesLibSQL extends WorkspacesStorage {\n #db: LibSQLDB;\n #client: Client;\n\n constructor(config: LibSQLDomainConfig) {\n super();\n const client = resolveClient(config);\n this.#client = client;\n this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_WORKSPACES, schema: WORKSPACES_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_WORKSPACE_VERSIONS,\n schema: WORKSPACE_VERSIONS_SCHEMA,\n });\n\n // Unique constraint on (workspaceId, versionNumber) to prevent duplicate versions from concurrent updates\n await this.#client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_versions_workspace_version ON \"${TABLE_WORKSPACE_VERSIONS}\" (\"workspaceId\", \"versionNumber\")`,\n );\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.deleteData({ tableName: TABLE_WORKSPACES });\n await this.#db.deleteData({ tableName: TABLE_WORKSPACE_VERSIONS });\n }\n\n // ==========================================================================\n // Workspace CRUD\n // ==========================================================================\n\n async getById(id: string): Promise<StorageWorkspaceType | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACES)} FROM \"${TABLE_WORKSPACES}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseWorkspaceRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async create(input: { workspace: StorageCreateWorkspaceInput }): Promise<StorageWorkspaceType> {\n const { workspace } = input;\n try {\n const now = new Date();\n\n // Insert thin workspace record\n await this.#db.insert({\n tableName: TABLE_WORKSPACES,\n record: {\n id: workspace.id,\n status: 'draft',\n activeVersionId: null,\n authorId: workspace.authorId ?? null,\n metadata: workspace.metadata ?? null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n // Extract config fields for version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;\n const versionId = crypto.randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n workspaceId: workspace.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (versionError) {\n // Clean up the orphaned workspace record\n await this.#db.delete({ tableName: TABLE_WORKSPACES, keys: { id: workspace.id } });\n throw versionError;\n }\n\n return {\n id: workspace.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: workspace.authorId,\n metadata: workspace.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateWorkspaceInput): Promise<StorageWorkspaceType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_WORKSPACE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Workspace ${id} not found`,\n details: { workspaceId: id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Build update data for the workspace record\n const updateData: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) {\n updateData.status = 'published';\n }\n }\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) {\n updateData.metadata = { ...(existing.metadata || {}), ...metadata };\n }\n\n await this.#db.update({\n tableName: TABLE_WORKSPACES,\n keys: { id },\n data: updateData,\n });\n\n // If config fields changed, create a new version\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new Error(`No versions found for workspace ${id}`);\n }\n\n const {\n id: _versionId,\n workspaceId: _workspaceId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n workspaceId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Fetch and return updated workspace\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'UPDATE_WORKSPACE', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Workspace ${id} not found after update`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'UPDATE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.deleteVersionsByParentId(id);\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_WORKSPACES}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListWorkspacesInput): Promise<StorageListWorkspacesOutput> {\n try {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: InValue[] = [];\n\n if (authorId !== undefined) {\n conditions.push('authorId = ?');\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n for (const [key, value] of Object.entries(metadata)) {\n // Sanitize key to prevent SQL injection via json_extract path\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('LIBSQL', 'LIST_WORKSPACES', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n conditions.push(`json_extract(metadata, '$.${key}') = ?`);\n queryParams.push(typeof value === 'string' ? value : JSON.stringify(value));\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_WORKSPACES}\" ${whereClause}`,\n args: queryParams,\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n workspaces: [],\n total: 0,\n page,\n perPage: perPageInput ?? 100,\n hasMore: false,\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 ${buildSelectColumns(TABLE_WORKSPACES)} FROM \"${TABLE_WORKSPACES}\" ${whereClause} ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [...queryParams, limitValue, start],\n });\n\n const workspaces = result.rows?.map(row => this.#parseWorkspaceRow(row)) ?? [];\n\n return {\n workspaces,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_WORKSPACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Workspace Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n try {\n const now = new Date();\n await this.#client.execute({\n sql: `INSERT INTO \"${TABLE_WORKSPACE_VERSIONS}\" (\n id, \"workspaceId\", \"versionNumber\",\n name, description, filesystem, sandbox, mounts, search, skills, tools,\n \"autoSync\", \"operationTimeout\",\n \"changedFields\", \"changeMessage\", \"createdAt\"\n) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n input.id,\n input.workspaceId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.filesystem ? JSON.stringify(input.filesystem) : null,\n input.sandbox ? JSON.stringify(input.sandbox) : null,\n input.mounts ? JSON.stringify(input.mounts) : null,\n input.search ? JSON.stringify(input.search) : null,\n input.skills ? JSON.stringify(input.skills) : null,\n input.tools ? JSON.stringify(input.tools) : null,\n input.autoSync ? 1 : 0,\n input.operationTimeout ?? null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n now.toISOString(),\n ],\n });\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'CREATE_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<WorkspaceVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE id = ?`,\n args: [id],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(workspaceId: string, versionNumber: number): Promise<WorkspaceVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ? AND \"versionNumber\" = ?`,\n args: [workspaceId, versionNumber],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_WORKSPACE_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getLatestVersion(workspaceId: string): Promise<WorkspaceVersion | null> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ? ORDER BY \"versionNumber\" DESC LIMIT 1`,\n args: [workspaceId],\n });\n const row = result.rows?.[0];\n return row ? this.#parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'GET_LATEST_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListWorkspaceVersionsInput): Promise<ListWorkspaceVersionsOutput> {\n try {\n const { workspaceId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Get total count\n const countResult = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ?`,\n args: [workspaceId],\n });\n const total = Number(countResult.rows?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageInput ?? 20,\n hasMore: false,\n };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\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 ${buildSelectColumns(TABLE_WORKSPACE_VERSIONS)} FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ? ORDER BY ${field} ${direction} LIMIT ? OFFSET ?`,\n args: [workspaceId, limitValue, start],\n });\n\n const versions = result.rows?.map(row => this.#parseVersionRow(row)) ?? [];\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'LIST_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"id\" = ?`,\n args: [id],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.#client.execute({\n sql: `DELETE FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ?`,\n args: [entityId],\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'DELETE_WORKSPACE_VERSIONS_BY_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async countVersions(workspaceId: string): Promise<number> {\n try {\n const result = await this.#client.execute({\n sql: `SELECT COUNT(*) as count FROM \"${TABLE_WORKSPACE_VERSIONS}\" WHERE \"workspaceId\" = ?`,\n args: [workspaceId],\n });\n return Number(result.rows?.[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('LIBSQL', 'COUNT_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helpers\n // ==========================================================================\n\n #parseWorkspaceRow(row: Record<string, unknown>): StorageWorkspaceType {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n status: (row.status as StorageWorkspaceType['status']) ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n metadata: safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: new Date(row.createdAt as string),\n updatedAt: new Date(row.updatedAt as string),\n };\n }\n\n #parseVersionRow(row: Record<string, unknown>): WorkspaceVersion {\n const safeParseJSON = (val: unknown): unknown => {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n\n return {\n id: row.id as string,\n workspaceId: row.workspaceId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n filesystem: safeParseJSON(row.filesystem) as WorkspaceVersion['filesystem'],\n sandbox: safeParseJSON(row.sandbox) as WorkspaceVersion['sandbox'],\n mounts: safeParseJSON(row.mounts) as WorkspaceVersion['mounts'],\n search: safeParseJSON(row.search) as WorkspaceVersion['search'],\n skills: safeParseJSON(row.skills) as WorkspaceVersion['skills'],\n tools: safeParseJSON(row.tools) as WorkspaceVersion['tools'],\n autoSync: Boolean(row.autoSync),\n operationTimeout: row.operationTimeout != null ? Number(row.operationTimeout) : undefined,\n changedFields: safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: new Date(row.createdAt as string),\n };\n }\n}\n","import { createClient } from '@libsql/client';\nimport type { Client } from '@libsql/client';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { MastraCompositeStore } from '@mastra/core/storage';\n\nimport { AgentsLibSQL } from './domains/agents';\nimport { BlobsLibSQL } from './domains/blobs';\nimport { DatasetsLibSQL } from './domains/datasets';\nimport { ExperimentsLibSQL } from './domains/experiments';\nimport { MCPClientsLibSQL } from './domains/mcp-clients';\nimport { MCPServersLibSQL } from './domains/mcp-servers';\nimport { MemoryLibSQL } from './domains/memory';\nimport { ObservabilityLibSQL } from './domains/observability';\nimport { PromptBlocksLibSQL } from './domains/prompt-blocks';\nimport { ScorerDefinitionsLibSQL } from './domains/scorer-definitions';\nimport { ScoresLibSQL } from './domains/scores';\nimport { SkillsLibSQL } from './domains/skills';\nimport { WorkflowsLibSQL } from './domains/workflows';\nimport { WorkspacesLibSQL } from './domains/workspaces';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsLibSQL,\n BlobsLibSQL,\n DatasetsLibSQL,\n ExperimentsLibSQL,\n MCPClientsLibSQL,\n MCPServersLibSQL,\n MemoryLibSQL,\n ObservabilityLibSQL,\n PromptBlocksLibSQL,\n ScorerDefinitionsLibSQL,\n ScoresLibSQL,\n SkillsLibSQL,\n WorkflowsLibSQL,\n WorkspacesLibSQL,\n};\nexport type { LibSQLDomainConfig } from './db';\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\n/**\n * LibSQL/Turso storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new LibSQLStore({ id: 'my-store', url: 'file:./dev.db' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class LibSQLStore extends MastraCompositeStore {\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 domainConfig = {\n client: this.client,\n maxRetries: this.maxRetries,\n initialBackoffMs: this.initialBackoffMs,\n };\n\n const scores = new ScoresLibSQL(domainConfig);\n const workflows = new WorkflowsLibSQL(domainConfig);\n const memory = new MemoryLibSQL(domainConfig);\n const observability = new ObservabilityLibSQL(domainConfig);\n const agents = new AgentsLibSQL(domainConfig);\n const datasets = new DatasetsLibSQL(domainConfig);\n const experiments = new ExperimentsLibSQL(domainConfig);\n const promptBlocks = new PromptBlocksLibSQL(domainConfig);\n const scorerDefinitions = new ScorerDefinitionsLibSQL(domainConfig);\n const mcpClients = new MCPClientsLibSQL(domainConfig);\n const mcpServers = new MCPServersLibSQL(domainConfig);\n const workspaces = new WorkspacesLibSQL(domainConfig);\n const skills = new SkillsLibSQL(domainConfig);\n const blobs = new BlobsLibSQL(domainConfig);\n\n this.stores = {\n scores,\n workflows,\n memory,\n observability,\n agents,\n datasets,\n experiments,\n promptBlocks,\n scorerDefinitions,\n mcpClients,\n mcpServers,\n workspaces,\n skills,\n blobs,\n };\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"]}
|