@mastra/mysql 0.13.3-alpha.0 → 0.14.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["TABLE_SCHEMAS","StoreOperations","TABLE_CONFIGS","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","MastraError","ErrorDomain","ErrorCategory","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","AGENTS_SCHEMA","AGENT_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","TABLE_FAVORITES","parseJson","BackgroundTasksStorage","TABLE_BACKGROUND_TASKS","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","TABLE_SKILL_BLOBS","BlobStore","SKILL_BLOBS_SCHEMA","#insertArgs","#parseRow","ChannelsStorage","TABLE_CHANNEL_INSTALLATIONS","TABLE_CHANNEL_CONFIG","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","parseJSON","DATASET_ITEMS_SCHEMA","DatasetsStorage","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","MastraError","ErrorDomain","ErrorCategory","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","DATASETS_SCHEMA","DATASET_VERSIONS_SCHEMA","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","#rejectToolMocks","parseJSON","ExperimentsStorage","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","#withPurgeBarrier","TABLE_DATASETS","TABLE_DATASET_ITEMS","#ensureExperimentResultNaturalKey","MastraError","ErrorDomain","ErrorCategory","EXPERIMENTS_SCHEMA","EXPERIMENT_RESULTS_SCHEMA","TABLE_AGENTS","TABLE_SKILLS","FavoritesStorage","TABLE_FAVORITES","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","FAVORITES_SCHEMA","MastraError","ErrorDomain","ErrorCategory","parseJson","TABLE_KNOWLEDGE_NODES","TABLE_KNOWLEDGE_RECORDS","TABLE_KNOWLEDGE_MENTIONS","TABLE_KNOWLEDGE_ACTIVITY","TABLE_KNOWLEDGE_SEMANTIC_OUTBOX","KnowledgeStorage","KNOWLEDGE_NODES_SCHEMA","KNOWLEDGE_RECORDS_SCHEMA","KNOWLEDGE_MENTIONS_SCHEMA","KNOWLEDGE_ACTIVITY_SCHEMA","KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA","#pool","#client","#operations","#transaction","#getNodeByName","#resolveTerminalNode","#replaceMentions","#activity","#outbox","#getNode","#resolveNode","KnowledgeNotFoundError","KnowledgeConflictError","#queryKnowledge","#getKnowledge","MCPClientsStorage","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","MCP_CLIENTS_SCHEMA","MCP_CLIENT_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","MCPServersStorage","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","MCP_SERVERS_SCHEMA","MCP_SERVER_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","RunFenceConflictError","TABLE_MEMORY_RUN_FENCES","RUN_ID","OWNER_ID","MastraError","ErrorDomain","ErrorCategory","parseJSON","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","#skipDefaultIndexes","#indexes","#assertFence","TABLE_SCHEMAS","RUN_FENCING_TABLE_SCHEMAS","OBSERVATIONAL_MEMORY_TABLE_SCHEMA","#readThread","#fenced","MessageList","#insertResource","#insertReflectionGeneration","ObservabilityStorage","TABLE_SPANS","#skipDefaultIndexes","#indexes","SPAN_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","listTracesArgsSchema","TraceStatus","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","#skipDefaultIndexes","#indexes","PROMPT_BLOCKS_SCHEMA","PROMPT_BLOCK_VERSIONS_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","SchedulesStorage","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","#skipDefaultIndexes","#indexes","SCORER_DEFINITIONS_SCHEMA","SCORER_DEFINITION_VERSIONS_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","ScoresStorage","TABLE_SCORERS","#skipDefaultIndexes","#indexes","SCORERS_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","SNAPSHOT_FIELDS","SkillsStorage","TABLE_SKILLS","TABLE_SKILL_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","SKILLS_SCHEMA","SKILL_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","TABLE_FAVORITES","ToolProviderConnectionsStorage","TABLE_TOOL_PROVIDER_CONNECTIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","TOOL_PROVIDER_CONNECTIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","TABLE_WORKFLOW_DEFINITIONS","WorkflowDefinitionsStorage","WORKFLOW_DEFINITIONS_SCHEMA","TABLE_WORKFLOW_RUN_OWNERS","WorkflowsStorage","TABLE_WORKFLOW_SNAPSHOT","TABLE_SCHEMAS","RUN_FENCING_TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","MastraError","ErrorDomain","ErrorCategory","#ownershipError","WorkspacesStorage","TABLE_WORKSPACES","TABLE_WORKSPACE_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","WORKSPACES_SCHEMA","WORKSPACE_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","MastraCompositeStore","MastraError","ErrorDomain","ErrorCategory"],"sources":["../src/storage/db/schema-snapshot.ts","../src/storage/domains/utils.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/channels/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/favorites/index.ts","../src/storage/domains/knowledge/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/mcp-servers/index.ts","../../../packages/_internal-core/dist/memory/index.js","../src/storage/db/run-fencing.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/schedules/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/tool-provider-connections/index.ts","../src/storage/domains/workflow-definitions/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/domains/workspaces/index.ts","../src/storage/index.ts"],"sourcesContent":["import type { Pool, RowDataPacket } from 'mysql2/promise';\n\n/**\n * A read-only picture of one MySQL schema's catalog, taken once at the start of\n * `MySQLStore.init()`.\n *\n * Before this existed, every domain's init converged its own tables by asking\n * the server: a `SELECT COUNT(*)` table probe and a column-list probe per\n * table, an `information_schema.STATISTICS` probe per index, plus raw\n * `CREATE INDEX` statements whose duplicate errors were swallowed. On an\n * already-converged schema that is over a hundred statements that change\n * nothing, each one a client-server round trip.\n *\n * The snapshot answers all of those questions locally instead, from three\n * catalog reads. It only ever answers per-object presence questions (\"is this\n * table/column/index present?\"), never whole-schema equality: convergence is\n * additive, so an older client against a newer schema must still read as\n * converged.\n *\n * **Init-scoped by design.** The snapshot is installed on the store's shared\n * operations domain for exactly the init() window and cleared in the same\n * `finally`, so staleness is bounded to a single init() call and runtime code\n * paths keep querying the live catalog. It is deliberately *not* a\n * process-global cache (that shape was proposed for pg in PR #13960 and closed\n * unmerged): every init re-reads the catalog, so a schema that drifted out of\n * band between inits is still detected and healed. Consulting code maintains\n * the snapshot as it creates objects, so later domains in the same init see\n * what earlier ones created.\n *\n * Field reads are casing-agnostic (`row.TABLE_NAME ?? row.table_name`) because\n * mysql2 returns `information_schema` result keys uppercase on mysql:9.7 but\n * the casing can vary with server settings.\n */\nexport interface SchemaSnapshot {\n /** Schema the snapshot was taken from. */\n readonly schemaName: string;\n /** Lowercased names of tables present in the schema. */\n tables: Set<string>;\n /** lowercased table name -> lowercased column names present on that table. */\n columns: Map<string, Set<string>>;\n /**\n * `table.index` keys (both lowercased) for indexes present in the schema.\n * MySQL index names are unique per table, not per schema, so presence is\n * keyed the same way the STATISTICS probe matches: table plus index name.\n */\n indexes: Set<string>;\n}\n\n/** Builds the `table.index` presence key the snapshot uses. */\nexport function indexKey(table: string, index: string): string {\n return `${table.toLowerCase()}.${index.toLowerCase()}`;\n}\n\nconst lower = (value: unknown): string => String(value).toLowerCase();\n\n/**\n * Reads the catalog for `schemaName` in three queries. Returns null when no\n * schema name is available (a pool with no default database): correctness over\n * optimization, callers fall back to today's per-probe behavior.\n */\nexport async function loadSchemaSnapshot(pool: Pool, schemaName: string | undefined): Promise<SchemaSnapshot | null> {\n if (!schemaName) return null;\n\n const [[tableRows], [columnRows], [indexRows]] = await Promise.all([\n pool.execute<RowDataPacket[]>(`SELECT table_name FROM information_schema.tables WHERE table_schema = ?`, [\n schemaName,\n ]),\n pool.execute<RowDataPacket[]>(\n `SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = ?`,\n [schemaName],\n ),\n pool.execute<RowDataPacket[]>(\n `SELECT DISTINCT table_name, index_name FROM information_schema.statistics WHERE table_schema = ?`,\n [schemaName],\n ),\n ]);\n\n const tables = new Set<string>();\n for (const row of tableRows ?? []) {\n tables.add(lower(row.table_name ?? row.TABLE_NAME));\n }\n\n const columns = new Map<string, Set<string>>();\n for (const row of columnRows ?? []) {\n const table = lower(row.table_name ?? row.TABLE_NAME);\n let set = columns.get(table);\n if (!set) {\n set = new Set<string>();\n columns.set(table, set);\n }\n set.add(lower(row.column_name ?? row.COLUMN_NAME));\n }\n\n const indexes = new Set<string>();\n for (const row of indexRows ?? []) {\n indexes.add(indexKey(lower(row.table_name ?? row.TABLE_NAME), lower(row.index_name ?? row.INDEX_NAME)));\n }\n\n return { schemaName, tables, columns, indexes };\n}\n","import { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nexport type SqlParam = any;\n\nexport function quoteIdentifier(value: string, context: string): string {\n return `\\`${parseSqlIdentifier(value, context)}\\``;\n}\n\nexport function formatTableName(tableName: TABLE_NAMES, database?: string): string {\n const tableIdent = quoteIdentifier(tableName, 'table name');\n if (!database) {\n return tableIdent;\n }\n return `${quoteIdentifier(database, 'database name')}.${tableIdent}`;\n}\n\nexport function prepareWhereClause(filters: Record<string, any>): { sql: string; args: SqlParam[] } {\n const conditions: string[] = [];\n const args: SqlParam[] = [];\n\n Object.entries(filters).forEach(([key, value]) => {\n if (value === undefined) return;\n\n if (key.endsWith('_gte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} >= ?`);\n args.push(transformToSqlValue(value));\n } else if (key.endsWith('_lte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} <= ?`);\n args.push(transformToSqlValue(value));\n } else if (key.endsWith('_like')) {\n const fieldName = key.slice(0, -5);\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} LIKE ?`);\n args.push(transformToSqlValue(value));\n } else if (key.endsWith('_in')) {\n const fieldName = key.slice(0, -3);\n const list = Array.isArray(value) ? value : [value];\n if (list.length === 0) {\n conditions.push('FALSE');\n } else {\n const placeholders = list.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} IN (${placeholders})`);\n args.push(...list.map(transformToSqlValue));\n }\n } else if (key.endsWith('_null')) {\n const fieldName = key.slice(0, -5);\n if (value === true) {\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} IS NULL`);\n } else if (value === false) {\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} IS NOT NULL`);\n }\n } else if (value === null) {\n conditions.push(`${quoteIdentifier(key, 'column name')} IS NULL`);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n conditions.push('FALSE');\n } else {\n const placeholders = value.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier(key, 'column name')} IN (${placeholders})`);\n args.push(...value.map(transformToSqlValue));\n }\n } else {\n conditions.push(`${quoteIdentifier(key, 'column name')} = ?`);\n args.push(transformToSqlValue(value));\n }\n });\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n}\n\nexport function transformToSqlValue(value: any): SqlParam {\n if (value === undefined || value === null) {\n return null;\n }\n if (value instanceof Date) {\n // MySQL DATETIME accepts 'YYYY-MM-DD HH:mm:ss.SSS' (no timezone). Preserve ms precision.\n return value.toISOString().slice(0, 23).replace('T', ' ');\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return value;\n}\n\nexport function prepareInsertOnlyStatement({\n tableName,\n record,\n database,\n}: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n const tableIdent = formatTableName(tableName, database);\n const columns = Object.keys(record);\n if (columns.length === 0) {\n throw new Error('Cannot prepare statement for empty record');\n }\n const columnIdentifiers = columns.map(column => quoteIdentifier(column, 'column name'));\n const values = columns.map(column => transformToSqlValue(record[column]));\n const placeholders = columns.map(() => '?').join(', ');\n\n return {\n sql: `INSERT INTO ${tableIdent} (${columnIdentifiers.join(', ')}) VALUES (${placeholders})`,\n args: values,\n };\n}\n\nexport function prepareStatement({\n tableName,\n record,\n database,\n}: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n const statement = prepareInsertOnlyStatement({ tableName, record, database });\n const columns = Object.keys(record).map(column => quoteIdentifier(column, 'column name'));\n const updateAssignments = columns.map(column => `${column} = ?`).join(', ');\n\n return {\n sql: `${statement.sql} ON DUPLICATE KEY UPDATE ${updateAssignments}`,\n args: [...statement.args, ...statement.args],\n };\n}\n\nexport function prepareUpdateStatement({\n tableName,\n updates,\n keys,\n database,\n}: {\n tableName: TABLE_NAMES;\n updates: Record<string, any>;\n keys: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n if (Object.keys(updates).length === 0) {\n throw new Error('Updates object cannot be empty');\n }\n const tableIdent = formatTableName(tableName, database);\n const setClause = Object.entries(updates)\n .map(([key]) => `${quoteIdentifier(key, 'column name')} = ?`)\n .join(', ');\n const updateValues = Object.values(updates).map(transformToSqlValue);\n const whereClause = prepareWhereClause(keys);\n\n return {\n sql: `UPDATE ${tableIdent} SET ${setClause}${whereClause.sql}`,\n args: [...updateValues, ...whereClause.args],\n };\n}\n\nexport function prepareDeleteStatement({\n tableName,\n keys,\n database,\n}: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n if (Object.keys(keys).length === 0) {\n throw new Error('Keys object cannot be empty for DELETE statement');\n }\n\n const tableIdent = formatTableName(tableName, database);\n const whereClause = prepareWhereClause(keys);\n\n return {\n sql: `DELETE FROM ${tableIdent}${whereClause.sql}`,\n args: whereClause.args,\n };\n}\n\nexport function transformFromSqlRow<T>({\n tableName,\n sqlRow,\n}: {\n tableName: TABLE_NAMES;\n sqlRow: Record<string, any>;\n}): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n\n Object.entries(sqlRow).forEach(([key, value]) => {\n const columnSchema = schema?.[key];\n\n if (columnSchema?.type === 'jsonb') {\n if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n } else if (columnSchema?.type === 'timestamp') {\n result[key] = value === null ? null : parseDateTime(value);\n } else if (columnSchema?.type === 'boolean') {\n result[key] = value === true || value === 1 || value === '1';\n } else {\n result[key] = value;\n }\n });\n\n return result as T;\n}\n\nexport function parseDateTime(value: Date | string | number | null | undefined): Date | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'number') {\n return new Date(value);\n }\n const str = String(value).trim();\n if (!str) return undefined;\n const normalized = str.includes('T') ? str : str.replace(' ', 'T');\n const withZone = /[zZ]|[+-]\\d\\d:?\\d\\d$/.test(normalized) ? normalized : `${normalized}Z`;\n return new Date(withZone);\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { StoreOperations, TABLE_CONFIGS, TABLE_SPANS, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES, CreateIndexOptions } from '@mastra/core/storage';\nimport type { Pool, PoolConnection, RowDataPacket } from 'mysql2/promise';\nimport { indexKey, loadSchemaSnapshot } from '../../db/schema-snapshot';\nimport type { SchemaSnapshot } from '../../db/schema-snapshot';\nimport {\n formatTableName,\n prepareDeleteStatement,\n prepareInsertOnlyStatement,\n prepareStatement,\n prepareUpdateStatement,\n prepareWhereClause,\n quoteIdentifier,\n transformFromSqlRow,\n transformToSqlValue,\n} from '../utils';\nimport type { SqlParam } from '../utils';\n\ntype WhereClause = {\n sql: string;\n args: SqlParam[];\n};\n\nexport class StoreOperationsMySQL extends StoreOperations {\n private pool: Pool;\n private database?: string;\n private resolvedDatabase?: string | null;\n\n /**\n * Init-scoped catalog snapshot (see db/schema-snapshot.ts). Installed by\n * MySQLStore.init() for exactly the init window and cleared in its finally;\n * null at runtime so non-init callers keep probing the live catalog.\n */\n private schemaSnapshot: SchemaSnapshot | null = null;\n\n constructor({ pool, database }: { pool: Pool; database?: string }) {\n super();\n this.pool = pool;\n this.database = database;\n this.resolvedDatabase = database ?? null;\n }\n\n /**\n * Loads and installs the init-scoped snapshot. A null load (no default\n * database) or a failed load leaves the snapshot uninstalled, so init\n * proceeds with today's per-probe behavior: correctness over optimization.\n */\n async loadInitSchemaSnapshot(): Promise<void> {\n try {\n this.schemaSnapshot = await loadSchemaSnapshot(this.pool, await this.getDatabase());\n } catch (error) {\n console.warn('Failed to load init schema snapshot, falling back to per-object probing:', error);\n this.schemaSnapshot = null;\n }\n }\n\n clearInitSchemaSnapshot(): void {\n this.schemaSnapshot = null;\n }\n\n /** Read by sibling domains (memory's raw index DDL) so snapshot state lives in exactly one place. */\n getInitSchemaSnapshot(): SchemaSnapshot | null {\n return this.schemaSnapshot;\n }\n\n getPool(): Pool {\n return this.pool;\n }\n\n async query<T = RowDataPacket>(sql: string, args: SqlParam[] = []): Promise<T[]> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, args.map(transformToSqlValue));\n return rows as unknown as T[];\n }\n\n private async getDatabase(): Promise<string | undefined> {\n if (this.resolvedDatabase !== null) {\n return this.resolvedDatabase ?? undefined;\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>('SELECT DATABASE() AS db');\n const db = rows[0]?.db as string | null;\n this.resolvedDatabase = db ?? null;\n return this.resolvedDatabase ?? undefined;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n // Consult the init-scoped snapshot instead of probing the server.\n const snapshotColumns = this.schemaSnapshot?.columns.get(table.toLowerCase());\n if (snapshotColumns) {\n return snapshotColumns.has(column.toLowerCase());\n }\n const db = await this.getDatabase();\n const params: SqlParam[] = [table, column];\n let sql =\n 'SELECT COUNT(*) as count FROM information_schema.columns WHERE table_name = ? AND (column_name = ? OR column_name = ? )';\n params.push(column.toLowerCase());\n if (db) {\n sql += ' AND table_schema = ?';\n params.push(db);\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n return Number(rows[0]?.count ?? 0) > 0;\n }\n\n protected getSqlType(type: StorageColumn['type'], opts?: { isKey?: boolean; isNullable?: boolean }): string {\n const isKey = Boolean(opts?.isKey);\n const _isNullable = opts?.isNullable ?? true;\n switch (type) {\n case 'text':\n // Keys should remain short and indexable\n if (isKey) {\n return 'VARCHAR(191)';\n }\n // For non-key text fields, prefer LONGTEXT to avoid truncation errors\n // (message content, snapshots, etc. can exceed small VARCHAR limits)\n return 'LONGTEXT';\n case 'uuid':\n return 'VARCHAR(36)';\n case 'timestamp':\n return 'DATETIME(6)';\n case 'jsonb':\n return 'JSON';\n case 'integer':\n return 'INT';\n case 'float':\n return 'DOUBLE';\n case 'bigint':\n return 'BIGINT';\n case 'boolean':\n return 'TINYINT(1)';\n default:\n return super.getSqlType(type);\n }\n }\n\n private buildColumnDefinition(tableName: TABLE_NAMES, columnName: string, column: StorageColumn): string {\n const parts: string[] = [];\n const isKeyColumn = column.primaryKey || this.isKeyColumn(tableName, columnName);\n const isNullable = column.nullable !== false;\n parts.push(\n `${quoteIdentifier(columnName, 'column name')} ${this.getSqlType(column.type, {\n isKey: Boolean(isKeyColumn),\n isNullable,\n })}`,\n );\n if (column.nullable === false) {\n parts.push('NOT NULL');\n const defaultClause = this.getDefaultClause(column.type, {\n isNullable,\n isKey: Boolean(isKeyColumn),\n });\n if (defaultClause) {\n parts.push(defaultClause);\n }\n }\n if (column.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n return parts.join(' ');\n }\n\n private getDefaultClause(\n type: StorageColumn['type'],\n { isNullable, isKey }: { isNullable: boolean; isKey: boolean },\n ): string | undefined {\n switch (type) {\n case 'jsonb':\n return undefined;\n case 'timestamp':\n return \"DEFAULT '1970-01-01 00:00:00'\";\n case 'text':\n return !isNullable && isKey ? \"DEFAULT ''\" : undefined;\n case 'boolean':\n return !isNullable ? 'DEFAULT 0' : undefined;\n default:\n return super.getDefaultValue(type);\n }\n }\n\n private getCreateTableSQL(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): string {\n const columns = Object.entries(schema).map(([name, column]) => this.buildColumnDefinition(tableName, name, column));\n const tableIdent = formatTableName(tableName, this.database);\n\n const extraConstraints: string[] = [];\n // Check if this table has a composite primary key defined in TABLE_CONFIGS\n const tableConfig = TABLE_CONFIGS[tableName];\n if (tableConfig?.compositePrimaryKey) {\n const pkColumns = tableConfig.compositePrimaryKey\n .map(col => quoteIdentifier(col, 'primary key column'))\n .join(', ');\n extraConstraints.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n // Hard-coded constraints for tables that rely on upsert behavior\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n extraConstraints.push(\n `PRIMARY KEY (${quoteIdentifier('workflow_name', 'column name')}, ${quoteIdentifier('run_id', 'column name')})`,\n );\n }\n if (tableName === TABLE_SPANS) {\n extraConstraints.push(\n `PRIMARY KEY (${quoteIdentifier('traceId', 'column name')}, ${quoteIdentifier('spanId', 'column name')})`,\n );\n }\n\n return `CREATE TABLE IF NOT EXISTS ${tableIdent} (${[...columns, ...extraConstraints].filter(Boolean).join(', ')}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`;\n }\n\n private isKeyColumn(tableName: TABLE_NAMES, columnName: string): boolean {\n if (columnName === 'id') {\n return true;\n }\n\n // Check if this column is part of a composite primary key\n const tableConfig = TABLE_CONFIGS[tableName];\n if (tableConfig?.compositePrimaryKey?.includes(columnName)) {\n return true;\n }\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT && (columnName === 'workflow_name' || columnName === 'run_id')) {\n return true;\n }\n\n if (tableName === TABLE_SPANS && (columnName === 'traceId' || columnName === 'spanId')) {\n return true;\n }\n\n return false;\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n // Consult the init-scoped snapshot instead of probing the server.\n const snapshot = this.schemaSnapshot;\n if (snapshot?.tables.has(tableName.toLowerCase())) {\n return;\n }\n const connection = await this.pool.getConnection();\n try {\n if (!snapshot) {\n const db = await this.getDatabase();\n const [t_rows] = await connection.query(\n 'SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?',\n [db ?? '', tableName],\n );\n const exists = Array.isArray(t_rows) && t_rows.length > 0 && (t_rows[0] as any).count > 0;\n if (exists) {\n return;\n }\n }\n const sql = this.getCreateTableSQL(tableName, schema);\n const [result] = await connection.execute(sql);\n // Maintain the snapshot so later domains in the same init see this table,\n // but only when the CREATE actually created it. warningStatus > 0 means\n // IF NOT EXISTS no-opped against a table the snapshot did not see (created\n // out of band after the catalog read); leaving it out of the snapshot\n // makes later consults fall back to probing the live catalog for it.\n const created = (result as { warningStatus?: number } | undefined)?.warningStatus === 0;\n if (snapshot && created) {\n const table = tableName.toLowerCase();\n snapshot.tables.add(table);\n snapshot.columns.set(table, new Set(Object.keys(schema).map(column => column.toLowerCase())));\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.pool.execute(`DROP TABLE IF EXISTS ${formatTableName(tableName, this.database)}`);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async pruneBatch({\n tableName,\n column,\n cutoff,\n limit,\n }: {\n tableName: TABLE_NAMES;\n column: string;\n cutoff: Date | number;\n limit: number;\n }): Promise<number> {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(column)) {\n throw new Error(`Invalid retention identifier: ${tableName}.${column}`);\n }\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(`Retention batch limit must be a positive safe integer; received ${limit}`);\n }\n const [result] = await this.pool.execute(\n `DELETE FROM ${formatTableName(tableName, this.database)} WHERE ${quoteIdentifier(column, 'column name')} < ? ORDER BY ${quoteIdentifier(column, 'column name')} LIMIT ${limit}`,\n [cutoff],\n );\n return Number((result as { affectedRows?: number }).affectedRows ?? 0);\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.pool.execute(`DELETE FROM ${formatTableName(tableName, this.database)}`);\n } catch (error) {\n // Ignore table not exists errors\n if ((error as any)?.code === 'ER_NO_SUCH_TABLE') {\n return;\n }\n throw new MastraError(\n {\n id: 'MYSQL_STORE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async withTransaction<T>(fn: (connection: PoolConnection) => Promise<T>): Promise<T> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n const result = await fn(connection);\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback();\n throw error;\n } finally {\n connection.release();\n }\n }\n\n async createIndex(options: CreateIndexOptions): Promise<void> {\n const { name, table, columns, unique = false } = options;\n const tableName = formatTableName(table as TABLE_NAMES, this.database);\n const indexName = quoteIdentifier(name, 'index name');\n\n try {\n // Consult the init-scoped snapshot instead of probing the server.\n const snapshot = this.schemaSnapshot;\n if (snapshot) {\n if (snapshot.indexes.has(indexKey(table, name))) {\n return; // Index already exists\n }\n } else {\n // Check if index already exists\n const db = (await this.getDatabase()) ?? '';\n const [existing] = await this.pool.execute<RowDataPacket[]>(\n `SELECT 1 FROM information_schema.STATISTICS \n WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND INDEX_NAME = ?\n LIMIT 1`,\n [db, table, name],\n );\n\n if (existing.length > 0) {\n return; // Index already exists\n }\n }\n\n // Look up column data types so we can add prefix lengths for TEXT/BLOB\n // columns, which MySQL cannot index without an explicit key length.\n // (Cold path only: this runs when an index is actually being created.)\n const [columnMeta] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.COLUMNS\n WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?`,\n [(await this.getDatabase()) ?? '', table],\n );\n const dataTypeByColumn = new Map<string, string>(\n columnMeta.map(row => [String(row.COLUMN_NAME).toLowerCase(), String(row.DATA_TYPE).toLowerCase()]),\n );\n const PREFIX_TYPES = new Set([\n 'tinytext',\n 'text',\n 'mediumtext',\n 'longtext',\n 'blob',\n 'tinyblob',\n 'mediumblob',\n 'longblob',\n ]);\n const indexColumn = (colName: string): string => {\n const quoted = quoteIdentifier(colName, 'column name');\n const dataType = dataTypeByColumn.get(colName.toLowerCase());\n return dataType && PREFIX_TYPES.has(dataType) ? `${quoted}(191)` : quoted;\n };\n\n // Build column list\n const columnsStr = columns\n .map(col => {\n // Handle DESC/ASC modifiers\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n return `${indexColumn(colName!)} ${modifiers.join(' ')}`;\n }\n return indexColumn(col);\n })\n .join(', ');\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const sql = `CREATE ${uniqueStr}INDEX ${indexName} ON ${tableName} (${columnsStr})`;\n\n await this.pool.execute(sql);\n // Maintain the snapshot so later domains in the same init see this index.\n this.schemaSnapshot?.indexes.add(indexKey(table, name));\n } catch (error) {\n // Log but don't throw - indexes are performance optimizations\n console.warn(`Failed to create index ${name}:`, error);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const statement = prepareStatement({ tableName, record, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async insertOnly({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const statement = prepareInsertOnlyStatement({ tableName, record, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n try {\n await this.withTransaction(async connection => {\n for (const record of records) {\n const statement = prepareStatement({ tableName, record, database: this.database });\n await connection.execute(statement.sql, statement.args);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: records.length },\n },\n error,\n );\n }\n }\n\n async update({\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 try {\n const statement = prepareUpdateStatement({ tableName, updates: data, keys, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n items,\n }: {\n tableName: TABLE_NAMES;\n items: { keys: Record<string, any>; data: Record<string, any> }[];\n }): Promise<void> {\n if (items.length === 0) return;\n try {\n await this.withTransaction(async connection => {\n for (const item of items) {\n const statement = prepareUpdateStatement({\n tableName,\n updates: item.data,\n keys: item.keys,\n database: this.database,\n });\n await connection.execute(statement.sql, statement.args);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_BATCH_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: items.length },\n },\n error,\n );\n }\n }\n\n async batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any>[] }): Promise<void> {\n if (keys.length === 0) return;\n try {\n await this.withTransaction(async connection => {\n for (const key of keys) {\n const statement = prepareDeleteStatement({ tableName, keys: key, database: this.database });\n await connection.execute(statement.sql, statement.args);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_BATCH_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: keys.length },\n },\n error,\n );\n }\n }\n\n async delete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<void> {\n try {\n const statement = prepareDeleteStatement({ tableName, keys, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null> {\n try {\n const whereClause = prepareWhereClause(keys);\n const sql = `SELECT * FROM ${formatTableName(tableName, this.database)}${whereClause.sql} ORDER BY createdAt DESC LIMIT 1`;\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, whereClause.args.map(transformToSqlValue));\n if (!rows.length) {\n return null;\n }\n let record = transformFromSqlRow<R>({ tableName, sqlRow: rows[0] as any });\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshotRecord: any = record;\n if (typeof snapshotRecord.snapshot === 'string') {\n try {\n snapshotRecord.snapshot = JSON.parse(snapshotRecord.snapshot);\n } catch {}\n }\n record = snapshotRecord;\n }\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async loadMany<R>({\n tableName,\n whereClause,\n orderBy,\n offset,\n limit,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: WhereClause;\n orderBy?: string;\n offset?: number;\n limit?: number;\n }): Promise<R[]> {\n try {\n let sql = `SELECT * FROM ${formatTableName(tableName, this.database)}`;\n const args: SqlParam[] = [];\n\n if (whereClause?.sql) {\n sql += whereClause.sql;\n args.push(...whereClause.args.map(transformToSqlValue));\n }\n\n if (orderBy) {\n sql += ` ORDER BY ${sanitizeOrderBy(orderBy)}`;\n }\n\n if (typeof limit === 'number') {\n const safeLimit = Math.max(0, Number(limit));\n sql += ` LIMIT ${safeLimit}`;\n if (typeof offset === 'number') {\n const safeOffset = Math.max(0, Number(offset));\n sql += ` OFFSET ${safeOffset}`;\n }\n } else if (typeof offset === 'number') {\n const safeOffset = Math.max(0, Number(offset));\n sql += ` LIMIT 18446744073709551615 OFFSET ${safeOffset}`;\n }\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, args);\n return rows.map((row: RowDataPacket) => transformFromSqlRow<R>({ tableName, sqlRow: row as any }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_LOAD_MANY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async loadTotalCount({\n tableName,\n whereClause,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: WhereClause;\n }): Promise<number> {\n try {\n let sql = `SELECT COUNT(*) as count FROM ${formatTableName(tableName, this.database)}`;\n const args: SqlParam[] = [];\n if (whereClause?.sql) {\n sql += whereClause.sql;\n args.push(...whereClause.args.map(transformToSqlValue));\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, args);\n return Number(rows[0]?.count ?? 0);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_LOAD_TOTAL_COUNT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n if (!ifNotExists.length) return;\n\n // Consult the init-scoped snapshot instead of the two server probes. A\n // table the snapshot has no columns for is treated as unknown, not absent:\n // it may exist on the server without the snapshot having seen it (created\n // out of band after the catalog read), so those fall through to probing.\n const snapshotColumns = this.schemaSnapshot?.columns.get(tableName.toLowerCase());\n let existing: Set<string>;\n if (snapshotColumns) {\n existing = snapshotColumns;\n } else {\n // Check if table exists first\n const db = await this.getDatabase();\n const tableExistsSql =\n 'SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?';\n const [tableRows] = await this.pool.execute<RowDataPacket[]>(tableExistsSql, [db ?? '', tableName]);\n const tableExists = Array.isArray(tableRows) && tableRows.length > 0 && (tableRows[0] as any).count > 0;\n\n if (!tableExists) {\n return; // Silently return if table doesn't exist\n }\n\n const params: SqlParam[] = [tableName];\n let sql = 'SELECT column_name FROM information_schema.columns WHERE table_name = ?';\n if (db) {\n sql += ' AND table_schema = ?';\n params.push(db);\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n // MySQL returns information_schema fields with uppercase keys through mysql2, but the\n // casing can vary with server settings, so read whichever key shape is present.\n existing = new Set(\n (rows || []).map((row: RowDataPacket) => String(row.column_name ?? row.COLUMN_NAME).toLowerCase()),\n );\n }\n\n for (const columnName of ifNotExists) {\n if (existing.has(columnName.toLowerCase())) {\n continue;\n }\n const column = schema[columnName];\n if (!column) continue;\n\n const isNullable = column.nullable !== false;\n const isKeyColumn = Boolean(column.primaryKey) || this.isKeyColumn(tableName, columnName);\n const parts: string[] = [\n quoteIdentifier(columnName, 'column name'),\n this.getSqlType(column.type, { isKey: isKeyColumn, isNullable }),\n ];\n if (column.nullable === false) {\n parts.push('NOT NULL');\n const defaultClause = this.getDefaultClause(column.type, { isNullable, isKey: isKeyColumn });\n if (defaultClause) {\n parts.push(defaultClause);\n }\n }\n\n const alterSql = `ALTER TABLE ${formatTableName(tableName, this.database)} ADD COLUMN ${parts.join(' ')}`;\n try {\n await this.pool.execute(alterSql);\n // `existing` is the snapshot's own set when one is installed, so this maintains it.\n existing.add(columnName.toLowerCase());\n } catch (error) {\n if ((error as any)?.code === 'ER_DUP_FIELDNAME') {\n continue;\n }\n throw new MastraError(\n {\n id: 'MYSQL_STORE_ALTER_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, columnName },\n },\n error,\n );\n }\n }\n }\n}\n\nconst ORDER_BY_PATTERN = /^`[A-Za-z0-9_]+`(?:\\s+(ASC|DESC))?$/i;\n\nfunction sanitizeOrderBy(orderBy: string): string {\n const clauses = orderBy\n .split(',')\n .map(clause => clause.trim())\n .filter(Boolean);\n\n if (!clauses.length) {\n throw new Error('ORDER BY clause cannot be empty.');\n }\n\n clauses.forEach(clause => {\n if (!ORDER_BY_PATTERN.test(clause)) {\n throw new Error(`Invalid ORDER BY clause: ${clause}`);\n }\n });\n\n return clauses.join(', ');\n}\n\n/**\n * Generates MySQL CREATE TABLE SQL for export.\n * @param tableName - Table name\n * @param schema - Column definitions\n * @param compositePrimaryKey - Optional composite primary key columns\n */\nexport function generateTableSQL({\n tableName,\n schema,\n compositePrimaryKey,\n}: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n compositePrimaryKey?: string[];\n}): string {\n const tableIdent = formatTableName(tableName);\n const columns = Object.entries(schema).map(([name, def]) => {\n const colName = quoteIdentifier(name, 'column name');\n const constraints: string[] = [];\n if (def.primaryKey && !compositePrimaryKey?.includes(name)) constraints.push('PRIMARY KEY');\n if (!def.nullable) constraints.push('NOT NULL');\n const sqlType = mapToMySqlType(def.type, Boolean(def.primaryKey || compositePrimaryKey?.includes(name)));\n return `${colName} ${sqlType} ${constraints.join(' ')}`;\n });\n\n const tableConstraints: string[] = [];\n if (compositePrimaryKey) {\n const pkCols = compositePrimaryKey.map(c => quoteIdentifier(c, 'primary key column')).join(', ');\n tableConstraints.push(`PRIMARY KEY (${pkCols})`);\n }\n\n return `CREATE TABLE IF NOT EXISTS ${tableIdent} (\\n${[...columns, ...tableConstraints].join(',\\n')}\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`;\n}\n\n/**\n * Generates MySQL CREATE INDEX SQL for export.\n */\nexport function generateIndexSQL(options: CreateIndexOptions): string {\n const { name, table, columns, unique = false } = options;\n const tableName = formatTableName(table as TABLE_NAMES);\n const indexName = quoteIdentifier(name, 'index name');\n const uniqueStr = unique ? 'UNIQUE ' : '';\n\n const columnsStr = columns\n .map(col => {\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n return `${quoteIdentifier(colName!, 'column name')} ${modifiers.join(' ')}`;\n }\n return quoteIdentifier(col, 'column name');\n })\n .join(', ');\n\n return `CREATE ${uniqueStr}INDEX ${indexName} ON ${tableName} (${columnsStr});`;\n}\n\nfunction mapToMySqlType(type: StorageColumn['type'], isKey = false): string {\n switch (type) {\n case 'text':\n return isKey ? 'VARCHAR(191)' : 'TEXT';\n case 'timestamp':\n return 'DATETIME(3)';\n case 'bigint':\n return 'BIGINT';\n case 'integer':\n return 'INT';\n case 'float':\n return 'FLOAT';\n case 'boolean':\n return 'BOOLEAN';\n case 'uuid':\n return 'VARCHAR(36)';\n case 'jsonb':\n return 'JSON';\n default:\n return 'TEXT';\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n TABLE_FAVORITES,\n TABLE_SCHEMAS,\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 CreateIndexOptions,\n AgentVersion,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class AgentsMySQL extends AgentsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the agents domain tables.\n * Currently no default indexes are defined for agents.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] }),\n generateTableSQL({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (AgentsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the agents domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return AgentsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for agents.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for agents domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_AGENTS,\n schema: AGENTS_SCHEMA,\n ifNotExists: ['status', 'authorId', 'visibility', 'favoriteCount'],\n });\n await this.operations.alterTable({\n tableName: TABLE_AGENT_VERSIONS,\n schema: AGENT_VERSIONS_SCHEMA,\n ifNotExists: ['mcpClients', 'requestContextSchema', 'workspace', 'skills', 'skillsFormat', 'durable'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_AGENT_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_AGENTS });\n }\n\n private safeParseJSON<T = unknown>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n return value as T;\n }\n }\n return value as T;\n }\n\n private parseRow(row: Record<string, unknown>): StorageAgentType {\n return {\n id: row.id as string,\n status: (row.status as 'draft' | 'published' | 'archived') ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n visibility: (row.visibility as 'private' | 'public') ?? undefined,\n metadata: this.safeParseJSON(row.metadata),\n favoriteCount: row.favoriteCount === null || row.favoriteCount === undefined ? 0 : Number(row.favoriteCount),\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_AGENTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agent.id,\n status: 'draft',\n activeVersionId: null,\n authorId: agent.authorId ?? null,\n visibility: agent.visibility ?? null,\n metadata: agent.metadata ?? null,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n const versionId = crypto.randomUUID();\n try {\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 } catch (versionError) {\n try {\n await this.operations.delete({ tableName: TABLE_AGENTS, keys: { id: agent.id } });\n } catch (rollbackError) {\n // Log rollback failure but preserve original error\n console.error('Failed to rollback agent creation:', rollbackError);\n }\n throw versionError;\n }\n\n const created = await this.getById(agent.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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 const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\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.operations.update({\n tableName: TABLE_AGENTS,\n keys: { id },\n data: updateData,\n });\n\n const updatedAgent = await this.getById(id);\n if (!updatedAgent) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.deleteVersionsByParentId(id);\n await this.operations.delete({ tableName: TABLE_AGENTS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n metadata,\n status,\n visibility,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 // Empty entityIds is short-circuit: no rows possible\n if (entityIds && entityIds.length === 0) {\n return { agents: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const agentsTable = formatTableName(TABLE_AGENTS);\n const favoritesTable = formatTableName(TABLE_FAVORITES);\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n\n // Determine if we need a JOIN\n const joinUserId = pinFavoritedFor;\n const useJoin = Boolean(joinUserId);\n\n if (status) {\n conditions.push(`a.${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n }\n\n if (authorId !== undefined) {\n conditions.push(`a.${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\n }\n\n if (visibility !== undefined) {\n conditions.push(`a.${quoteIdentifier('visibility', 'column name')} = ?`);\n queryParams.push(visibility);\n }\n\n if (entityIds && entityIds.length > 0) {\n const placeholders = entityIds.map(() => '?').join(', ');\n conditions.push(`a.${quoteIdentifier('id', 'column name')} IN (${placeholders})`);\n queryParams.push(...entityIds);\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('MYSQL', '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 if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(a.${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(a.${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n // Handle favoritedOnly\n if (useJoin && favoritedOnly) {\n conditions.push(`sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL`);\n } else if (favoritedOnly) {\n // Defensive: favoritedOnly with no userId can never match a real row\n conditions.push('1=0');\n }\n\n const joinClause = useJoin\n ? `LEFT JOIN ${favoritesTable} sr ON sr.${quoteIdentifier('entityType', 'column name')} = 'agent' AND sr.${quoteIdentifier('entityId', 'column name')} = a.${quoteIdentifier('id', 'column name')} AND sr.${quoteIdentifier('userId', 'column name')} = ?`\n : '';\n\n const joinParams: any[] = useJoin && joinUserId ? [joinUserId] : [];\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const [countRows] = await this.pool.query<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${agentsTable} a ${joinClause} ${whereClause}`,\n [...joinParams, ...queryParams],\n );\n const total = parseInt(countRows[0]?.count ?? '0', 10);\n\n if (total === 0) {\n return {\n agents: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const hasMore = perPageInput === false ? false : offset + perPage < total;\n\n // Build ORDER BY\n let orderByClause: string;\n if (useJoin) {\n // Pin favorited agents first\n orderByClause = `CASE WHEN sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL THEN 0 ELSE 1 END ASC, a.${quoteIdentifier(field, 'column name')} ${direction}`;\n } else {\n orderByClause = `a.${quoteIdentifier(field, 'column name')} ${direction}`;\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>(\n `SELECT a.* FROM ${agentsTable} a ${joinClause} ${whereClause} ORDER BY ${orderByClause} LIMIT ? OFFSET ?`,\n [...joinParams, ...queryParams, limitValue, offset],\n );\n\n const agents = rows.map(row => this.parseRow(row));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.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 durable: input.durable ?? 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('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_AGENT_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [agentId, versionNumber],\n },\n limit: 1,\n });\n\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n args: [agentId],\n },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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 const whereClause = {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n args: [agentId],\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_AGENT_VERSIONS, whereClause });\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\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('MYSQL', '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.operations.delete({ tableName: TABLE_AGENT_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_AGENT_VERSIONS)} WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n args: [agentId],\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: Record<string, unknown>): AgentVersion {\n return {\n id: row.id as string,\n agentId: row.agentId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n instructions: this.deserializeInstructions(row.instructions as string),\n model: this.safeParseJSON(row.model) as AgentVersion['model'],\n tools: this.safeParseJSON(row.tools) as AgentVersion['tools'],\n defaultOptions: this.safeParseJSON(row.defaultOptions) as AgentVersion['defaultOptions'],\n workflows: this.safeParseJSON(row.workflows) as AgentVersion['workflows'],\n agents: this.safeParseJSON(row.agents) as AgentVersion['agents'],\n integrationTools: this.safeParseJSON(row.integrationTools) as AgentVersion['integrationTools'],\n inputProcessors: this.safeParseJSON(row.inputProcessors) as AgentVersion['inputProcessors'],\n outputProcessors: this.safeParseJSON(row.outputProcessors) as AgentVersion['outputProcessors'],\n memory: this.safeParseJSON(row.memory) as AgentVersion['memory'],\n scorers: this.safeParseJSON(row.scorers) as AgentVersion['scorers'],\n mcpClients: this.safeParseJSON(row.mcpClients) as AgentVersion['mcpClients'],\n requestContextSchema: this.safeParseJSON(row.requestContextSchema) as AgentVersion['requestContextSchema'],\n workspace: this.safeParseJSON(row.workspace) as AgentVersion['workspace'],\n skills: this.safeParseJSON(row.skills) as AgentVersion['skills'],\n skillsFormat: row.skillsFormat as 'xml' | 'json' | 'markdown' | undefined,\n durable: this.safeParseJSON(row.durable) as AgentVersion['durable'],\n changedFields: this.safeParseJSON(row.changedFields) as AgentVersion['changedFields'],\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n}\n","import type {\n BackgroundTask,\n BackgroundTaskStatus,\n TaskFilter,\n TaskListResult,\n UpdateBackgroundTask,\n UpdateBackgroundTaskOptions,\n} from '@mastra/core/background-tasks';\nimport { BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport type { Pool, ResultSetHeader, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier, transformToSqlValue } from '../utils';\n\nfunction serializeJson(v: unknown): any {\n if (typeof v === 'object' && v != null) return JSON.stringify(v);\n return v ?? null;\n}\n\nfunction parseJson(val: unknown): any {\n if (val == null) 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\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n return {\n id: String(row.id),\n status: String(row.status) as BackgroundTaskStatus,\n toolName: String(row.tool_name),\n toolCallId: String(row.tool_call_id),\n args: parseJson(row.args) ?? {},\n agentId: String(row.agent_id),\n threadId: row.thread_id != null ? String(row.thread_id) : undefined,\n resourceId: row.resource_id != null ? String(row.resource_id) : undefined,\n runId: String(row.run_id),\n result: parseJson(row.result),\n error: parseJson(row.error),\n suspendPayload: parseJson(row.suspend_payload),\n retryCount: Number(row.retry_count),\n maxRetries: Number(row.max_retries),\n timeoutMs: Number(row.timeout_ms),\n createdAt: parseDateTime(row.createdAt)!,\n startedAt: parseDateTime(row.startedAt),\n suspendedAt: parseDateTime(row.suspendedAt),\n completedAt: parseDateTime(row.completedAt),\n ownerId: row.ownerId != null ? String(row.ownerId) : undefined,\n leaseExpiresAt: parseDateTime(row.leaseExpiresAt),\n };\n}\n\nexport class BackgroundTasksMySQL extends BackgroundTasksStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_BACKGROUND_TASKS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (BackgroundTasksMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n });\n // Backfill columns added after the initial schema shipped.\n await this.operations.alterTable({\n tableName: TABLE_BACKGROUND_TASKS as any,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n ifNotExists: ['suspend_payload', 'suspendedAt', 'ownerId', 'leaseExpiresAt'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_bg_tasks_status_created_at_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['status', 'createdAt'],\n },\n {\n name: `${prefix}mastra_bg_tasks_agent_status_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['agent_id', 'status'],\n },\n {\n name: `${prefix}mastra_bg_tasks_thread_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['thread_id', 'createdAt'],\n },\n {\n name: `${prefix}mastra_bg_tasks_tool_call_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['tool_call_id'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n }),\n );\n\n for (const idx of BackgroundTasksMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return BackgroundTasksMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_BACKGROUND_TASKS)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('tool_call_id', 'column name')}, ${quoteIdentifier('tool_name', 'column name')}, ${quoteIdentifier('agent_id', 'column name')}, ${quoteIdentifier('thread_id', 'column name')}, ${quoteIdentifier('resource_id', 'column name')}, ${quoteIdentifier('run_id', 'column name')}, ${quoteIdentifier('status', 'column name')}, ${quoteIdentifier('args', 'column name')}, ${quoteIdentifier('result', 'column name')}, ${quoteIdentifier('error', 'column name')}, ${quoteIdentifier('suspend_payload', 'column name')}, ${quoteIdentifier('retry_count', 'column name')}, ${quoteIdentifier('max_retries', 'column name')}, ${quoteIdentifier('timeout_ms', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('startedAt', 'column name')}, ${quoteIdentifier('suspendedAt', 'column name')}, ${quoteIdentifier('completedAt', 'column name')}, ${quoteIdentifier('ownerId', 'column name')}, ${quoteIdentifier('leaseExpiresAt', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n task.id,\n task.toolCallId,\n task.toolName,\n task.agentId,\n task.threadId ?? null,\n task.resourceId ?? null,\n task.runId,\n task.status,\n JSON.stringify(task.args),\n task.result ? JSON.stringify(task.result) : null,\n task.error ? JSON.stringify(task.error) : null,\n task.suspendPayload ? JSON.stringify(task.suspendPayload) : null,\n task.retryCount,\n task.maxRetries,\n task.timeoutMs,\n transformToSqlValue(task.createdAt),\n transformToSqlValue(task.startedAt),\n transformToSqlValue(task.suspendedAt),\n transformToSqlValue(task.completedAt),\n task.ownerId ?? null,\n transformToSqlValue(task.leaseExpiresAt),\n ],\n );\n }\n\n async updateTask(\n taskId: string,\n update: UpdateBackgroundTask,\n options?: UpdateBackgroundTaskOptions,\n ): Promise<boolean> {\n const setClauses: string[] = [];\n const params: (string | number | null)[] = [];\n\n if ('status' in update) {\n setClauses.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(update.status as string);\n }\n if ('result' in update) {\n setClauses.push(`${quoteIdentifier('result', 'column name')} = ?`);\n params.push(serializeJson(update.result));\n }\n if ('error' in update) {\n setClauses.push(`${quoteIdentifier('error', 'column name')} = ?`);\n params.push(serializeJson(update.error));\n }\n if ('suspendPayload' in update) {\n setClauses.push(`${quoteIdentifier('suspend_payload', 'column name')} = ?`);\n params.push(serializeJson(update.suspendPayload));\n }\n if ('retryCount' in update) {\n setClauses.push(`${quoteIdentifier('retry_count', 'column name')} = ?`);\n params.push(update.retryCount as number);\n }\n if ('startedAt' in update) {\n setClauses.push(`${quoteIdentifier('startedAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.startedAt));\n }\n if ('suspendedAt' in update) {\n setClauses.push(`${quoteIdentifier('suspendedAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.suspendedAt));\n }\n if ('completedAt' in update) {\n setClauses.push(`${quoteIdentifier('completedAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.completedAt));\n }\n if ('ownerId' in update) {\n setClauses.push(`${quoteIdentifier('ownerId', 'column name')} = ?`);\n params.push(update.ownerId ?? null);\n }\n if ('leaseExpiresAt' in update) {\n setClauses.push(`${quoteIdentifier('leaseExpiresAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.leaseExpiresAt));\n }\n\n if (setClauses.length === 0) return false;\n\n params.push(taskId);\n const predicates: string[] = [];\n if (options?.expectedStatus) {\n predicates.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(options.expectedStatus);\n }\n if (options?.expectedOwnerId !== undefined) {\n if (options.expectedOwnerId === null) {\n predicates.push(`${quoteIdentifier('ownerId', 'column name')} IS NULL`);\n } else {\n predicates.push(`${quoteIdentifier('ownerId', 'column name')} = ?`);\n params.push(options.expectedOwnerId);\n }\n }\n if (options?.expectedLeaseExpiresAt !== undefined) {\n if (options.expectedLeaseExpiresAt === null) {\n predicates.push(`${quoteIdentifier('leaseExpiresAt', 'column name')} IS NULL`);\n } else {\n predicates.push(`${quoteIdentifier('leaseExpiresAt', 'column name')} = ?`);\n params.push(transformToSqlValue(options.expectedLeaseExpiresAt));\n }\n }\n const predicateSql = predicates.length > 0 ? ` AND ${predicates.join(' AND ')}` : '';\n const [result] = await this.pool.execute<ResultSetHeader>(\n `UPDATE ${formatTableName(TABLE_BACKGROUND_TASKS)} SET ${setClauses.join(', ')} WHERE ${quoteIdentifier('id', 'column name')} = ?${predicateSql}`,\n params,\n );\n return result.affectedRows > 0;\n }\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [taskId],\n );\n const row = rows[0];\n return row ? rowToTask(row as Record<string, any>) : null;\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n const placeholders = statuses.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier('status', 'column name')} IN (${placeholders})`);\n params.push(...statuses);\n }\n if (filter.agentId) {\n conditions.push(`${quoteIdentifier('agent_id', 'column name')} = ?`);\n params.push(filter.agentId);\n }\n if (filter.threadId) {\n conditions.push(`${quoteIdentifier('thread_id', 'column name')} = ?`);\n params.push(filter.threadId);\n }\n if (filter.runId) {\n conditions.push(`${quoteIdentifier('run_id', 'column name')} = ?`);\n params.push(filter.runId);\n }\n if (filter.resourceId) {\n conditions.push(`${quoteIdentifier('resource_id', 'column name')} = ?`);\n params.push(filter.resourceId);\n }\n if (filter.toolName) {\n conditions.push(`${quoteIdentifier('tool_name', 'column name')} = ?`);\n params.push(filter.toolName);\n }\n if (filter.toolCallId) {\n conditions.push(`${quoteIdentifier('tool_call_id', 'column name')} = ?`);\n params.push(filter.toolCallId);\n }\n // Date range filtering\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdentifier('startedAt', 'column name')\n : filter.dateFilterBy === 'suspendedAt'\n ? quoteIdentifier('suspendedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdentifier('completedAt', 'column name')\n : quoteIdentifier('createdAt', 'column name');\n if (filter.fromDate) {\n conditions.push(`${dateCol} >= ?`);\n params.push(transformToSqlValue(filter.fromDate));\n }\n if (filter.toDate) {\n conditions.push(`${dateCol} < ?`);\n params.push(transformToSqlValue(filter.toDate));\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Count total matching rows (before pagination)\n const [countRows] = await this.pool.query<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} ${where}`,\n [...params],\n );\n const total = Number(countRows[0]?.count ?? 0);\n\n const orderCol =\n filter.orderBy === 'startedAt'\n ? quoteIdentifier('startedAt', 'column name')\n : filter.orderBy === 'suspendedAt'\n ? quoteIdentifier('suspendedAt', 'column name')\n : filter.orderBy === 'completedAt'\n ? quoteIdentifier('completedAt', 'column name')\n : quoteIdentifier('createdAt', 'column name');\n const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n\n let sql = `SELECT * FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} ${where} ORDER BY ${orderCol} ${direction}`;\n\n if (filter.perPage != null) {\n sql += ' LIMIT ?';\n params.push(filter.perPage);\n if (filter.page != null) {\n sql += ' OFFSET ?';\n params.push(filter.page * filter.perPage);\n }\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>(sql, params);\n return { tasks: rows.map(row => rowToTask(row as Record<string, any>)), total };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [taskId],\n );\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n const placeholders = statuses.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier('status', 'column name')} IN (${placeholders})`);\n params.push(...statuses);\n }\n // Date range filtering\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdentifier('startedAt', 'column name')\n : filter.dateFilterBy === 'suspendedAt'\n ? quoteIdentifier('suspendedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdentifier('completedAt', 'column name')\n : quoteIdentifier('createdAt', 'column name');\n if (filter.fromDate) {\n conditions.push(`${dateCol} >= ?`);\n params.push(transformToSqlValue(filter.fromDate));\n }\n if (filter.toDate) {\n conditions.push(`${dateCol} < ?`);\n params.push(transformToSqlValue(filter.toDate));\n }\n if (filter.agentId) {\n conditions.push(`${quoteIdentifier('agent_id', 'column name')} = ?`);\n params.push(filter.agentId);\n }\n if (filter.runId) {\n conditions.push(`${quoteIdentifier('run_id', 'column name')} = ?`);\n params.push(filter.runId);\n }\n\n if (conditions.length === 0) return; // Safety: don't delete everything\n\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${conditions.join(' AND ')}`,\n params,\n );\n }\n\n async getRunningCount(): Promise<number> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('status', 'column name')} = ?`,\n ['running'],\n );\n return Number(rows[0]?.count ?? 0);\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('status', 'column name')} = ? AND ${quoteIdentifier('agent_id', 'column name')} = ?`,\n ['running', agentId],\n );\n return Number(rows[0]?.count ?? 0);\n }\n}\n","import { BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformToSqlValue } from '../utils';\n\nconst INSERT_IGNORE_SQL = `INSERT IGNORE INTO ${formatTableName(TABLE_SKILL_BLOBS)} (${['hash', 'content', 'size', 'mimeType', 'createdAt'].map(column => quoteIdentifier(column, 'column name')).join(', ')}) VALUES (?, ?, ?, ?, ?)`;\n\nexport class BlobsMySQL extends BlobStore {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n\n constructor({ pool, operations }: { pool: Pool; operations: StoreOperationsMySQL }) {\n super();\n this.pool = pool;\n this.operations = operations;\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SKILL_BLOBS, schema: SKILL_BLOBS_SCHEMA });\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n await this.pool.execute(INSERT_IGNORE_SQL, this.#insertArgs(entry));\n }\n\n #insertArgs(entry: StorageBlobEntry) {\n return [\n entry.hash,\n entry.content,\n entry.size,\n entry.mimeType ?? null,\n transformToSqlValue(entry.createdAt ?? new Date()),\n ];\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} = ?`,\n [hash],\n );\n if (!rows.length) return null;\n return this.#parseRow(rows[0]!);\n }\n\n async has(hash: string): Promise<boolean> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT 1 FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} = ? LIMIT 1`,\n [hash],\n );\n return rows.length > 0;\n }\n\n async delete(hash: string): Promise<boolean> {\n const [result] = await this.pool.execute<any>(\n `DELETE FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} = ?`,\n [hash],\n );\n return result.affectedRows > 0;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n await this.operations.withTransaction(async connection => {\n for (const entry of entries) {\n await connection.execute(INSERT_IGNORE_SQL, this.#insertArgs(entry));\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 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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} IN (${placeholders})`,\n batch,\n );\n for (const row of 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.operations.clearTable({ 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: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n}\n","import {\n ChannelsStorage,\n TABLE_CHANNEL_INSTALLATIONS,\n TABLE_CHANNEL_CONFIG,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { ChannelInstallation, ChannelConfig, CreateIndexOptions } from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformToSqlValue, parseDateTime } from '../utils';\n\nexport class ChannelsMySQL extends ChannelsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ChannelsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_CHANNEL_INSTALLATIONS,\n schema: TABLE_SCHEMAS[TABLE_CHANNEL_INSTALLATIONS],\n });\n await this.operations.createTable({\n tableName: TABLE_CHANNEL_CONFIG,\n schema: TABLE_SCHEMAS[TABLE_CHANNEL_CONFIG],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_channel_installations_webhook`,\n table: TABLE_CHANNEL_INSTALLATIONS,\n columns: ['webhookId'],\n unique: true,\n },\n {\n name: `${prefix}idx_channel_installations_platform_agent`,\n table: TABLE_CHANNEL_INSTALLATIONS,\n columns: ['platform', 'agentId'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of ChannelsMySQL.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n\n for (const idx of ChannelsMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ChannelsMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_CHANNEL_INSTALLATIONS });\n await this.operations.clearTable({ tableName: TABLE_CHANNEL_CONFIG });\n }\n\n async saveInstallation(installation: ChannelInstallation): Promise<void> {\n const now = new Date();\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('platform', 'column name')}, ${quoteIdentifier('agentId', 'column name')}, ${quoteIdentifier('status', 'column name')}, ${quoteIdentifier('webhookId', 'column name')}, ${quoteIdentifier('data', 'column name')}, ${quoteIdentifier('configHash', 'column name')}, ${quoteIdentifier('error', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE ${quoteIdentifier('platform', 'column name')} = VALUES(${quoteIdentifier('platform', 'column name')}), ${quoteIdentifier('agentId', 'column name')} = VALUES(${quoteIdentifier('agentId', 'column name')}), ${quoteIdentifier('status', 'column name')} = VALUES(${quoteIdentifier('status', 'column name')}), ${quoteIdentifier('webhookId', 'column name')} = VALUES(${quoteIdentifier('webhookId', 'column name')}), ${quoteIdentifier('data', 'column name')} = VALUES(${quoteIdentifier('data', 'column name')}), ${quoteIdentifier('configHash', 'column name')} = VALUES(${quoteIdentifier('configHash', 'column name')}), ${quoteIdentifier('error', 'column name')} = VALUES(${quoteIdentifier('error', 'column name')}), ${quoteIdentifier('updatedAt', 'column name')} = VALUES(${quoteIdentifier('updatedAt', 'column name')})`,\n [\n installation.id,\n installation.platform,\n installation.agentId,\n installation.status,\n installation.webhookId ?? null,\n JSON.stringify(installation.data),\n installation.configHash ?? null,\n installation.error ?? null,\n transformToSqlValue(installation.createdAt ?? now),\n transformToSqlValue(now),\n ],\n );\n }\n\n async getInstallation(id: string): Promise<ChannelInstallation | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n const row = rows[0];\n return row ? this.parseInstallationRow(row) : null;\n }\n\n async getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('platform', 'column name')} = ? AND ${quoteIdentifier('agentId', 'column name')} = ? ORDER BY CASE ${quoteIdentifier('status', 'column name')} WHEN 'active' THEN 0 WHEN 'pending' THEN 1 ELSE 2 END, ${quoteIdentifier('updatedAt', 'column name')} DESC LIMIT 1`,\n [platform, agentId],\n );\n const row = rows[0];\n return row ? this.parseInstallationRow(row) : null;\n }\n\n async getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('webhookId', 'column name')} = ?`,\n [webhookId],\n );\n const row = rows[0];\n return row ? this.parseInstallationRow(row) : null;\n }\n\n async listInstallations(platform: string): Promise<ChannelInstallation[]> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('platform', 'column name')} = ? ORDER BY ${quoteIdentifier('createdAt', 'column name')} DESC`,\n [platform],\n );\n return rows.map(row => this.parseInstallationRow(row));\n }\n\n async deleteInstallation(id: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n }\n\n async saveConfig(config: ChannelConfig): Promise<void> {\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_CHANNEL_CONFIG)} (${quoteIdentifier('platform', 'column name')}, ${quoteIdentifier('data', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')}) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE ${quoteIdentifier('data', 'column name')} = VALUES(${quoteIdentifier('data', 'column name')}), ${quoteIdentifier('updatedAt', 'column name')} = VALUES(${quoteIdentifier('updatedAt', 'column name')})`,\n [config.platform, JSON.stringify(config.data), transformToSqlValue(config.updatedAt)],\n );\n }\n\n async getConfig(platform: string): Promise<ChannelConfig | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_CONFIG)} WHERE ${quoteIdentifier('platform', 'column name')} = ?`,\n [platform],\n );\n const row = rows[0];\n if (!row) return null;\n return {\n platform: row.platform as string,\n data: typeof row.data === 'string' ? JSON.parse(row.data || '{}') : row.data,\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n async deleteConfig(platform: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_CHANNEL_CONFIG)} WHERE ${quoteIdentifier('platform', 'column name')} = ?`,\n [platform],\n );\n }\n\n private parseInstallationRow(row: Record<string, unknown>): ChannelInstallation {\n return {\n id: row.id as string,\n platform: row.platform as string,\n agentId: row.agentId as string,\n status: row.status as 'pending' | 'active' | 'error',\n webhookId: (row.webhookId as string) || undefined,\n data: typeof row.data === 'string' ? JSON.parse(row.data || '{}') : row.data,\n configHash: (row.configHash as string) || undefined,\n error: (row.error as string) || undefined,\n createdAt: parseDateTime(row.createdAt as string | number | Date | null | undefined) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt as string | number | Date | null | undefined) ?? new Date(),\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n DATASETS_SCHEMA,\n DATASET_ITEMS_SCHEMA,\n DATASET_VERSIONS_SCHEMA,\n DatasetsStorage,\n calculatePagination,\n normalizePerPage,\n resolveListOrderBy,\n hasErrorCode,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n DeleteDatasetItemInput,\n PurgeDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n DatasetTenancyFilters,\n TargetType,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier, transformToSqlValue } from '../utils';\n\nfunction parseJSON<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n // mysql2 auto-parses JSON columns, so a non-JSON string here means the\n // stored payload was a JSON string scalar (e.g. input: 'foo' was stored\n // as `\"foo\"` and the driver already unwrapped it). Return it as-is.\n return value as unknown as T;\n }\n }\n if (typeof value === 'object') return value as T;\n return value as T;\n}\n\nfunction parseOptionalJSON<T>(value: unknown, emptyValue: null | undefined): T | null | undefined {\n return value === null || value === undefined ? emptyValue : parseJSON<T>(value);\n}\n\nfunction jsonArg(value: unknown): string | null {\n return value === undefined || value === null ? null : JSON.stringify(value);\n}\n\nfunction jsonDataArg(value: unknown): string | null {\n return value === undefined ? null : JSON.stringify(value);\n}\n\n// Read authored JSON as text so the driver cannot collapse JSON null into SQL NULL\n// or leave a JSON-looking string indistinguishable from serialized JSON.\nconst ITEM_SELECT_COLUMNS = Object.keys(DATASET_ITEMS_SCHEMA)\n .map(column => {\n const name = quoteIdentifier(column, 'column name');\n return ['input', 'groundTruth', 'expectedTrajectory'].includes(column)\n ? `CAST(${name} AS CHAR CHARACTER SET utf8mb4) AS ${name}`\n : name;\n })\n .join(', ');\n\nexport class DatasetsMySQL extends DatasetsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS] as const;\n\n /**\n * Item-level tool mocks are not persisted by the MySQL adapter. Reject writes\n * that carry them so the feature fails loudly here instead of silently dropping\n * the mocks and then running tools live during experiments.\n */\n #rejectToolMocks(toolMocks: unknown): void {\n if (Array.isArray(toolMocks) && toolMocks.length > 0) {\n throw new MastraError({\n id: 'MYSQL_DATASET_TOOL_MOCKS_UNSUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Tool mocks are not supported on the MySQL storage adapter. Use a supported adapter (LibSQL, PostgreSQL, MongoDB, or Spanner) to persist dataset item tool mocks.',\n });\n }\n }\n\n /**\n * Returns default index definitions for the datasets domain tables.\n * Currently no default indexes are defined for datasets.\n */\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_dataset_items_dataset_externalid_version`,\n table: TABLE_DATASET_ITEMS,\n columns: ['datasetId', 'externalId', 'datasetVersion'],\n },\n ];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_DATASETS, schema: TABLE_SCHEMAS[TABLE_DATASETS] }),\n generateTableSQL({\n tableName: TABLE_DATASET_ITEMS,\n schema: TABLE_SCHEMAS[TABLE_DATASET_ITEMS],\n compositePrimaryKey: ['id', 'datasetVersion'],\n }),\n generateTableSQL({ tableName: TABLE_DATASET_VERSIONS, schema: TABLE_SCHEMAS[TABLE_DATASET_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (DatasetsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the datasets domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return DatasetsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for datasets.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_DATASETS, schema: DATASETS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_DATASET_ITEMS as any, schema: DATASET_ITEMS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: DATASET_VERSIONS_SCHEMA });\n // Backfill tenancy + candidate identity columns on pre-existing tables so\n // older deployments keep working when they upgrade in place.\n await this.operations.alterTable({\n tableName: TABLE_DATASETS,\n schema: DATASETS_SCHEMA,\n ifNotExists: [\n 'organizationId',\n 'projectId',\n 'candidateKey',\n 'candidateId',\n 'requestContextSchema',\n 'tags',\n 'targetType',\n 'targetIds',\n 'scorerIds',\n ],\n });\n await this.operations.alterTable({\n tableName: TABLE_DATASET_ITEMS as any,\n schema: DATASET_ITEMS_SCHEMA,\n ifNotExists: [\n 'organizationId',\n 'projectId',\n 'requestContext',\n 'source',\n 'expectedTrajectory',\n 'toolMocks',\n 'unmockedToolPolicy',\n 'scorerIds',\n 'externalId',\n ],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASET_VERSIONS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASET_ITEMS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)}`);\n }\n\n private async experimentTablesExist(): Promise<boolean> {\n const [rows] = await this.pool.execute<any[]>(\n `SELECT COUNT(*) AS c FROM information_schema.tables\n WHERE table_schema = DATABASE() AND table_name IN (?, ?)`,\n [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS],\n );\n const row = Array.isArray(rows) ? (rows[0] as { c?: number | string } | undefined) : undefined;\n return Number(row?.c ?? 0) === 2;\n }\n\n // --- Row transformers ---\n\n private mapDataset(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 | null) ?? undefined,\n metadata: parseJSON<Record<string, unknown>>(row.metadata),\n inputSchema: parseJSON<Record<string, unknown>>(row.inputSchema),\n groundTruthSchema: parseJSON<Record<string, unknown>>(row.groundTruthSchema),\n requestContextSchema: parseJSON<Record<string, unknown>>(row.requestContextSchema),\n tags: parseJSON<string[]>(row.tags),\n targetType: (row.targetType as TargetType | null | undefined) ?? undefined,\n targetIds: parseJSON<string[]>(row.targetIds),\n scorerIds: parseJSON<string[]>(row.scorerIds),\n version: row.version as number,\n organizationId: (row.organizationId as string | null | undefined) ?? null,\n projectId: (row.projectId as string | null | undefined) ?? null,\n candidateKey: (row.candidateKey as string | null | undefined) ?? null,\n candidateId: (row.candidateId as string | null | undefined) ?? null,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapItem(row: Record<string, any>): DatasetItem {\n const metadata = row.metadata ? parseJSON<Record<string, unknown>>(row.metadata) : undefined;\n const emptyValue = metadata?.__purged === true ? null : undefined;\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n externalId: (row.externalId as string | null | undefined) ?? null,\n organizationId: (row.organizationId as string | null | undefined) ?? null,\n projectId: (row.projectId as string | null | undefined) ?? null,\n input: row.input === null ? null : parseJSON<Record<string, unknown>>(row.input),\n groundTruth: parseOptionalJSON<Record<string, unknown>>(row.groundTruth, emptyValue),\n expectedTrajectory: parseOptionalJSON<DatasetItem['expectedTrajectory']>(row.expectedTrajectory, emptyValue),\n toolMocks: parseOptionalJSON<DatasetItem['toolMocks']>(row.toolMocks, emptyValue),\n unmockedToolPolicy: row.unmockedToolPolicy ?? emptyValue,\n scorerIds: parseOptionalJSON<string[]>(row.scorerIds, emptyValue),\n requestContext: parseOptionalJSON<Record<string, unknown>>(row.requestContext, emptyValue),\n metadata,\n source: parseOptionalJSON<DatasetItem['source']>(row.source, emptyValue),\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapItemFull(row: Record<string, any>): DatasetItemRow {\n const metadata = row.metadata ? parseJSON<Record<string, unknown>>(row.metadata) : undefined;\n const emptyValue = metadata?.__purged === true ? null : undefined;\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n externalId: (row.externalId as string | null | undefined) ?? null,\n organizationId: (row.organizationId as string | null | undefined) ?? null,\n projectId: (row.projectId as string | null | undefined) ?? null,\n validTo: row.validTo as number | null,\n isDeleted: Boolean(row.isDeleted),\n input: row.input === null ? null : parseJSON<Record<string, unknown>>(row.input),\n groundTruth: parseOptionalJSON<Record<string, unknown>>(row.groundTruth, emptyValue),\n expectedTrajectory: parseOptionalJSON<DatasetItem['expectedTrajectory']>(row.expectedTrajectory, emptyValue),\n toolMocks: parseOptionalJSON<DatasetItem['toolMocks']>(row.toolMocks, emptyValue),\n unmockedToolPolicy: row.unmockedToolPolicy ?? emptyValue,\n scorerIds: parseOptionalJSON<string[]>(row.scorerIds, emptyValue),\n requestContext: parseOptionalJSON<Record<string, unknown>>(row.requestContext, emptyValue),\n metadata,\n source: parseOptionalJSON<DatasetItem['source']>(row.source, emptyValue),\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapVersion(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: parseDateTime(row.createdAt) ?? new Date(),\n };\n }\n\n // --- Dataset CRUD ---\n\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n try {\n const id = input.id ?? globalThis.crypto.randomUUID();\n if (input.id !== undefined) this.validateCallerDefinedDatasetId(input.id);\n const now = new Date();\n\n const insert =\n input.id === undefined\n ? this.operations.insert.bind(this.operations)\n : this.operations.insertOnly.bind(this.operations);\n await insert({\n tableName: TABLE_DATASETS,\n record: {\n id,\n name: input.name,\n description: input.description ?? null,\n metadata: jsonArg(input.metadata),\n inputSchema: jsonArg(input.inputSchema),\n groundTruthSchema: jsonArg(input.groundTruthSchema),\n requestContextSchema: jsonArg(input.requestContextSchema),\n targetType: input.targetType ?? null,\n targetIds: jsonArg(input.targetIds),\n scorerIds: jsonArg(input.scorerIds),\n version: 0,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n candidateKey: input.candidateKey ?? null,\n candidateId: input.candidateId ?? null,\n createdAt: now,\n updatedAt: now,\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 requestContextSchema: input.requestContextSchema ?? undefined,\n targetType: input.targetType ?? undefined,\n targetIds: input.targetIds ?? undefined,\n scorerIds: input.scorerIds ?? undefined,\n version: 0,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n candidateKey: input.candidateKey ?? null,\n candidateId: input.candidateId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (input.id !== undefined && hasErrorCode(error, new Set([1062, 'ER_DUP_ENTRY']))) {\n const existing = await this.getDatasetById({ id: input.id });\n if (existing) return this.resolveExistingDataset(existing, { ...input, id: input.id });\n }\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_CREATE_DATASET_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getDatasetById({\n id,\n filters,\n }: {\n id: string;\n filters?: DatasetTenancyFilters;\n }): Promise<DatasetRecord | null> {\n try {\n // prepareWhereClause ignores undefined values, so this scopes the SELECT only\n // when the caller passed tenancy filters.\n const row = await this.operations.load<Record<string, any>>({\n tableName: TABLE_DATASETS,\n keys: {\n id,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n },\n });\n return row ? this.mapDataset(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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, filters: args.filters });\n if (!existing) {\n throw new MastraError({\n id: 'MYSQL_UPDATE_DATASET_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.id },\n });\n }\n\n const data: Record<string, any> = { updatedAt: new Date() };\n\n if (args.name !== undefined) data.name = args.name;\n if (args.description !== undefined) data.description = args.description;\n if (args.metadata !== undefined) data.metadata = JSON.stringify(args.metadata);\n if (args.inputSchema !== undefined)\n data.inputSchema = args.inputSchema === null ? null : JSON.stringify(args.inputSchema);\n if (args.groundTruthSchema !== undefined)\n data.groundTruthSchema = args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema);\n if (args.requestContextSchema !== undefined)\n data.requestContextSchema =\n args.requestContextSchema === null ? null : JSON.stringify(args.requestContextSchema);\n if (args.tags !== undefined) data.tags = args.tags === null ? null : JSON.stringify(args.tags);\n if (args.targetType !== undefined) data.targetType = args.targetType;\n if (args.targetIds !== undefined)\n data.targetIds = args.targetIds === null ? null : JSON.stringify(args.targetIds);\n if (args.scorerIds !== undefined)\n data.scorerIds = args.scorerIds === null ? null : JSON.stringify(args.scorerIds);\n\n await this.operations.update({\n tableName: TABLE_DATASETS,\n keys: { id: args.id },\n data,\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 requestContextSchema:\n (args.requestContextSchema !== undefined ? args.requestContextSchema : existing.requestContextSchema) ??\n undefined,\n tags: (args.tags !== undefined ? args.tags : existing.tags) ?? undefined,\n targetType: (args.targetType !== undefined ? args.targetType : existing.targetType) ?? undefined,\n targetIds: (args.targetIds !== undefined ? args.targetIds : existing.targetIds) ?? undefined,\n scorerIds: (args.scorerIds !== undefined ? args.scorerIds : existing.scorerIds) ?? undefined,\n updatedAt: data.updatedAt,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPDATE_DATASET_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteDataset({ id, filters }: { id: string; filters?: DatasetTenancyFilters }): Promise<void> {\n // Atomic gate + cascade under SELECT ... FOR UPDATE, so a concurrent\n // delete/recreate under a different tenant cannot let a scoped delete hit\n // another tenant's row. Silent no-op on tenancy mismatch.\n const filterCols: string[] = [];\n const filterVals: any[] = [];\n if (filters?.organizationId !== undefined) {\n filterCols.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n filterVals.push(filters.organizationId);\n }\n if (filters?.projectId !== undefined) {\n filterCols.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n filterVals.push(filters.projectId);\n }\n const scopedWhere = ['id = ?', ...filterCols].join(' AND ');\n\n // Probe for experiment tables via information_schema outside the transaction\n // rather than running DMLs and swallowing \"table missing\" errors. Even though\n // ER_NO_SUCH_TABLE (1146) does not abort an InnoDB transaction, resolving\n // existence up front keeps the transaction focused on real writes.\n const experimentTablesExist = await this.experimentTablesExist();\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const [rows] = await connection.execute<any[]>(\n `SELECT id FROM ${formatTableName(TABLE_DATASETS)} WHERE ${scopedWhere} FOR UPDATE`,\n [id, ...filterVals],\n );\n if (!Array.isArray(rows) || rows.length === 0) {\n await connection.commit();\n return;\n }\n\n if (experimentTablesExist) {\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?)`,\n [id],\n );\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_EXPERIMENTS)} SET ${quoteIdentifier('datasetId', 'column name')} = NULL, ${quoteIdentifier('datasetVersion', 'column name')} = NULL WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [id],\n );\n }\n\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_DATASET_VERSIONS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [id],\n );\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_DATASET_ITEMS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [id],\n );\n await connection.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)} WHERE ${scopedWhere}`, [\n id,\n ...filterVals,\n ]);\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_DATASET_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n try {\n const orderBy = resolveListOrderBy(args.orderBy, ['createdAt', 'updatedAt', 'name'], {\n field: 'createdAt',\n direction: 'DESC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n\n const filterParts: string[] = [];\n const filterArgs: any[] = [];\n if (args.filters?.organizationId !== undefined) {\n filterParts.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n filterArgs.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n filterParts.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n filterArgs.push(args.filters.projectId);\n }\n if (args.filters?.candidateKey !== undefined) {\n filterParts.push(`${quoteIdentifier('candidateKey', 'column name')} = ?`);\n filterArgs.push(args.filters.candidateKey);\n }\n if (args.filters?.candidateId !== undefined) {\n filterParts.push(`${quoteIdentifier('candidateId', 'column name')} = ?`);\n filterArgs.push(args.filters.candidateId);\n }\n if (args.filters?.targetType !== undefined) {\n filterParts.push(`${quoteIdentifier('targetType', 'column name')} = ?`);\n filterArgs.push(args.filters.targetType);\n }\n if (args.filters?.targetIds !== undefined && args.filters.targetIds.length > 0) {\n // JSON_OVERLAPS returns true if any value in JSON_ARRAY(?,?,...) is present in `targetIds`.\n const placeholders = args.filters.targetIds.map(() => '?').join(',');\n filterParts.push(`JSON_OVERLAPS(${quoteIdentifier('targetIds', 'column name')}, JSON_ARRAY(${placeholders}))`);\n filterArgs.push(...args.filters.targetIds);\n }\n if (args.filters?.name !== undefined && args.filters.name.length > 0) {\n filterParts.push(`LOWER(${quoteIdentifier('name', 'column name')}) LIKE LOWER(?)`);\n filterArgs.push(`%${args.filters.name}%`);\n }\n const whereClause = {\n sql: filterParts.length > 0 ? `WHERE ${filterParts.join(' AND ')}` : '',\n args: filterArgs,\n };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_DATASETS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, any>>({\n tableName: TABLE_DATASETS,\n whereClause,\n orderBy: `${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC`,\n offset,\n limit: limitValue,\n });\n\n return {\n datasets: rows.map(row => this.mapDataset(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 this.#rejectToolMocks(args.toolMocks);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const id = globalThis.crypto.randomUUID();\n const versionId = globalThis.crypto.randomUUID();\n const now = new Date();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n // Bump version\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n args.datasetId,\n ]);\n\n // Get new version + parent tenancy\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [args.datasetId],\n );\n const parentRow = (datasetRows as any[])[0];\n const newVersion = parentRow?.version as number;\n const parentOrganizationId = (parentRow?.organizationId as string | null | undefined) ?? null;\n const parentProjectId = (parentRow?.projectId as string | null | undefined) ?? null;\n\n // Insert item (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`metadata\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,NULL,0,?,?,?,?,?,?,?)`,\n [\n id,\n args.datasetId,\n newVersion,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(args.input),\n jsonDataArg(args.groundTruth),\n args.unmockedToolPolicy ?? null,\n jsonArg(args.scorerIds),\n jsonArg(args.metadata),\n transformToSqlValue(now),\n transformToSqlValue(now),\n ],\n );\n\n // Insert dataset version record\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, args.datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n\n return {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n organizationId: parentOrganizationId,\n projectId: parentProjectId,\n input: args.input,\n groundTruth: args.groundTruth,\n unmockedToolPolicy: args.unmockedToolPolicy,\n scorerIds: args.scorerIds,\n metadata: args.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_ADD_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n this.#rejectToolMocks(args.toolMocks);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const versionId = globalThis.crypto.randomUUID();\n const now = new Date();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n await connection.execute(`SELECT id FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`, [args.datasetId]);\n const [itemRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n [args.id],\n );\n const itemRow = (itemRows as any[])[0];\n const existing = itemRow ? this.mapItem(itemRow) : null;\n if (!existing) {\n throw new MastraError({\n id: 'MYSQL_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: 'MYSQL_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 if (existing.metadata?.__purged === true) {\n throw new MastraError({\n id: 'DATASET_ITEM_PURGED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.datasetId, itemId: args.id },\n text: `Purged dataset item cannot be updated: ${args.id}`,\n });\n }\n\n const mergedInput = args.input !== undefined ? args.input : existing.input;\n const mergedGroundTruth = args.groundTruth !== undefined ? args.groundTruth : existing.groundTruth;\n const mergedExpectedTrajectory =\n args.expectedTrajectory !== undefined ? args.expectedTrajectory : existing.expectedTrajectory;\n const mergedToolMocks = args.toolMocks ?? existing.toolMocks;\n const mergedUnmockedToolPolicy = args.unmockedToolPolicy ?? existing.unmockedToolPolicy;\n const mergedScorerIds = args.scorerIds !== undefined ? (args.scorerIds ?? undefined) : existing.scorerIds;\n const mergedRequestContext = args.requestContext ?? existing.requestContext;\n const mergedMetadata = args.metadata ?? existing.metadata;\n const mergedSource = args.source ?? existing.source;\n\n // Bump version\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n args.datasetId,\n ]);\n\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [args.datasetId],\n );\n const parentRow = (datasetRows as any[])[0];\n const newVersion = parentRow?.version as number;\n const parentOrganizationId = (parentRow?.organizationId as string | null | undefined) ?? null;\n const parentProjectId = (parentRow?.projectId as string | null | undefined) ?? null;\n\n // Close old row\n await connection.execute(\n `UPDATE ${tableItemsName} SET \\`validTo\\` = ? WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [newVersion, args.id],\n );\n\n // Insert new row (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,0,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n args.id,\n args.datasetId,\n newVersion,\n existing.externalId ?? null,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(mergedInput),\n jsonDataArg(mergedGroundTruth),\n jsonDataArg(mergedExpectedTrajectory),\n jsonArg(mergedToolMocks),\n mergedUnmockedToolPolicy ?? null,\n jsonArg(mergedScorerIds),\n jsonArg(mergedRequestContext),\n jsonArg(mergedMetadata),\n jsonArg(mergedSource),\n transformToSqlValue(existing.createdAt),\n transformToSqlValue(now),\n ],\n );\n\n // Insert dataset version record\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, args.datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n\n return {\n ...existing,\n datasetVersion: newVersion,\n organizationId: parentOrganizationId,\n projectId: parentProjectId,\n input: mergedInput,\n groundTruth: mergedGroundTruth,\n expectedTrajectory: mergedExpectedTrajectory,\n toolMocks: mergedToolMocks,\n unmockedToolPolicy: mergedUnmockedToolPolicy,\n scorerIds: mergedScorerIds,\n requestContext: mergedRequestContext,\n metadata: mergedMetadata,\n source: mergedSource,\n updatedAt: now,\n };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPDATE_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doDeleteItem({ id, datasetId }: DeleteDatasetItemInput): Promise<void> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const versionId = globalThis.crypto.randomUUID();\n const now = new Date();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n await connection.execute(`SELECT id FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`, [datasetId]);\n const [itemRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n [id],\n );\n const itemRow = (itemRows as any[])[0];\n const existing = itemRow ? this.mapItem(itemRow) : null;\n if (!existing) {\n await connection.commit();\n return;\n }\n if (existing.datasetId !== datasetId) {\n throw new MastraError({\n id: 'MYSQL_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 // Bump version\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n datasetId,\n ]);\n\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [datasetId],\n );\n const parentRow = (datasetRows as any[])[0];\n const newVersion = parentRow?.version as number;\n const parentOrganizationId = (parentRow?.organizationId as string | null | undefined) ?? null;\n const parentProjectId = (parentRow?.projectId as string | null | undefined) ?? null;\n\n // Close old row\n await connection.execute(\n `UPDATE ${tableItemsName} SET \\`validTo\\` = ? WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [newVersion, id],\n );\n\n // Insert tombstone (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,1,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n id,\n datasetId,\n newVersion,\n existing.externalId ?? null,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(existing.input),\n jsonDataArg(existing.groundTruth),\n jsonDataArg(existing.expectedTrajectory),\n jsonArg(existing.toolMocks),\n existing.unmockedToolPolicy ?? null,\n jsonArg(existing.scorerIds),\n jsonArg(existing.requestContext),\n jsonArg(existing.metadata),\n jsonArg(existing.source),\n transformToSqlValue(existing.createdAt),\n transformToSqlValue(now),\n ],\n );\n\n // Insert dataset version record\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doPurgeItem({ id, datasetId }: PurgeDatasetItemInput): Promise<void> {\n const experimentTablesExist = await this.experimentTablesExist();\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n await connection.execute(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${formatTableName(TABLE_DATASETS)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [datasetId],\n );\n const itemsTable = formatTableName(TABLE_DATASET_ITEMS);\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${itemsTable} WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('datasetId', 'column name')} = ? LIMIT 1 FOR UPDATE`,\n [id, datasetId],\n );\n if (rows.length === 0) {\n await connection.commit();\n return;\n }\n\n const purgedAt = new Date().toISOString();\n const purgedMetadata = JSON.stringify({ __purged: true, purgedAt });\n await connection.execute(\n `UPDATE ${itemsTable} SET ${quoteIdentifier('input', 'column name')} = ?, ${quoteIdentifier('groundTruth', 'column name')} = NULL, ${quoteIdentifier('expectedTrajectory', 'column name')} = NULL, ${quoteIdentifier('toolMocks', 'column name')} = NULL, ${quoteIdentifier('unmockedToolPolicy', 'column name')} = NULL, ${quoteIdentifier('scorerIds', 'column name')} = NULL, ${quoteIdentifier('requestContext', 'column name')} = NULL, ${quoteIdentifier('metadata', 'column name')} = ?, ${quoteIdentifier('source', 'column name')} = NULL WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('datasetId', 'column name')} = ?`,\n ['null', purgedMetadata, id, datasetId],\n );\n\n if (experimentTablesExist) {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_EXPERIMENT_RESULTS)} SET ${quoteIdentifier('input', 'column name')} = ?, ${quoteIdentifier('output', 'column name')} = NULL, ${quoteIdentifier('groundTruth', 'column name')} = NULL, ${quoteIdentifier('error', 'column name')} = NULL, ${quoteIdentifier('toolMockReport', 'column name')} = NULL, ${quoteIdentifier('tags', 'column name')} = NULL, ${quoteIdentifier('comment', 'column name')} = NULL, ${quoteIdentifier('metadata', 'column name')} = ? WHERE ${quoteIdentifier('itemId', 'column name')} = ? AND ${quoteIdentifier('experimentId', 'column name')} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?)`,\n ['null', purgedMetadata, id, datasetId],\n );\n }\n await connection.commit();\n } catch (error) {\n let transactionError = error;\n try {\n await connection.rollback();\n } catch (rollbackError) {\n transactionError = new AggregateError([error, rollbackError], 'Transaction and rollback both failed');\n }\n if (transactionError instanceof MastraError) throw transactionError;\n throw new MastraError(\n {\n id: 'MYSQL_PURGE_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n transactionError,\n );\n } finally {\n connection.release();\n }\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n try {\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n let rows: RowDataPacket[];\n\n if (args.datasetVersion !== undefined) {\n [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`id\\` = ? AND \\`datasetVersion\\` <= ? AND (\\`validTo\\` IS NULL OR \\`validTo\\` > ?) AND \\`isDeleted\\` = 0 ORDER BY \\`datasetVersion\\` DESC LIMIT 1`,\n [args.id, args.datasetVersion, args.datasetVersion],\n );\n } else {\n [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [args.id],\n );\n }\n\n return rows.length > 0 ? this.mapItem(rows[0]!) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`datasetId\\` = ? AND \\`datasetVersion\\` <= ? AND (\\`validTo\\` IS NULL OR \\`validTo\\` > ?) AND \\`isDeleted\\` = 0 ORDER BY \\`createdAt\\` DESC, \\`id\\` ASC`,\n [datasetId, version, version],\n );\n\n return (rows as any[]).map(row => this.mapItem(row));\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`id\\` = ? ORDER BY \\`datasetVersion\\` DESC`,\n [itemId],\n );\n\n return (rows as any[]).map(row => this.mapItemFull(row));\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 orderBy = resolveListOrderBy(args.orderBy, ['createdAt', 'updatedAt'], {\n field: 'createdAt',\n direction: 'DESC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n\n const conditions: string[] = [`\\`datasetId\\` = ?`];\n const params: any[] = [args.datasetId];\n\n if (args.version !== undefined) {\n // SCD-2 time-travel query\n conditions.push(`\\`datasetVersion\\` <= ?`);\n conditions.push(`(\\`validTo\\` IS NULL OR \\`validTo\\` > ?)`);\n conditions.push(`\\`isDeleted\\` = 0`);\n params.push(args.version, args.version);\n } else {\n // Current items only\n conditions.push(`\\`validTo\\` IS NULL`);\n conditions.push(`\\`isDeleted\\` = 0`);\n }\n\n if (args.filters?.organizationId !== undefined) {\n conditions.push(`\\`organizationId\\` = ?`);\n params.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n conditions.push(`\\`projectId\\` = ?`);\n params.push(args.filters.projectId);\n }\n\n if (args.search) {\n conditions.push(`(LOWER(\\`input\\`) LIKE ? OR LOWER(COALESCE(\\`groundTruth\\`, '')) LIKE ?)`);\n const searchPattern = `%${args.search.toLowerCase()}%`;\n params.push(searchPattern, searchPattern);\n }\n\n const whereSql = ` WHERE ${conditions.join(' AND ')}`;\n\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableItemsName}${whereSql}`,\n params,\n );\n const total = Number((countRows as any[])[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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName}${whereSql} ORDER BY ${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC LIMIT ${limitValue} OFFSET ${offset}`,\n params,\n );\n\n return {\n items: (rows as any[]).map(row => this.mapItem(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 = globalThis.crypto.randomUUID();\n const now = new Date();\n\n await this.operations.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: {\n id,\n datasetId,\n version,\n createdAt: now,\n },\n });\n\n return { id, datasetId, version, createdAt: now };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 whereClause = {\n sql: ` WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n args: [input.datasetId] as any[],\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_DATASET_VERSIONS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, any>>({\n tableName: TABLE_DATASET_VERSIONS,\n whereClause,\n orderBy: `\\`version\\` DESC`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.mapVersion(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 for (const item of input.items) {\n this.#rejectToolMocks(item.toolMocks);\n }\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`,\n [input.datasetId],\n );\n const dataset = datasetRows[0];\n if (!dataset) {\n throw new MastraError({\n id: 'MYSQL_BULK_ADD_ITEMS_DATASET_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const externalIds = [...new Set(input.items.flatMap(item => (item.externalId ? [item.externalId] : [])))];\n let historyRows: DatasetItemRow[] = [];\n if (externalIds.length > 0) {\n const placeholders = externalIds.map(() => '?').join(', ');\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`datasetId\\` = ? AND \\`externalId\\` IN (${placeholders}) ORDER BY \\`datasetVersion\\` ASC`,\n [input.datasetId, ...externalIds],\n );\n historyRows = rows.map(row => this.mapItemFull(row));\n }\n\n const plan = this.planDatasetItemBatch(input.items, historyRows, () => globalThis.crypto.randomUUID());\n const existingItems = new Map<string, DatasetItem>(\n [...plan.existingCurrentItems].map(([id, row]) => [id, this.datasetItemFromRow(row)]),\n );\n if (plan.inserts.length === 0) {\n await connection.commit();\n return plan.resolvedIds.map(id => existingItems.get(id)!);\n }\n\n const now = new Date();\n const newVersion = Number(dataset.version) + 1;\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = ? WHERE id = ?`, [\n newVersion,\n input.datasetId,\n ]);\n\n const inserted = new Map<string, DatasetItem>();\n for (const { id, item } of plan.inserts) {\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,0,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n id,\n input.datasetId,\n newVersion,\n item.externalId ?? null,\n dataset.organizationId ?? null,\n dataset.projectId ?? null,\n jsonDataArg(item.input),\n jsonDataArg(item.groundTruth),\n jsonDataArg(item.expectedTrajectory),\n jsonArg(item.toolMocks),\n item.unmockedToolPolicy ?? null,\n jsonArg(item.scorerIds),\n jsonArg(item.requestContext),\n jsonArg(item.metadata),\n jsonArg(item.source),\n transformToSqlValue(now),\n transformToSqlValue(now),\n ],\n );\n inserted.set(id, {\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n externalId: item.externalId ?? null,\n organizationId: dataset.organizationId ?? null,\n projectId: dataset.projectId ?? null,\n ...item,\n createdAt: now,\n updatedAt: now,\n });\n }\n\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [globalThis.crypto.randomUUID(), input.datasetId, newVersion, transformToSqlValue(now)],\n );\n await connection.commit();\n\n return plan.resolvedIds.map(id => inserted.get(id) ?? existingItems.get(id)!);\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_BULK_ADD_ITEMS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: 'MYSQL_BULK_DELETE_ITEMS_DATASET_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const now = new Date();\n const versionId = globalThis.crypto.randomUUID();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n await connection.execute(`SELECT id FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`, [input.datasetId]);\n const currentItems: DatasetItem[] = [];\n for (const itemId of input.itemIds) {\n const [itemRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n [itemId],\n );\n const row = (itemRows as any[])[0];\n const item = row ? this.mapItem(row) : null;\n if (item && item.datasetId === input.datasetId) currentItems.push(item);\n }\n if (currentItems.length === 0) {\n await connection.commit();\n return;\n }\n\n // Single version increment\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n input.datasetId,\n ]);\n\n const [versionRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [input.datasetId],\n );\n const newVersion = (versionRows as any[])[0]?.version as number;\n\n const parentOrganizationId = dataset.organizationId ?? null;\n const parentProjectId = dataset.projectId ?? null;\n\n for (const item of currentItems) {\n // Close old row\n await connection.execute(\n `UPDATE ${tableItemsName} SET \\`validTo\\` = ? WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [newVersion, item.id],\n );\n\n // Insert tombstone (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,1,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n item.id,\n input.datasetId,\n newVersion,\n item.externalId ?? null,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(item.input),\n jsonDataArg(item.groundTruth),\n jsonDataArg(item.expectedTrajectory),\n jsonArg(item.toolMocks),\n item.unmockedToolPolicy ?? null,\n jsonArg(item.scorerIds),\n jsonArg(item.requestContext),\n jsonArg(item.metadata),\n jsonArg(item.source),\n transformToSqlValue(item.createdAt),\n transformToSqlValue(now),\n ],\n );\n }\n\n // Single dataset_version\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, input.datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_BULK_DELETE_ITEMS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n EXPERIMENTS_SCHEMA,\n EXPERIMENT_RESULTS_SCHEMA,\n ExperimentsStorage,\n calculatePagination,\n hasErrorCode,\n normalizePerPage,\n resolveListOrderBy,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n ExperimentResultStatus,\n ExperimentTenancyFilters,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n UpdateExperimentResultInput,\n UpsertExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '@mastra/core/storage';\nimport type { Pool, PoolConnection } from 'mysql2/promise';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier } from '../utils';\n\nfunction parseJSON<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n }\n if (typeof value === 'object') return value as T;\n return undefined;\n}\n\ninterface ExperimentRow {\n id: string;\n datasetId: string | null;\n datasetVersion: number | null;\n agentVersion: string | null;\n organizationId: string | null;\n projectId: string | null;\n targetType: string | null;\n targetId: string | null;\n scorerIds: string | null;\n name: string | null;\n description: string | null;\n metadata: string | null;\n provenance: string | null;\n runnerAttestation: string | null;\n experimentSetId: string | null;\n comparisonId: string | null;\n variantId: string | null;\n trialIndex: number | null;\n status: string;\n totalItems: number;\n succeededCount: number;\n failedCount: number;\n skippedCount: number;\n startedAt: Date | string | null;\n completedAt: Date | string | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\ninterface ExperimentResultRow {\n id: string;\n experimentId: string;\n itemId: string;\n itemDatasetVersion: number | null;\n organizationId: string | null;\n projectId: string | null;\n input: string | null;\n output: string | null;\n groundTruth: string | null;\n metadata: string | null;\n error: string | null;\n startedAt: Date | string;\n completedAt: Date | string;\n retryCount: number;\n attempt?: number | null;\n traceId: string | null;\n status: string | null;\n tags: string | null;\n comment: string | null;\n createdAt: Date | string;\n}\n\nexport class ExperimentsMySQL extends ExperimentsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS] as const;\n\n /**\n * Returns default index definitions for the experiments domain tables.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [\n // Tenancy: leading-tenant indexes for multi-tenant scans (parity with\n // pg/libsql/spanner/mongodb experiments adapters).\n {\n name: 'idx_experiments_grouping',\n table: TABLE_EXPERIMENTS,\n columns: ['experimentSetId', 'comparisonId', 'variantId', 'trialIndex'],\n },\n {\n name: 'idx_experiments_org_project',\n table: TABLE_EXPERIMENTS,\n columns: ['organizationId', 'projectId'],\n },\n {\n name: 'idx_experiment_results_org_project',\n table: TABLE_EXPERIMENT_RESULTS,\n columns: ['organizationId', 'projectId'],\n },\n ];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_EXPERIMENTS, schema: TABLE_SCHEMAS[TABLE_EXPERIMENTS] }),\n generateTableSQL({ tableName: TABLE_EXPERIMENT_RESULTS, schema: TABLE_SCHEMAS[TABLE_EXPERIMENT_RESULTS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ExperimentsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async #withPurgeBarrier<T>(\n experimentId: string,\n itemId: string,\n fn: (connection: PoolConnection, purgeMetadata: Record<string, unknown> | null) => Promise<T>,\n ): Promise<T> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n const [experimentRows] = await connection.execute(\n `SELECT ${quoteIdentifier('datasetId', 'column name')} FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [experimentId],\n );\n const datasetId = Array.isArray(experimentRows)\n ? ((experimentRows[0] as { datasetId?: string | null } | undefined)?.datasetId ?? null)\n : null;\n let purgeMetadata: Record<string, unknown> | null = null;\n if (datasetId) {\n await connection.execute(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${formatTableName(TABLE_DATASETS)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [datasetId],\n );\n const [itemRows] = await connection.execute(\n `SELECT ${quoteIdentifier('metadata', 'column name')} FROM ${formatTableName(TABLE_DATASET_ITEMS)} WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [itemId, datasetId],\n );\n if (Array.isArray(itemRows)) {\n const purgedRow = (itemRows as Array<{ metadata?: unknown }>).find(\n row => parseJSON<Record<string, unknown>>(row.metadata)?.__purged === true,\n );\n purgeMetadata = purgedRow ? (parseJSON<Record<string, unknown>>(purgedRow.metadata) ?? null) : null;\n }\n }\n const result = await fn(connection, purgeMetadata);\n await connection.commit();\n return result;\n } catch (error) {\n let transactionError = error;\n try {\n await connection.rollback();\n } catch (rollbackError) {\n transactionError = new AggregateError([error, rollbackError], 'Transaction and rollback both failed');\n }\n throw transactionError;\n } finally {\n connection.release();\n }\n }\n\n async #ensureExperimentResultNaturalKey(): Promise<void> {\n const tableName = formatTableName(TABLE_EXPERIMENT_RESULTS);\n const indexName = 'idx_experiment_results_exp_item_attempt';\n\n const [indexRows] = await this.pool.execute(\n `SELECT 1 FROM information_schema.STATISTICS\n WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ?\n LIMIT 1`,\n [TABLE_EXPERIMENT_RESULTS, indexName],\n );\n if (Array.isArray(indexRows) && indexRows.length > 0) return;\n\n try {\n await this.pool.execute(\n `CREATE UNIQUE INDEX ${quoteIdentifier(indexName, 'index name')} ON ${tableName} (${quoteIdentifier('experimentId', 'column name')}(191), ${quoteIdentifier('itemId', 'column name')}(191), ((COALESCE(${quoteIdentifier('attempt', 'column name')}, 0))))`,\n );\n } catch (error) {\n if (hasErrorCode(error, new Set([1061, 'ER_DUP_KEYNAME']))) return;\n if (!hasErrorCode(error, new Set([1062, 'ER_DUP_ENTRY']))) throw error;\n\n throw new MastraError(\n {\n id: 'MYSQL_EXPERIMENT_RESULT_NATURAL_KEY_MIGRATION_REQUIRED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Could not enforce experiment-result uniqueness. Resolve duplicate experiment, item, and attempt combinations before restarting the MySQL store.',\n },\n error,\n );\n }\n }\n\n /**\n * Returns default index definitions for the experiments domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ExperimentsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_EXPERIMENTS, schema: EXPERIMENTS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_EXPERIMENT_RESULTS, schema: EXPERIMENT_RESULTS_SCHEMA });\n // Backfill tenancy columns on pre-existing tables so older deployments\n // keep working when they upgrade in place.\n await this.operations.alterTable({\n tableName: TABLE_EXPERIMENTS,\n schema: EXPERIMENTS_SCHEMA,\n ifNotExists: [\n 'agentVersion',\n 'organizationId',\n 'projectId',\n 'provenance',\n 'runnerAttestation',\n 'experimentSetId',\n 'comparisonId',\n 'variantId',\n 'trialIndex',\n 'scorerIds',\n ],\n });\n await this.operations.alterTable({\n tableName: TABLE_EXPERIMENT_RESULTS,\n schema: EXPERIMENT_RESULTS_SCHEMA,\n ifNotExists: ['comment', 'metadata', 'organizationId', 'projectId', 'attempt'],\n });\n await this.#ensureExperimentResultNaturalKey();\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_EXPERIMENTS)}`);\n }\n\n private mapExperiment(row: ExperimentRow): Experiment {\n return {\n id: row.id,\n datasetId: row.datasetId ?? null,\n datasetVersion: row.datasetVersion ?? null,\n agentVersion: row.agentVersion ?? null,\n organizationId: row.organizationId ?? null,\n projectId: row.projectId ?? null,\n targetType: (row.targetType as Experiment['targetType']) ?? null,\n targetId: row.targetId ?? null,\n scorerIds: parseJSON<string[]>(row.scorerIds) ?? null,\n name: row.name ?? undefined,\n description: row.description ?? undefined,\n metadata: parseJSON<Record<string, unknown>>(row.metadata),\n provenance: parseJSON<Experiment['provenance']>(row.provenance) ?? null,\n runnerAttestation: parseJSON<Experiment['runnerAttestation']>(row.runnerAttestation) ?? null,\n experimentSetId: row.experimentSetId ?? null,\n comparisonId: row.comparisonId ?? null,\n variantId: row.variantId ?? null,\n trialIndex: row.trialIndex ?? null,\n status: row.status as Experiment['status'],\n totalItems: row.totalItems,\n succeededCount: row.succeededCount,\n failedCount: row.failedCount,\n skippedCount: row.skippedCount ?? 0,\n startedAt: row.startedAt ? (parseDateTime(row.startedAt) ?? null) : null,\n completedAt: row.completedAt ? (parseDateTime(row.completedAt) ?? null) : null,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapExperimentResult(row: ExperimentResultRow): ExperimentResult {\n return {\n id: row.id,\n experimentId: row.experimentId,\n itemId: row.itemId,\n itemDatasetVersion: row.itemDatasetVersion ?? null,\n organizationId: row.organizationId ?? null,\n projectId: row.projectId ?? null,\n input: row.input === null ? null : parseJSON<Record<string, unknown>>(row.input),\n output: row.output ? parseJSON<Record<string, unknown>>(row.output) : null,\n groundTruth: row.groundTruth ? parseJSON<Record<string, unknown>>(row.groundTruth) : null,\n metadata: row.metadata ? (parseJSON<Record<string, unknown>>(row.metadata) ?? null) : null,\n error: row.error ? (parseJSON<{ message: string; stack?: string; code?: string }>(row.error) ?? null) : null,\n startedAt: parseDateTime(row.startedAt) ?? new Date(),\n completedAt: parseDateTime(row.completedAt) ?? new Date(),\n retryCount: row.retryCount,\n attempt: row.attempt != null ? Number(row.attempt) : 0,\n traceId: row.traceId ?? null,\n status: (row.status as ExperimentResultStatus | null) ?? null,\n tags: row.tags ? (parseJSON<string[]>(row.tags) ?? null) : null,\n comment: row.comment ?? null,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n };\n }\n\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n try {\n const id = input.id ?? globalThis.crypto.randomUUID();\n const now = new Date();\n\n await this.operations.insert({\n tableName: TABLE_EXPERIMENTS,\n record: {\n id,\n datasetId: input.datasetId ?? null,\n datasetVersion: input.datasetVersion ?? null,\n agentVersion: input.agentVersion ?? null,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n targetType: input.targetType ?? null,\n targetId: input.targetId ?? null,\n scorerIds: input.scorerIds ? JSON.stringify(input.scorerIds) : null,\n name: input.name ?? null,\n description: input.description ?? null,\n metadata: input.metadata ? JSON.stringify(input.metadata) : null,\n provenance: input.provenance ? JSON.stringify(input.provenance) : null,\n runnerAttestation: input.runnerAttestation ? JSON.stringify(input.runnerAttestation) : null,\n experimentSetId: input.experimentSetId ?? null,\n comparisonId: input.comparisonId ?? null,\n variantId: input.variantId ?? null,\n trialIndex: input.trialIndex ?? 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: now,\n updatedAt: now,\n },\n });\n\n return {\n id,\n datasetId: input.datasetId,\n datasetVersion: input.datasetVersion,\n agentVersion: input.agentVersion ?? null,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n targetType: input.targetType ?? null,\n targetId: input.targetId ?? null,\n scorerIds: input.scorerIds ?? null,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n provenance: input.provenance ?? null,\n runnerAttestation: input.runnerAttestation ?? null,\n experimentSetId: input.experimentSetId ?? null,\n comparisonId: input.comparisonId ?? null,\n variantId: input.variantId ?? null,\n trialIndex: input.trialIndex ?? 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: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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: 'MYSQL_UPDATE_EXPERIMENT_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { experimentId: input.id },\n });\n }\n\n const data: Record<string, any> = { updatedAt: new Date() };\n\n if (input.status !== undefined) data.status = input.status;\n if (input.succeededCount !== undefined) data.succeededCount = input.succeededCount;\n if (input.failedCount !== undefined) data.failedCount = input.failedCount;\n if (input.skippedCount !== undefined) data.skippedCount = input.skippedCount;\n if (input.totalItems !== undefined) data.totalItems = input.totalItems;\n if (input.startedAt !== undefined) data.startedAt = input.startedAt ?? null;\n if (input.completedAt !== undefined) data.completedAt = input.completedAt ?? null;\n if (input.name !== undefined) data.name = input.name;\n if (input.description !== undefined) data.description = input.description;\n if (input.metadata !== undefined) data.metadata = JSON.stringify(input.metadata);\n\n await this.operations.update({\n tableName: TABLE_EXPERIMENTS,\n keys: { id: input.id },\n data,\n });\n\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: 'MYSQL_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; filters?: ExperimentTenancyFilters }): Promise<Experiment | null> {\n try {\n // prepareWhereClause ignores undefined values, so this scopes the SELECT only\n // when the caller passed tenancy filters.\n const row = await this.operations.load<ExperimentRow>({\n tableName: TABLE_EXPERIMENTS,\n keys: {\n id: args.id,\n organizationId: args.filters?.organizationId,\n projectId: args.filters?.projectId,\n },\n });\n return row ? this.mapExperiment(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 orderBy = resolveListOrderBy(args.orderBy, ['createdAt', 'status'], {\n field: 'createdAt',\n direction: 'DESC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (args.datasetId) {\n conditions.push(`${quoteIdentifier('datasetId', 'column name')} = ?`);\n params.push(args.datasetId);\n }\n if (args.targetType) {\n conditions.push(`${quoteIdentifier('targetType', 'column name')} = ?`);\n params.push(args.targetType);\n }\n if (args.targetId) {\n conditions.push(`${quoteIdentifier('targetId', 'column name')} = ?`);\n params.push(args.targetId);\n }\n if (args.agentVersion) {\n conditions.push(`${quoteIdentifier('agentVersion', 'column name')} = ?`);\n params.push(args.agentVersion);\n }\n if (args.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(args.status);\n }\n if (args.experimentSetId !== undefined) {\n conditions.push(`${quoteIdentifier('experimentSetId', 'column name')} = ?`);\n params.push(args.experimentSetId);\n }\n if (args.comparisonId !== undefined) {\n conditions.push(`${quoteIdentifier('comparisonId', 'column name')} = ?`);\n params.push(args.comparisonId);\n }\n if (args.variantId !== undefined) {\n conditions.push(`${quoteIdentifier('variantId', 'column name')} = ?`);\n params.push(args.variantId);\n }\n if (args.trialIndex !== undefined) {\n conditions.push(`${quoteIdentifier('trialIndex', 'column name')} = ?`);\n params.push(args.trialIndex);\n }\n if (args.filters) {\n const { organizationId, projectId } = args.filters;\n if (organizationId !== undefined) {\n conditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n params.push(organizationId);\n }\n if (projectId !== undefined) {\n conditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n params.push(projectId);\n }\n }\n\n const whereClause = {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args: params,\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_EXPERIMENTS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<ExperimentRow>({\n tableName: TABLE_EXPERIMENTS,\n whereClause,\n orderBy: `${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC`,\n offset,\n limit: limitValue,\n });\n\n return {\n experiments: rows.map(row => this.mapExperiment(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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; filters?: ExperimentTenancyFilters }): Promise<void> {\n try {\n // Atomic gate + cascade under SELECT ... FOR UPDATE. Silent no-op on\n // tenancy mismatch.\n const tenancyConditions: string[] = [];\n const tenancyParams: any[] = [];\n if (args.filters?.organizationId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n tenancyParams.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n tenancyParams.push(args.filters.projectId);\n }\n const gateWhere = ['id = ?', ...tenancyConditions].join(' AND ');\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n const [gateRows] = await connection.execute(\n `SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${gateWhere} FOR UPDATE`,\n [args.id, ...tenancyParams],\n );\n if (!Array.isArray(gateRows) || gateRows.length === 0) {\n await connection.commit();\n return;\n }\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} = ?`,\n [args.id],\n );\n await connection.execute(`DELETE FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE id = ?`, [args.id]);\n await connection.commit();\n } catch (error) {\n try {\n await connection.rollback();\n } catch (rollbackError) {\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_EXPERIMENT_ROLLBACK_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { experimentId: args.id },\n },\n rollbackError,\n );\n }\n throw error;\n } finally {\n connection.release();\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_EXPERIMENT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n // Tool mock reports are produced only when an experiment used item-level tool\n // mocks — which the MySQL adapter rejects on write. Guard here too so a report\n // is never silently dropped.\n if (input.toolMockReport) {\n throw new MastraError({\n id: 'MYSQL_EXPERIMENT_TOOL_MOCK_REPORT_UNSUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Tool mock reports are not supported on the MySQL storage adapter. Use a supported adapter (LibSQL, PostgreSQL, MongoDB, or Spanner) to persist experiment tool mock reports.',\n });\n }\n try {\n const id = input.id ?? globalThis.crypto.randomUUID();\n const now = new Date();\n const purgeMetadata = await this.#withPurgeBarrier(\n input.experimentId,\n input.itemId,\n async (connection, marker) => {\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_EXPERIMENT_RESULTS)} (\n ${[\n 'id',\n 'experimentId',\n 'itemId',\n 'itemDatasetVersion',\n 'organizationId',\n 'projectId',\n 'input',\n 'output',\n 'groundTruth',\n 'metadata',\n 'error',\n 'startedAt',\n 'completedAt',\n 'retryCount',\n 'attempt',\n 'traceId',\n 'status',\n 'tags',\n 'createdAt',\n ]\n .map(column => quoteIdentifier(column, 'column name'))\n .join(', ')}\n ) VALUES (${Array.from({ length: 19 }, () => '?').join(', ')})`,\n [\n id,\n input.experimentId,\n input.itemId,\n input.itemDatasetVersion ?? null,\n input.organizationId ?? null,\n input.projectId ?? null,\n JSON.stringify(marker ? null : input.input),\n marker || input.output == null ? null : JSON.stringify(input.output),\n marker || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n JSON.stringify(marker ?? input.metadata ?? null),\n marker || input.error == null ? null : JSON.stringify(input.error),\n input.startedAt,\n input.completedAt,\n input.retryCount,\n input.attempt ?? 0,\n input.traceId ?? null,\n input.status ?? null,\n marker || input.tags == null ? null : JSON.stringify(input.tags),\n now,\n ],\n );\n return marker;\n },\n );\n\n return {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n input: purgeMetadata ? null : input.input,\n output: purgeMetadata ? null : input.output,\n groundTruth: purgeMetadata ? null : input.groundTruth,\n metadata: purgeMetadata ?? input.metadata ?? null,\n error: purgeMetadata ? null : input.error,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n attempt: input.attempt ?? 0,\n traceId: input.traceId ?? null,\n status: input.status ?? null,\n tags: purgeMetadata ? null : (input.tags ?? null),\n createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_ADD_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentResultById(args: {\n id: string;\n filters?: ExperimentTenancyFilters;\n }): Promise<ExperimentResult | null> {\n try {\n // prepareWhereClause ignores undefined values, so this scopes the SELECT only\n // when the caller passed tenancy filters.\n const row = await this.operations.load<ExperimentResultRow>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n keys: {\n id: args.id,\n organizationId: args.filters?.organizationId,\n projectId: args.filters?.projectId,\n },\n });\n return row ? this.mapExperimentResult(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_GET_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async upsertExperimentResult(input: UpsertExperimentResultInput): Promise<ExperimentResult> {\n // Mirror the addExperimentResult guard: this adapter never persists tool mock reports.\n if (input.toolMockReport) {\n throw new MastraError({\n id: 'MYSQL_EXPERIMENT_TOOL_MOCK_REPORT_UNSUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Tool mock reports are not supported on the MySQL storage adapter. Use a supported adapter (LibSQL, PostgreSQL, MongoDB, or Spanner) to persist experiment tool mock reports.',\n });\n }\n try {\n const attempt = input.attempt ?? 0;\n return await this.#withPurgeBarrier(input.experimentId, input.itemId, async (connection, marker) => {\n const tableName = formatTableName(TABLE_EXPERIMENT_RESULTS);\n const updateColumns = [\n 'itemDatasetVersion',\n 'organizationId',\n 'projectId',\n 'input',\n 'output',\n 'groundTruth',\n 'metadata',\n 'error',\n 'startedAt',\n 'completedAt',\n 'retryCount',\n 'attempt',\n 'traceId',\n 'status',\n 'tags',\n ];\n const updateValues = [\n input.itemDatasetVersion ?? null,\n input.organizationId ?? null,\n input.projectId ?? null,\n JSON.stringify(marker ? null : input.input),\n marker || input.output == null ? null : JSON.stringify(input.output),\n marker || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n JSON.stringify(marker ?? input.metadata ?? null),\n marker || input.error == null ? null : JSON.stringify(input.error),\n input.startedAt,\n input.completedAt,\n input.retryCount,\n attempt,\n input.traceId ?? null,\n input.status ?? null,\n marker || input.tags == null ? null : JSON.stringify(input.tags),\n ];\n const columns = ['id', 'experimentId', 'itemId', ...updateColumns, 'createdAt'];\n\n await connection.execute(\n `INSERT INTO ${tableName} (${columns.map(column => quoteIdentifier(column, 'column name')).join(', ')})\n VALUES (${Array.from({ length: columns.length }, () => '?').join(', ')})\n ON DUPLICATE KEY UPDATE ${updateColumns\n .map(\n column =>\n `${quoteIdentifier(column, 'column name')} = VALUES(${quoteIdentifier(column, 'column name')})`,\n )\n .join(', ')}`,\n [globalThis.crypto.randomUUID(), input.experimentId, input.itemId, ...updateValues, new Date()],\n );\n\n const [rows] = await connection.execute(\n `SELECT * FROM ${tableName} WHERE ${quoteIdentifier('experimentId', 'column name')} = ? AND ${quoteIdentifier('itemId', 'column name')} = ? AND ${quoteIdentifier('attempt', 'column name')} = ?`,\n [input.experimentId, input.itemId, attempt],\n );\n const row = Array.isArray(rows) ? (rows[0] as ExperimentResultRow | undefined) : undefined;\n if (!row) {\n throw new MastraError({\n id: 'MYSQL_UPSERT_EXPERIMENT_RESULT_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment result not found after upsert`,\n details: { experimentId: input.experimentId, itemId: input.itemId, attempt },\n });\n }\n return this.mapExperimentResult(row);\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPSERT_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n try {\n const existing = await this.operations.load<ExperimentResultRow>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n keys: { id: input.id },\n });\n if (!existing) {\n throw new Error(`Experiment result not found: ${input.id}`);\n }\n if (input.experimentId && existing.experimentId !== input.experimentId) {\n throw new Error(`Experiment result ${input.id} does not belong to experiment ${input.experimentId}`);\n }\n\n return await this.#withPurgeBarrier(existing.experimentId, existing.itemId, async (connection, marker) => {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_EXPERIMENT_RESULTS)}\n SET ${quoteIdentifier('status', 'column name')} = CASE WHEN ? THEN ? ELSE ${quoteIdentifier('status', 'column name')} END,\n ${quoteIdentifier('tags', 'column name')} = CASE WHEN ? THEN NULL WHEN ? THEN ? ELSE ${quoteIdentifier('tags', 'column name')} END,\n ${quoteIdentifier('comment', 'column name')} = CASE WHEN ? THEN NULL WHEN ? THEN ? ELSE ${quoteIdentifier('comment', 'column name')} END\n WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [\n input.status !== undefined,\n input.status ?? null,\n Boolean(marker),\n input.tags !== undefined,\n input.tags === undefined ? null : JSON.stringify(input.tags),\n Boolean(marker),\n input.comment !== undefined,\n input.comment ?? null,\n input.id,\n ],\n );\n const [rows] = await connection.execute(\n `SELECT * FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [input.id],\n );\n const row = Array.isArray(rows) ? (rows[0] as ExperimentResultRow | undefined) : undefined;\n if (!row) throw new Error(`Experiment result ${input.id} not found after update`);\n return this.mapExperimentResult(row);\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPDATE_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n try {\n const rows = await this.operations.query<{\n experimentId: string;\n status: string | null;\n count: number;\n }>(\n `SELECT ${quoteIdentifier('experimentId', 'column name')}, ${quoteIdentifier('status', 'column name')}, COUNT(*) as count FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} GROUP BY ${quoteIdentifier('experimentId', 'column name')}, ${quoteIdentifier('status', 'column name')}`,\n );\n\n const counts = new Map<string, ExperimentReviewCounts>();\n for (const row of rows) {\n let entry = counts.get(row.experimentId);\n if (!entry) {\n entry = { experimentId: row.experimentId, total: 0, needsReview: 0, reviewed: 0, complete: 0 };\n counts.set(row.experimentId, entry);\n }\n const count = Number(row.count);\n entry.total += count;\n if (row.status === 'needs-review') entry.needsReview += count;\n else if (row.status === 'reviewed') entry.reviewed += count;\n else if (row.status === 'complete') entry.complete += count;\n }\n\n return Array.from(counts.values());\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_GET_REVIEW_SUMMARY_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 orderBy = resolveListOrderBy(args.orderBy, ['startedAt', 'createdAt'], {\n field: 'startedAt',\n direction: 'ASC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n\n const conditions: string[] = [`${quoteIdentifier('experimentId', 'column name')} = ?`];\n const params: any[] = [args.experimentId];\n if (args.traceId) {\n conditions.push(`${quoteIdentifier('traceId', 'column name')} = ?`);\n params.push(args.traceId);\n }\n if (args.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(args.status);\n }\n // All requested tags must be present (AND semantics)\n for (const tag of args.tags ?? []) {\n conditions.push(`JSON_CONTAINS(${quoteIdentifier('tags', 'column name')}, ?, '$')`);\n params.push(JSON.stringify(tag));\n }\n if (args.filters) {\n const { organizationId, projectId } = args.filters;\n if (organizationId !== undefined) {\n conditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n params.push(organizationId);\n }\n if (projectId !== undefined) {\n conditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n params.push(projectId);\n }\n }\n\n const whereClause = {\n sql: ` WHERE ${conditions.join(' AND ')}`,\n args: params,\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_EXPERIMENT_RESULTS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<ExperimentResultRow>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n whereClause,\n orderBy: `${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC`,\n offset,\n limit: limitValue,\n });\n\n return {\n results: rows.map(row => this.mapExperimentResult(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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; filters?: ExperimentTenancyFilters }): Promise<void> {\n try {\n // Tenancy predicate folded into the DELETE via a scoped parent subquery.\n // Silent no-op on mismatch.\n if (args.filters?.organizationId !== undefined || args.filters?.projectId !== undefined) {\n const tenancyConditions: string[] = [];\n const tenancyParams: any[] = [];\n if (args.filters?.organizationId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n tenancyParams.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n tenancyParams.push(args.filters.projectId);\n }\n const parentWhere = ['id = ?', ...tenancyConditions].join(' AND ');\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${parentWhere})`,\n [args.experimentId, ...tenancyParams],\n );\n return;\n }\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} = ?`,\n [args.experimentId],\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_EXPERIMENT_RESULTS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n FavoritesStorage,\n createStorageErrorId,\n TABLE_AGENTS,\n TABLE_SKILLS,\n TABLE_FAVORITES,\n TABLE_SCHEMAS,\n FAVORITES_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageDeleteFavoritesForEntityInput,\n StorageIsFavoritedBatchInput,\n StorageListFavoritesInput,\n StorageFavoriteEntityType,\n StorageFavoriteKey,\n} from '@mastra/core/storage';\nimport type { FavoriteToggleResult } from '@mastra/core/storage/domains/favorites';\nimport type { Pool, RowDataPacket, ResultSetHeader } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\n/**\n * Maps a favorite entity type to its parent entity table.\n */\nconst ENTITY_TABLE: Record<StorageFavoriteEntityType, typeof TABLE_AGENTS | typeof TABLE_SKILLS> = {\n agent: TABLE_AGENTS,\n skill: TABLE_SKILLS,\n};\n\nexport class FavoritesMySQL extends FavoritesStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_FAVORITES] as const;\n\n /**\n * Returns default index definitions for the favorites domain tables.\n * Currently no default indexes are defined for favorites.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_FAVORITES,\n schema: TABLE_SCHEMAS[TABLE_FAVORITES],\n compositePrimaryKey: ['userId', 'entityType', 'entityId'],\n }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (FavoritesMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the favorites domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return FavoritesMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for favorites.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for favorites domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_FAVORITES,\n schema: FAVORITES_SCHEMA,\n });\n\n // The composite PRIMARY KEY (userId, entityType, entityId) created by createTable\n // already enforces uniqueness for INSERT IGNORE idempotency. No extra unique index needed.\n\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.withTransaction(async connection => {\n await connection.execute(`DELETE FROM ${formatTableName(TABLE_FAVORITES)}`);\n // Reset denormalized counters on parent entities\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_AGENTS)} SET ${quoteIdentifier('favoriteCount', 'column name')} = 0 WHERE ${quoteIdentifier('favoriteCount', 'column name')} > 0`,\n );\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_SKILLS)} SET ${quoteIdentifier('favoriteCount', 'column name')} = 0 WHERE ${quoteIdentifier('favoriteCount', 'column name')} > 0`,\n );\n });\n }\n\n async favorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n const { userId, entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n\n try {\n return await this.operations.withTransaction(async connection => {\n // Verify entity exists\n const [entityRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n if (!entityRows[0]) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'FAVORITE', 'ENTITY_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `${entityType} ${entityId} not found`,\n details: { entityType, entityId },\n });\n }\n\n // Idempotent insert using INSERT IGNORE\n const [insertResult] = await connection.execute<ResultSetHeader>(\n `INSERT IGNORE INTO ${formatTableName(TABLE_FAVORITES)} (${quoteIdentifier('userId', 'column name')}, ${quoteIdentifier('entityType', 'column name')}, ${quoteIdentifier('entityId', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}) VALUES (?, ?, ?, ?)`,\n [userId, entityType, entityId, new Date().toISOString()],\n );\n\n // Only bump counter when we actually inserted a new row\n if (insertResult.affectedRows > 0) {\n await connection.execute(\n `UPDATE ${formatTableName(entityTable)} SET ${quoteIdentifier('favoriteCount', 'column name')} = COALESCE(${quoteIdentifier('favoriteCount', 'column name')}, 0) + 1 WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n }\n\n const [afterRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n const favoriteCount = Number(afterRows[0]?.favoriteCount ?? 0);\n\n return { favorited: true, favoriteCount };\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'FAVORITE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async unfavorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n const { userId, entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n\n try {\n return await this.operations.withTransaction(async connection => {\n const [entityRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n if (!entityRows[0]) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UNFAVORITE', 'ENTITY_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `${entityType} ${entityId} not found`,\n details: { entityType, entityId },\n });\n }\n\n const [deleteResult] = await connection.execute<ResultSetHeader>(\n `DELETE FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} = ?`,\n [userId, entityType, entityId],\n );\n\n // Only decrement when we actually removed a row, clamp at 0\n if (deleteResult.affectedRows > 0) {\n await connection.execute(\n `UPDATE ${formatTableName(entityTable)} SET ${quoteIdentifier('favoriteCount', 'column name')} = GREATEST(COALESCE(${quoteIdentifier('favoriteCount', 'column name')}, 0) - 1, 0) WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n }\n\n const [afterRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n const favoriteCount = Number(afterRows[0]?.favoriteCount ?? 0);\n\n return { favorited: false, favoriteCount };\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'UNFAVORITE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async isFavorited(input: StorageFavoriteKey): Promise<boolean> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT 1 FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} = ? LIMIT 1`,\n [input.userId, input.entityType, input.entityId],\n );\n return rows.length > 0;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'IS_FAVORITED', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async isFavoritedBatch(input: StorageIsFavoritedBatchInput): Promise<Set<string>> {\n const { userId, entityType, entityIds } = input;\n if (entityIds.length === 0) {\n return new Set();\n }\n\n try {\n const placeholders = entityIds.map(() => '?').join(', ');\n const args = [userId, entityType, ...entityIds];\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('entityId', 'column name')} FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} IN (${placeholders})`,\n args,\n );\n const set = new Set<string>();\n for (const row of rows) {\n set.add(row.entityId as string);\n }\n return set;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'IS_FAVORITED_BATCH', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listFavoritedIds(input: StorageListFavoritesInput): Promise<string[]> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('entityId', 'column name')} FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? ORDER BY ${quoteIdentifier('createdAt', 'column name')} DESC, ${quoteIdentifier('entityId', 'column name')} ASC`,\n [input.userId, input.entityType],\n );\n return rows.map(row => row.entityId as string);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'LIST_FAVORITED_IDS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteFavoritesForEntity(input: StorageDeleteFavoritesForEntityInput): Promise<number> {\n const entityTable = ENTITY_TABLE[input.entityType];\n try {\n return await this.operations.withTransaction(async connection => {\n const [result] = await connection.execute<ResultSetHeader>(\n `DELETE FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} = ?`,\n [input.entityType, input.entityId],\n );\n // Reset the parent entity's favoriteCount\n await connection.execute(\n `UPDATE ${formatTableName(entityTable)} SET ${quoteIdentifier('favoriteCount', 'column name')} = 0 WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [input.entityId],\n );\n return result.affectedRows;\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'DELETE_FAVORITES_FOR_ENTITY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType: input.entityType, entityId: input.entityId },\n },\n error,\n );\n }\n }\n}\n","import {\n canonicalizeKnowledgeScope,\n createKnowledgeUlid,\n isKnowledgeScopeVisible,\n KNOWLEDGE_ACTIVITY_SCHEMA,\n KNOWLEDGE_RECORDS_SCHEMA,\n KNOWLEDGE_MENTIONS_SCHEMA,\n KNOWLEDGE_NODES_SCHEMA,\n KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n knowledgeScopeKey,\n knowledgeSemanticDocumentId,\n knowledgeSemanticIdempotencyKey,\n KnowledgeConflictError,\n KnowledgeNotFoundError,\n KnowledgeStorage,\n parseKnowledgeNodeCursor,\n parseKnowledgeWikilinks,\n TABLE_KNOWLEDGE_ACTIVITY,\n TABLE_KNOWLEDGE_RECORDS,\n TABLE_KNOWLEDGE_MENTIONS,\n TABLE_KNOWLEDGE_NODES,\n TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n} from '@mastra/core/storage';\nimport type {\n AppendKnowledgeInput,\n ClaimKnowledgeSemanticOutboxInput,\n CreateKnowledgeNodeInput,\n KnowledgeActivityAction,\n KnowledgeActivityEvent,\n KnowledgeCurationCursor,\n KnowledgeNode,\n KnowledgeRecord,\n KnowledgeScope,\n KnowledgeSemanticDocumentType,\n KnowledgeSemanticOperation,\n KnowledgeSemanticOutboxEntry,\n ListKnowledgeNodesInput,\n QueryKnowledgeBySourceInput,\n QueryKnowledgeInput,\n QueryKnowledgeOutput,\n SearchKnowledgeInput,\n SearchKnowledgeResult,\n UpdateKnowledgeNodeInput,\n} from '@mastra/core/storage';\nimport type { Pool, PoolConnection, ResultSetHeader, RowDataPacket } from 'mysql2/promise';\n\nimport { generateTableSQL } from '../operations';\nimport type { StoreOperationsMySQL } from '../operations';\n\n// #21830 shipped this helper in core 1.63.1; resolve it lazily so an older\n// installed core fails feature-detection instead of breaking module load.\nlet assertDescriptionWithinBound: ((description: string | undefined) => void) | undefined;\nasync function assertKnowledgeDescriptionWithinBoundCompat(description: string | undefined): Promise<void> {\n let assertWithinBound = assertDescriptionWithinBound;\n if (!assertWithinBound) {\n const mod: Partial<typeof import('@mastra/core/storage')> = await import('@mastra/core/storage');\n const resolvedAssert: (description: string | undefined) => void =\n mod.assertKnowledgeDescriptionWithinBound ??\n (value => {\n if (value !== undefined && value.length > 400) {\n throw new Error('Knowledge node description exceeds the 400 UTF-16 code unit limit');\n }\n });\n assertDescriptionWithinBound = resolvedAssert;\n assertWithinBound = resolvedAssert;\n }\n assertWithinBound(description);\n}\n\nlet assertRecordTextWithinBound: ((text: string) => void) | undefined;\nasync function assertKnowledgeRecordTextWithinBoundCompat(text: string): Promise<void> {\n if (!assertRecordTextWithinBound) {\n const mod: Partial<typeof import('@mastra/core/storage')> = await import('@mastra/core/storage');\n assertRecordTextWithinBound =\n mod.assertKnowledgeRecordTextWithinBound ??\n (value => {\n if (value.length > 1000) {\n throw new Error(\n 'Knowledge record text exceeds the 1000 UTF-16 code unit limit; split it into separate facts or summarize it',\n );\n }\n });\n }\n assertRecordTextWithinBound(text);\n}\n\ninterface QueryResult {\n rows: Record<string, unknown>[];\n rowsAffected: number;\n}\n\ninterface Executor {\n execute(statement: string | { sql: string; args?: unknown[] }): Promise<QueryResult>;\n}\n\nfunction mysqlSql(sql: string): string {\n return sql\n .replaceAll('jsonb(?)', 'CAST(? AS JSON)')\n .replaceAll('INSERT OR IGNORE', 'INSERT IGNORE')\n .replaceAll('\"', '`');\n}\n\nfunction createExecutor(client: Pick<Pool, 'query'> | Pick<PoolConnection, 'query'>): Executor {\n return {\n async execute(statement) {\n const sql = typeof statement === 'string' ? statement : statement.sql;\n const args = (typeof statement === 'string' ? [] : (statement.args ?? [])).map(value =>\n typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(value)\n ? value.replace('T', ' ').replace('Z', '')\n : value,\n );\n const [result] = await client.query(mysqlSql(sql), args);\n if (Array.isArray(result)) return { rows: result as RowDataPacket[], rowsAffected: 0 };\n return { rows: [], rowsAffected: (result as ResultSetHeader).affectedRows };\n },\n };\n}\n\n/**\n * Scope keys visible to a caller holding `scope`: a row is visible when its scope is a subset of the\n * caller's (companion entries such as `resource:x:uncurated` make this more than a prefix match).\n * Matching rows by `scopeKey` keeps visibility filters on an index; a caller scope has only a few\n * entries, so the list stays small.\n */\nfunction visibleScopeKeys(scope: KnowledgeScope): string[] {\n const canonical = canonicalizeKnowledgeScope(scope);\n const keys = new Set<string>();\n for (let mask = 1; mask < 1 << canonical.length; mask++) {\n try {\n keys.add(knowledgeScopeKey(canonical.filter((_, index) => mask & (1 << index))));\n } catch {\n // Not a valid scope, so no stored row can carry it.\n }\n }\n return [...keys];\n}\n\nconst visibleSql = (keys: string[], scopeKeyColumn = 'scopeKey') =>\n `${scopeKeyColumn} IN (${keys.map(() => '?').join(',')})`;\n\nfunction parseJson<T>(value: unknown): T {\n if (typeof value === 'string') return JSON.parse(value) as T;\n if (value instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(value)) as T;\n if (value instanceof ArrayBuffer) return JSON.parse(new TextDecoder().decode(value)) as T;\n return value as T;\n}\n\nfunction toDate(value: unknown): Date {\n return value instanceof Date ? new Date(value) : new Date(String(value));\n}\n\nfunction optionalDate(value: unknown): Date | undefined {\n return value == null ? undefined : toDate(value);\n}\n\nfunction databaseTimestamp(value: Date): string {\n const pad = (part: number, width = 2) => String(part).padStart(width, '0');\n return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())} ${pad(value.getHours())}:${pad(value.getMinutes())}:${pad(value.getSeconds())}.${pad(value.getMilliseconds(), 3)}`;\n}\n\nfunction canonicalName(name: string): string {\n return name.trim().toLocaleLowerCase();\n}\n\nfunction nodeReferenceId(node: KnowledgeNode | string): string {\n return typeof node === 'string' ? node : node.id;\n}\n\nfunction escapeLikePattern(value: string): string {\n return value.replaceAll('=', '==').replaceAll('%', '=%').replaceAll('_', '=_');\n}\n\nfunction parseNode(row: Record<string, unknown>): KnowledgeNode {\n return {\n id: String(row.id),\n type: 'node',\n name: String(row.name),\n kind: String(row.kind),\n content: row.content == null ? undefined : String(row.content),\n description: row.description == null ? undefined : String(row.description),\n scope: parseJson(row.scopeJson ?? row.scope),\n version: Number(row.version),\n mergedInto: row.mergedInto == null ? undefined : String(row.mergedInto),\n createdAt: toDate(row.createdAt),\n updatedAt: toDate(row.updatedAt),\n };\n}\n\nfunction parseKnowledge(row: Record<string, unknown>): KnowledgeRecord {\n return {\n id: String(row.id),\n node: String(row.node),\n text: String(row.text),\n scope: parseJson(row.scopeJson ?? row.scope),\n sourceThreadId: String(row.sourceThreadId),\n capturedAt: toDate(row.capturedAt),\n when: optionalDate(row.when),\n metadata: row.metadata == null ? undefined : parseJson<Record<string, unknown>>(row.metadata),\n deletedAt: optionalDate(row.deletedAt),\n deletedBy: row.deletedBy == null ? undefined : String(row.deletedBy),\n };\n}\n\nfunction parseOutbox(row: Record<string, unknown>): KnowledgeSemanticOutboxEntry {\n return {\n id: String(row.id),\n idempotencyKey: String(row.idempotencyKey),\n documentId: String(row.documentId),\n documentType: String(row.documentType) as KnowledgeSemanticDocumentType,\n operation: String(row.operation) as KnowledgeSemanticOperation,\n scope: parseJson(row.scopeJson ?? row.scope),\n status: String(row.status) as KnowledgeSemanticOutboxEntry['status'],\n attempts: Number(row.attempts),\n availableAt: toDate(row.availableAt),\n claimedAt: optionalDate(row.claimedAt),\n claimedBy: row.claimedBy == null ? undefined : String(row.claimedBy),\n createdAt: toDate(row.createdAt),\n completedAt: optionalDate(row.completedAt),\n };\n}\n\nconst KNOWLEDGE_INDEX_DDL = [\n `CREATE UNIQUE INDEX idx_knowledge_nodes_identity ON \"${TABLE_KNOWLEDGE_NODES}\" (type(32), scopeKey(255), canonicalName(255))`,\n `CREATE INDEX idx_knowledge_nodes_scope ON \"${TABLE_KNOWLEDGE_NODES}\" (scopeKey(255), type(32))`,\n `CREATE INDEX idx_knowledge_nodes_name ON \"${TABLE_KNOWLEDGE_NODES}\" (type(32), canonicalName(255))`,\n `CREATE INDEX idx_knowledge_records_node_latest ON \"${TABLE_KNOWLEDGE_RECORDS}\" (node(191), id(26) DESC)`,\n `CREATE INDEX idx_knowledge_records_thread_latest ON \"${TABLE_KNOWLEDGE_RECORDS}\" (sourceThreadId(191), id(26) DESC)`,\n `CREATE INDEX idx_knowledge_mentions_record ON \"${TABLE_KNOWLEDGE_MENTIONS}\" (recordId(191), sourceType(32), sourceId(191))`,\n `CREATE INDEX idx_knowledge_activity_latest ON \"${TABLE_KNOWLEDGE_ACTIVITY}\" (id(26) DESC)`,\n `CREATE INDEX idx_knowledge_records_scope ON \"${TABLE_KNOWLEDGE_RECORDS}\" (scopeKey(255), id(26))`,\n `CREATE INDEX idx_knowledge_activity_scope ON \"${TABLE_KNOWLEDGE_ACTIVITY}\" (scopeKey(255), id(26) DESC)`,\n `CREATE UNIQUE INDEX idx_knowledge_outbox_idempotency ON \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (idempotencyKey(255))`,\n `CREATE INDEX idx_knowledge_outbox_claim ON \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (status(32), availableAt, createdAt)`,\n];\n\n// Duplicated from Core so this adapter keeps working against Core versions that predate the deprecation.\nconst KNOWLEDGE_CURATION_CURSOR_REMOVED_MESSAGE =\n 'Knowledge curation cursors were removed: observation-time curate is the only Knowledge writer and needs no cursor.';\n\nexport class KnowledgeMySQL extends KnowledgeStorage {\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_NODES, schema: KNOWLEDGE_NODES_SCHEMA }),\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_RECORDS, schema: KNOWLEDGE_RECORDS_SCHEMA }),\n generateTableSQL({\n tableName: TABLE_KNOWLEDGE_MENTIONS,\n schema: KNOWLEDGE_MENTIONS_SCHEMA,\n compositePrimaryKey: ['sourceType', 'sourceId', 'recordId'],\n }),\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_ACTIVITY, schema: KNOWLEDGE_ACTIVITY_SCHEMA }),\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_SEMANTIC_OUTBOX, schema: KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA }),\n ...KNOWLEDGE_INDEX_DDL.map(mysqlSql),\n ];\n }\n\n readonly #pool: Pool;\n readonly #client: Executor;\n readonly #operations: StoreOperationsMySQL;\n\n constructor({ pool, operations }: { pool: Pool; operations: StoreOperationsMySQL }) {\n super();\n this.#pool = pool;\n this.#client = createExecutor(pool);\n this.#operations = operations;\n }\n\n async init(): Promise<void> {\n await this.#operations.createTable({ tableName: TABLE_KNOWLEDGE_NODES, schema: KNOWLEDGE_NODES_SCHEMA });\n // Add description column for backwards compatibility with existing databases\n await this.#operations.alterTable({\n tableName: TABLE_KNOWLEDGE_NODES,\n schema: KNOWLEDGE_NODES_SCHEMA,\n ifNotExists: ['description'],\n });\n await this.#operations.createTable({ tableName: TABLE_KNOWLEDGE_RECORDS, schema: KNOWLEDGE_RECORDS_SCHEMA });\n await this.#operations.createTable({\n tableName: TABLE_KNOWLEDGE_MENTIONS,\n schema: KNOWLEDGE_MENTIONS_SCHEMA,\n });\n await this.#operations.createTable({ tableName: TABLE_KNOWLEDGE_ACTIVITY, schema: KNOWLEDGE_ACTIVITY_SCHEMA });\n await this.#operations.createTable({\n tableName: TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n schema: KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n });\n for (const sql of KNOWLEDGE_INDEX_DDL) {\n try {\n await this.#client.execute(sql);\n } catch (error) {\n if ((error as { code?: string }).code !== 'ER_DUP_KEYNAME') throw error;\n }\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#transaction(async tx => {\n for (const table of [\n TABLE_KNOWLEDGE_MENTIONS,\n TABLE_KNOWLEDGE_RECORDS,\n TABLE_KNOWLEDGE_NODES,\n TABLE_KNOWLEDGE_ACTIVITY,\n TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n ]) {\n await tx.execute(`DELETE FROM \"${table}\"`);\n }\n });\n }\n\n async createNode(input: CreateKnowledgeNodeInput): Promise<KnowledgeNode> {\n await assertKnowledgeDescriptionWithinBoundCompat(input.description);\n if (input.scopeAddresses?.length) {\n // Peer-floor safe: mirrors KnowledgeUnsupportedCapabilityError without importing it.\n const error = new Error('This Knowledge storage adapter does not expose structural scope placement.');\n error.name = 'KnowledgeUnsupportedCapabilityError';\n throw error;\n }\n const scope = canonicalizeKnowledgeScope(input.scope);\n return this.#transaction(async tx => {\n const existing = await this.#getNodeByName(tx, input.name, scope);\n if (existing) {\n const terminal = (await this.#resolveTerminalNode(tx, existing.id))!;\n if (!isKnowledgeScopeVisible(terminal.scope, scope)) {\n throw new Error(`Merged knowledge node is not visible from scope: ${input.name}`);\n }\n return terminal;\n }\n const now = new Date();\n const node: KnowledgeNode = {\n id: input.id ?? crypto.randomUUID(),\n type: 'node',\n name: input.name.trim(),\n kind: input.kind,\n content: input.content,\n description: input.description,\n scope,\n version: 1,\n createdAt: now,\n updatedAt: now,\n };\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_NODES}\" (id,type,name,canonicalName,kind,content,description,scope,scopeKey,version,mergedInto,createdAt,updatedAt) VALUES (?,?,?,?,?,?,?,jsonb(?),?,?,NULL,?,?)`,\n args: [\n node.id,\n 'node',\n node.name,\n canonicalName(node.name),\n node.kind,\n node.content ?? null,\n node.description ?? null,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n node.version,\n now.toISOString(),\n now.toISOString(),\n ],\n });\n await this.#replaceMentions(tx, 'node', node.id, node.content ?? '', input.resolutionScope ?? scope, scope);\n await this.#activity(tx, 'node-created', 'node', node.id, scope);\n await this.#outbox(tx, 'node', node.id, 'upsert', node.version, scope);\n return node;\n });\n }\n\n async getNode(id: string): Promise<KnowledgeNode | null> {\n return this.#getNode(this.#client, id);\n }\n\n async getNodeByName(input: { name: string; scope: KnowledgeScope }): Promise<KnowledgeNode | null> {\n return this.#getNodeByName(this.#client, input.name, canonicalizeKnowledgeScope(input.scope));\n }\n\n async resolveNode(input: { name: string; scope: KnowledgeScope }): Promise<KnowledgeNode | null> {\n return this.#resolveNode(this.#client, input.name, canonicalizeKnowledgeScope(input.scope));\n }\n\n async listNodes(input: ListKnowledgeNodesInput): Promise<KnowledgeNode[]> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const clauses = [`type = 'node'`, 'mergedInto IS NULL', visibleSql(keys)];\n const args: unknown[] = [...keys];\n if (input.namePrefix) {\n clauses.push(\"canonicalName LIKE ? ESCAPE '='\");\n args.push(`${escapeLikePattern(canonicalName(input.namePrefix))}%`);\n }\n if (input.kind) {\n clauses.push('kind = ?');\n args.push(input.kind);\n }\n if (input.hasContent !== undefined)\n clauses.push(input.hasContent ? \"content IS NOT NULL AND content <> ''\" : \"(content IS NULL OR content = '')\");\n if (input.cursor) {\n const cursor = parseKnowledgeNodeCursor(input.cursor, {\n namePrefix: input.namePrefix,\n kind: input.kind,\n hasContent: input.hasContent,\n });\n const updatedAt = databaseTimestamp(cursor.updatedAt);\n clauses.push('(updatedAt < ? OR (updatedAt = ? AND (name > ? OR (name = ? AND id > ?))))');\n args.push(updatedAt, updatedAt, cursor.name, cursor.name, cursor.id);\n }\n args.push(input.limit ?? 100);\n const result = await this.#client.execute({\n sql: `SELECT *, scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE ${clauses.join(' AND ')} ORDER BY updatedAt DESC, name ASC, id ASC LIMIT ?`,\n args,\n });\n return result.rows.map(parseNode);\n }\n\n async updateNode(input: UpdateKnowledgeNodeInput): Promise<KnowledgeNode> {\n await assertKnowledgeDescriptionWithinBoundCompat(input.description);\n return this.#transaction(async tx => {\n const existing = await this.#getNode(tx, input.id);\n if (!existing) throw new KnowledgeNotFoundError('node', input.id);\n if (existing.mergedInto) throw new Error(`Cannot update merged knowledge node: ${input.id}`);\n const scope = canonicalizeKnowledgeScope(input.scope ?? existing.scope);\n const name = (input.name ?? existing.name).trim();\n const content = input.content ?? existing.content;\n const description = input.description ?? existing.description;\n const now = new Date();\n const result = await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET name=?,canonicalName=?,kind=?,content=?,description=?,scope=jsonb(?),scopeKey=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=?`,\n args: [\n name,\n canonicalName(name),\n input.kind ?? existing.kind,\n content ?? null,\n description ?? null,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n now.toISOString(),\n input.id,\n input.version,\n ],\n });\n if (result.rowsAffected === 0) throw new KnowledgeConflictError(input.id);\n if (input.content !== undefined || input.name !== undefined || input.scope !== undefined) {\n await this.#replaceMentions(tx, 'node', input.id, content ?? '', input.resolutionScope ?? scope, scope);\n }\n await this.#activity(tx, 'node-updated', 'node', input.id, scope);\n if (knowledgeScopeKey(existing.scope) !== knowledgeScopeKey(scope)) {\n await this.#outbox(tx, 'node', input.id, 'delete', createKnowledgeUlid(), existing.scope);\n const records = await tx.execute({\n sql: `SELECT id,scope AS scopeJson,deletedAt FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE node=?`,\n args: [input.id],\n });\n for (const row of records.rows) {\n const factScope = parseJson<KnowledgeScope>(row.scopeJson);\n await this.#outbox(tx, 'record', String(row.id), 'delete', createKnowledgeUlid(), factScope);\n if (row.deletedAt == null) {\n await this.#outbox(tx, 'record', String(row.id), 'upsert', createKnowledgeUlid(), factScope);\n }\n }\n }\n await this.#outbox(tx, 'node', input.id, 'upsert', input.version + 1, scope);\n return {\n ...existing,\n name,\n kind: input.kind ?? existing.kind,\n content,\n description,\n scope,\n version: input.version + 1,\n updatedAt: now,\n };\n });\n }\n\n async mergeNodes(input: { sourceId: string; targetId: string; sourceVersion: number }): Promise<KnowledgeNode> {\n if (input.sourceId === input.targetId) throw new Error('Cannot merge a knowledge node into itself');\n return this.#transaction(async tx => {\n const source = await this.#getNode(tx, input.sourceId);\n if (!source) throw new KnowledgeNotFoundError('node', input.sourceId);\n const target = await this.#resolveTerminalNode(tx, input.targetId);\n if (!target) throw new KnowledgeNotFoundError('node', input.targetId);\n if (target.id === source.id) throw new Error('Cannot create a knowledge merge cycle');\n if (!isKnowledgeScopeVisible(target.scope, source.scope)) {\n throw new Error('Cannot merge a knowledge node into a target that is narrower than its source scope');\n }\n const affected = await tx.execute({\n sql: `SELECT DISTINCT m.sourceType,m.sourceId,COALESCE(f.scope,r.scope) AS scopeJson,CASE WHEN f.deletedAt IS NULL THEN 0 ELSE 1 END AS deleted FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" m LEFT JOIN \"${TABLE_KNOWLEDGE_RECORDS}\" f ON m.sourceType='record' AND f.id=m.sourceId LEFT JOIN \"${TABLE_KNOWLEDGE_NODES}\" r ON m.sourceType='node' AND r.id=m.sourceId WHERE m.recordId=?`,\n args: [source.id],\n });\n const movedFacts = await tx.execute({\n sql: `SELECT id,scope AS scopeJson,deletedAt FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE node=?`,\n args: [source.id],\n });\n const updated = await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET mergedInto=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=? AND mergedInto IS NULL`,\n args: [target.id, new Date().toISOString(), source.id, input.sourceVersion],\n });\n if (updated.rowsAffected === 0) throw new KnowledgeConflictError(source.id);\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET node=? WHERE node=?`,\n args: [target.id, source.id],\n });\n await tx.execute({\n sql: `DELETE source FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" source JOIN \"${TABLE_KNOWLEDGE_MENTIONS}\" target ON target.sourceType=source.sourceType AND target.sourceId=source.sourceId WHERE source.recordId=? AND target.recordId=?`,\n args: [source.id, target.id],\n });\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_MENTIONS}\" SET recordId=? WHERE recordId=?`,\n args: [target.id, source.id],\n });\n for (const row of movedFacts.rows)\n await this.#outbox(\n tx,\n 'record',\n String(row.id),\n row.deletedAt == null ? 'upsert' : 'delete',\n createKnowledgeUlid(),\n parseJson(row.scopeJson),\n );\n for (const row of affected.rows)\n await this.#outbox(\n tx,\n String(row.sourceType) as 'record' | 'node',\n String(row.sourceId),\n Number(row.deleted) ? 'delete' : 'upsert',\n createKnowledgeUlid(),\n parseJson<KnowledgeScope>(row.scopeJson),\n );\n // Merge matrix: a target that NEVER had a description (undefined — '' is an explicit curator\n // clear and wins) adopts the source's; otherwise the target's state is preserved.\n let mergedTarget = target;\n if (target.description === undefined && source.description) {\n const adoptedAt = new Date();\n // Adoption is conditional on the target state this merge observed: a concurrent write (a new\n // description, or an intentional '' clear) bumps the version and loses the predicate, so the\n // merge leaves that newer value alone instead of clobbering it with the source's synopsis.\n const adopted = await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET description=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=? AND description IS NULL`,\n args: [source.description, adoptedAt.toISOString(), target.id, target.version],\n });\n if (adopted.rowsAffected > 0) {\n mergedTarget = {\n ...target,\n description: source.description,\n version: target.version + 1,\n updatedAt: adoptedAt,\n };\n await this.#activity(tx, 'node-updated', 'node', target.id, target.scope);\n }\n }\n await this.#activity(tx, 'node-merged', 'node', source.id, source.scope);\n await this.#outbox(tx, 'node', source.id, 'delete', input.sourceVersion + 1, source.scope);\n await this.#outbox(tx, 'node', target.id, 'upsert', createKnowledgeUlid(), mergedTarget.scope);\n return mergedTarget;\n });\n }\n\n async appendKnowledge(input: AppendKnowledgeInput): Promise<KnowledgeRecord> {\n await assertKnowledgeRecordTextWithinBoundCompat(input.text);\n const scope = canonicalizeKnowledgeScope(input.scope);\n const resolutionScope = canonicalizeKnowledgeScope(input.resolutionScope);\n const defaultScope = canonicalizeKnowledgeScope(input.defaultScope);\n return this.#transaction(async tx => {\n const parent = await this.#resolveTerminalNode(tx, nodeReferenceId(input.node));\n if (!parent) throw new KnowledgeNotFoundError('node', nodeReferenceId(input.node));\n const record: KnowledgeRecord = {\n id: input.id ?? createKnowledgeUlid(),\n node: parent.id,\n text: input.text,\n scope,\n sourceThreadId: input.sourceThreadId,\n capturedAt: new Date(),\n when: input.when ? new Date(input.when) : undefined,\n metadata: input.metadata,\n };\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_RECORDS}\" (id,node,text,scope,scopeKey,sourceThreadId,capturedAt,\"when\",metadata,deletedAt,deletedBy) VALUES (?,?,?,jsonb(?),?,?,?,?,jsonb(?),NULL,NULL)`,\n args: [\n record.id,\n record.node,\n record.text,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n record.sourceThreadId,\n record.capturedAt.toISOString(),\n record.when?.toISOString() ?? null,\n record.metadata ? JSON.stringify(record.metadata) : null,\n ],\n });\n await this.#replaceMentions(tx, 'record', record.id, record.text, resolutionScope, defaultScope);\n await this.#activity(tx, 'record-created', 'record', record.id, scope, record.sourceThreadId);\n await this.#outbox(tx, 'record', record.id, 'upsert', record.id, scope);\n return record;\n });\n }\n\n async getKnowledge(input: { id: string; includeDeleted?: boolean }): Promise<KnowledgeRecord | null> {\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE id=?${input.includeDeleted ? '' : ' AND deletedAt IS NULL'}`,\n args: [input.id],\n });\n return result.rows[0] ? parseKnowledge(result.rows[0]) : null;\n }\n\n async listKnowledgeAbout(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n return this.#queryKnowledge(input, 'about');\n }\n async listKnowledgeMentioning(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n return this.#queryKnowledge(input, 'mentioning');\n }\n\n async listKnowledgeRelatedTo(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n return this.#queryKnowledge(input, 'related');\n }\n\n async knowledgeBySource(input: QueryKnowledgeBySourceInput): Promise<QueryKnowledgeOutput> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const args: unknown[] = [input.sourceThreadId, ...keys];\n if (input.after) args.push(input.after);\n const limit = input.limit ?? 100;\n args.push(limit + 1);\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE sourceThreadId=? AND ${visibleSql(keys)}${input.includeDeleted ? '' : ' AND deletedAt IS NULL'}${input.after ? ' AND id > ?' : ''} ORDER BY id ASC LIMIT ?`,\n args,\n });\n const records = result.rows.map(parseKnowledge);\n return {\n records: records.slice(0, limit),\n nextCursor: records.length > limit ? records[limit - 1]?.id : undefined,\n };\n }\n\n async removeKnowledge(input: { id: string; deletedBy: string }): Promise<KnowledgeRecord> {\n return this.#transaction(async tx => {\n const record = await this.#getKnowledge(tx, input.id, true);\n if (!record) throw new KnowledgeNotFoundError('record', input.id);\n if (record.deletedAt) return record;\n const deletedAt = new Date();\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET deletedAt=?,deletedBy=? WHERE id=? AND deletedAt IS NULL`,\n args: [deletedAt.toISOString(), input.deletedBy, input.id],\n });\n await this.#activity(tx, 'record-deleted', 'record', input.id, record.scope, record.sourceThreadId);\n await this.#outbox(tx, 'record', input.id, 'delete', deletedAt.toISOString(), record.scope);\n return { ...record, deletedAt, deletedBy: input.deletedBy };\n });\n }\n\n async restoreKnowledge(input: { id: string }): Promise<KnowledgeRecord> {\n return this.#transaction(async tx => {\n const record = await this.#getKnowledge(tx, input.id, true);\n if (!record) throw new KnowledgeNotFoundError('record', input.id);\n if (!record.deletedAt) return record;\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET deletedAt=NULL,deletedBy=NULL WHERE id=?`,\n args: [input.id],\n });\n await this.#activity(tx, 'record-restored', 'record', input.id, record.scope, record.sourceThreadId);\n await this.#outbox(tx, 'record', input.id, 'upsert', createKnowledgeUlid(), record.scope);\n return { ...record, deletedAt: undefined, deletedBy: undefined };\n });\n }\n\n async rescopeKnowledge(input: { id: string; scope: KnowledgeScope }): Promise<KnowledgeRecord> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n return this.#transaction(async tx => {\n const record = await this.#getKnowledge(tx, input.id, true);\n if (!record) throw new KnowledgeNotFoundError('record', input.id);\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET scope=jsonb(?),scopeKey=? WHERE id=?`,\n args: [JSON.stringify(scope), knowledgeScopeKey(scope), input.id],\n });\n await this.#activity(tx, 'record-rescoped', 'record', input.id, scope, record.sourceThreadId);\n if (knowledgeScopeKey(record.scope) !== knowledgeScopeKey(scope))\n await this.#outbox(tx, 'record', input.id, 'delete', createKnowledgeUlid(), record.scope);\n if (!record.deletedAt) await this.#outbox(tx, 'record', input.id, 'upsert', createKnowledgeUlid(), scope);\n return { ...record, scope };\n });\n }\n\n async search(input: SearchKnowledgeInput): Promise<SearchKnowledgeResult[]> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const normalizedQuery = input.query.trim().toLocaleLowerCase();\n if (!normalizedQuery) return [];\n const query = `%${escapeLikePattern(normalizedQuery)}%`;\n const records = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE mergedInto IS NULL AND ${visibleSql(keys)} AND (canonicalName LIKE ? ESCAPE '=' OR lower(COALESCE(kind,'')) LIKE ? ESCAPE '=' OR lower(COALESCE(content,'')) LIKE ? ESCAPE '=' OR lower(COALESCE(description,'')) LIKE ? ESCAPE '=') ORDER BY updatedAt DESC LIMIT ?`,\n args: [...keys, query, query, query, query, input.limit ?? 20],\n });\n const results: SearchKnowledgeResult[] = records.rows.map(row => ({\n type: String(row.type) as 'node',\n id: String(row.id),\n recordId: String(row.id),\n name: String(row.name),\n // Description joins the snippet only when present so description-less results stay byte-identical.\n text: [\n String(row.name),\n ...(row.description ? [String(row.description)] : []),\n ...(row.content ? [String(row.content)] : []),\n ].join('\\n'),\n scope: parseJson<KnowledgeScope>(row.scopeJson),\n }));\n if (results.length < (input.limit ?? 20)) {\n const records = await this.#client.execute({\n sql: `SELECT f.*,f.scope AS scopeJson,r.name,r.scope AS parentScopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" f JOIN \"${TABLE_KNOWLEDGE_NODES}\" r ON r.id=f.node AND r.type='node' AND r.mergedInto IS NULL WHERE f.deletedAt IS NULL AND ${visibleSql(keys, 'f.scopeKey')} AND lower(f.text) LIKE ? ESCAPE '=' ORDER BY f.id DESC LIMIT ?`,\n args: [...keys, query, (input.limit ?? 20) - results.length],\n });\n results.push(\n ...records.rows.map(row => {\n const parentVisible = isKnowledgeScopeVisible(parseJson<KnowledgeScope>(row.parentScopeJson), scope);\n return {\n type: 'record' as const,\n id: String(row.id),\n recordId: parentVisible ? String(row.node) : String(row.id),\n name: parentVisible ? String(row.name) : '(private node)',\n text: String(row.text),\n scope: parseJson<KnowledgeScope>(row.scopeJson),\n };\n }),\n );\n }\n return results;\n }\n\n /**\n * @deprecated Curation cursors were removed. Observation-time curate is the only Knowledge writer and needs no\n * cursor. Always throws.\n */\n async getCurationCursor(_input: { sourceThreadId: string; agent: string }): Promise<KnowledgeCurationCursor | null> {\n throw new Error(KNOWLEDGE_CURATION_CURSOR_REMOVED_MESSAGE);\n }\n\n /**\n * @deprecated Curation cursors were removed. Observation-time curate is the only Knowledge writer and needs no\n * cursor. Always throws.\n */\n async advanceCurationCursor(_input: {\n sourceThreadId: string;\n agent: string;\n lastKnowledgeId: string;\n }): Promise<KnowledgeCurationCursor> {\n throw new Error(KNOWLEDGE_CURATION_CURSOR_REMOVED_MESSAGE);\n }\n\n async listActivity(input: {\n scope: KnowledgeScope;\n after?: string;\n limit?: number;\n }): Promise<KnowledgeActivityEvent[]> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_ACTIVITY}\" WHERE ${visibleSql(keys)}${input.after ? ' AND id < ?' : ''} ORDER BY id DESC LIMIT ?`,\n args: [...keys, ...(input.after ? [input.after] : []), input.limit ?? 100],\n });\n return result.rows.map(row => ({\n id: String(row.id),\n action: String(row.action) as KnowledgeActivityAction,\n recordType: String(row.recordType) as KnowledgeSemanticDocumentType,\n recordId: String(row.recordId),\n scope: parseJson<KnowledgeScope>(row.scopeJson),\n sourceThreadId: row.sourceThreadId == null ? undefined : String(row.sourceThreadId),\n createdAt: toDate(row.createdAt),\n }));\n }\n\n async listSemanticOutbox(\n input: { status?: KnowledgeSemanticOutboxEntry['status']; scope?: KnowledgeScope; limit?: number } = {},\n ): Promise<KnowledgeSemanticOutboxEntry[]> {\n const clauses: string[] = [];\n const args: unknown[] = [];\n if (input.status) {\n clauses.push('status=?');\n args.push(input.status);\n }\n if (input.scope) {\n const keys = visibleScopeKeys(input.scope);\n clauses.push(visibleSql(keys));\n args.push(...keys);\n }\n args.push(input.limit ?? 100);\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\"${clauses.length ? ` WHERE ${clauses.join(' AND ')}` : ''} ORDER BY createdAt ASC,id ASC LIMIT ?`,\n args,\n });\n return result.rows.map(parseOutbox);\n }\n\n async claimSemanticOutbox(input: ClaimKnowledgeSemanticOutboxInput): Promise<KnowledgeSemanticOutboxEntry[]> {\n const now = input.now ?? new Date();\n const stale = new Date(now.getTime() - (input.claimTimeoutMs ?? 60_000));\n return this.#transaction(async tx => {\n const clauses = [\n `availableAt <= ?`,\n `(status='pending' OR (status='processing' AND claimedAt <= ?))`,\n `NOT EXISTS (SELECT 1 FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" AS earlier WHERE earlier.documentId = \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".documentId AND earlier.status != 'completed' AND (earlier.createdAt < \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".createdAt OR (earlier.createdAt = \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".createdAt AND earlier.id < \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".id)))`,\n ];\n const args: unknown[] = [now.toISOString(), stale.toISOString()];\n if (input.scope) {\n const keys = visibleScopeKeys(input.scope);\n clauses.push(visibleSql(keys));\n args.push(...keys);\n }\n args.push(input.limit ?? 100);\n const selected = await tx.execute({\n sql: `SELECT id FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" WHERE ${clauses.join(' AND ')} ORDER BY createdAt ASC,id ASC LIMIT ? FOR UPDATE SKIP LOCKED`,\n args,\n });\n const ids = selected.rows.map(row => String(row.id));\n for (const id of ids)\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='processing',attempts=attempts+1,claimedAt=?,claimedBy=? WHERE id=?`,\n args: [now.toISOString(), input.workerId, id],\n });\n if (!ids.length) return [];\n const result = await tx.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" WHERE id IN (${ids.map(() => '?').join(',')}) ORDER BY createdAt ASC,id ASC`,\n args: ids,\n });\n return result.rows.map(parseOutbox);\n });\n }\n\n async completeSemanticOutbox(input: { ids: string[]; workerId: string }): Promise<void> {\n if (!input.ids.length) return;\n const now = new Date().toISOString();\n await this.#transaction(async tx => {\n for (const id of input.ids)\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='completed',completedAt=? WHERE id=? AND status='processing' AND claimedBy=?`,\n args: [now, id, input.workerId],\n });\n });\n }\n async releaseSemanticOutbox(input: { ids: string[]; workerId: string; retryAt?: Date }): Promise<void> {\n if (!input.ids.length) return;\n await this.#transaction(async tx => {\n for (const id of input.ids)\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='pending',availableAt=?,claimedAt=NULL,claimedBy=NULL WHERE id=? AND status='processing' AND claimedBy=?`,\n args: [(input.retryAt ?? new Date()).toISOString(), id, input.workerId],\n });\n });\n }\n\n async #transaction<T>(operation: (tx: Executor) => Promise<T>): Promise<T> {\n const connection = await this.#pool.getConnection();\n try {\n await connection.beginTransaction();\n const result = await operation(createExecutor(connection));\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback();\n throw error;\n } finally {\n connection.release();\n }\n }\n async #getNode(executor: Executor, id: string): Promise<KnowledgeNode | null> {\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE id=? AND type='node'`,\n args: [id],\n });\n return result.rows[0] ? parseNode(result.rows[0]) : null;\n }\n async #getNodeByName(executor: Executor, name: string, scope: KnowledgeScope): Promise<KnowledgeNode | null> {\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE type='node' AND scopeKey=? AND canonicalName=?`,\n args: [knowledgeScopeKey(scope), canonicalName(name)],\n });\n return result.rows[0] ? parseNode(result.rows[0]) : null;\n }\n async #resolveNode(executor: Executor, name: string, scope: KnowledgeScope): Promise<KnowledgeNode | null> {\n // An unmerged node outside the caller's scope resolves to itself and can never be visible, so only\n // visible-scope rows and merged aliases (whose terminal may be visible) are candidates.\n const keys = visibleScopeKeys(scope);\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE type='node' AND canonicalName=? AND (scopeKey IN (${keys.map(() => '?').join(',')}) OR mergedInto IS NOT NULL)`,\n args: [canonicalName(name), ...keys],\n });\n const candidates = result.rows.map(parseNode).sort((left, right) => right.scope.length - left.scope.length);\n for (const candidate of candidates) {\n const terminal = await this.#resolveTerminalNode(executor, candidate.id);\n if (terminal && isKnowledgeScopeVisible(terminal.scope, scope)) return terminal;\n }\n return null;\n }\n async #resolveTerminalNode(executor: Executor, id: string): Promise<KnowledgeNode | null> {\n let node = await this.#getNode(executor, id);\n const seen = new Set<string>();\n while (node?.mergedInto) {\n if (seen.has(node.id)) throw new Error(`Knowledge merge cycle detected at ${node.id}`);\n seen.add(node.id);\n node = await this.#getNode(executor, node.mergedInto);\n }\n return node;\n }\n async #getKnowledge(executor: Executor, id: string, includeDeleted: boolean): Promise<KnowledgeRecord | null> {\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE id=?${includeDeleted ? '' : ' AND deletedAt IS NULL'}`,\n args: [id],\n });\n return result.rows[0] ? parseKnowledge(result.rows[0]) : null;\n }\n\n async #queryKnowledge(\n input: QueryKnowledgeInput,\n relationship: 'about' | 'mentioning' | 'related',\n ): Promise<QueryKnowledgeOutput> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const node = await this.#resolveTerminalNode(this.#client, nodeReferenceId(input.node));\n if (!node) return { records: [] };\n const keys = visibleScopeKeys(scope);\n const args: unknown[] = [node.id, ...(relationship === 'related' ? [node.id] : []), ...keys];\n if (input.after) args.push(input.after);\n args.push((input.limit ?? 100) + 1);\n const result = await this.#client.execute({\n sql: `SELECT DISTINCT f.*,f.scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" f${relationship === 'about' ? '' : ` LEFT JOIN \"${TABLE_KNOWLEDGE_MENTIONS}\" m ON m.sourceType='record' AND m.sourceId=f.id`} WHERE ${relationship === 'about' ? 'f.node=?' : relationship === 'mentioning' ? 'm.recordId=?' : '(f.node=? OR m.recordId=?)'} AND ${visibleSql(keys, 'f.scopeKey')}${input.includeDeleted ? '' : ' AND f.deletedAt IS NULL'}${input.after ? ' AND f.id < ?' : ''} ORDER BY f.id DESC LIMIT ?`,\n args,\n });\n const records = result.rows.map(parseKnowledge);\n const limit = input.limit ?? 100;\n return {\n records: records.slice(0, limit),\n nextCursor: records.length > limit ? records[limit - 1]?.id : undefined,\n };\n }\n\n async #replaceMentions(\n tx: Executor,\n sourceType: 'record' | 'node',\n sourceId: string,\n text: string,\n resolutionScope: KnowledgeScope,\n defaultScope: KnowledgeScope,\n ): Promise<void> {\n await tx.execute({\n sql: `DELETE FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" WHERE sourceType=? AND sourceId=?`,\n args: [sourceType, sourceId],\n });\n for (const name of parseKnowledgeWikilinks(text)) {\n let node = await this.#resolveNode(tx, name, resolutionScope);\n if (!node) {\n node = await this.#getNodeByName(tx, name, defaultScope);\n if (node) node = await this.#resolveTerminalNode(tx, node.id);\n if (!node) {\n const now = new Date();\n node = {\n id: crypto.randomUUID(),\n type: 'node',\n name,\n kind: 'node',\n scope: defaultScope,\n version: 1,\n createdAt: now,\n updatedAt: now,\n };\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_NODES}\" (id,type,name,canonicalName,kind,content,scope,scopeKey,version,mergedInto,createdAt,updatedAt) VALUES (?,?,?,?,?,NULL,jsonb(?),?,?,NULL,?,?)`,\n args: [\n node.id,\n 'node',\n node.name,\n canonicalName(node.name),\n node.kind,\n JSON.stringify(defaultScope),\n knowledgeScopeKey(defaultScope),\n 1,\n now.toISOString(),\n ],\n });\n await this.#activity(tx, 'node-created', 'node', node.id, defaultScope);\n await this.#outbox(tx, 'node', node.id, 'upsert', 1, defaultScope);\n }\n }\n await tx.execute({\n sql: `INSERT OR IGNORE INTO \"${TABLE_KNOWLEDGE_MENTIONS}\" (sourceType,sourceId,recordId) VALUES (?,?,?)`,\n args: [sourceType, sourceId, node.id],\n });\n }\n }\n\n async #activity(\n executor: Executor,\n action: KnowledgeActivityAction,\n recordType: KnowledgeSemanticDocumentType,\n recordId: string,\n scope: KnowledgeScope,\n sourceThreadId?: string,\n ): Promise<void> {\n const now = new Date();\n await executor.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_ACTIVITY}\" (id,action,recordType,recordId,scope,scopeKey,sourceThreadId,createdAt) VALUES (?,?,?,?,jsonb(?),?,?,?)`,\n args: [\n createKnowledgeUlid(),\n action,\n recordType,\n recordId,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n sourceThreadId ?? null,\n now.toISOString(),\n ],\n });\n }\n async #outbox(\n executor: Executor,\n documentType: KnowledgeSemanticDocumentType,\n id: string,\n operation: KnowledgeSemanticOperation,\n version: number | string,\n scope: KnowledgeScope,\n ): Promise<void> {\n const documentId = knowledgeSemanticDocumentId(documentType, id);\n const idempotencyKey = knowledgeSemanticIdempotencyKey(documentId, operation, version);\n const now = new Date();\n await executor.execute({\n sql: `INSERT OR IGNORE INTO \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (id,idempotencyKey,documentId,documentType,operation,scope,scopeKey,status,attempts,availableAt,claimedAt,claimedBy,createdAt,completedAt) VALUES (?,?,?,?,?,jsonb(?),?,'pending',0,?,NULL,NULL,?,NULL)`,\n args: [\n createKnowledgeUlid(),\n idempotencyKey,\n documentId,\n documentType,\n operation,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n now.toISOString(),\n now.toISOString(),\n ],\n });\n }\n}\n","import { 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 TABLE_SCHEMAS,\n MCP_CLIENTS_SCHEMA,\n MCP_CLIENT_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class MCPClientsMySQL extends MCPClientsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the mcp-clients domain tables.\n * Currently no default indexes are defined for mcp-clients.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_MCP_CLIENTS, schema: TABLE_SCHEMAS[TABLE_MCP_CLIENTS] }),\n generateTableSQL({ tableName: TABLE_MCP_CLIENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_MCP_CLIENT_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MCPClientsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the mcp-clients domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return MCPClientsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for mcp-clients.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for mcp-clients domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_MCP_CLIENTS, schema: MCP_CLIENTS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_MCP_CLIENT_VERSIONS, schema: MCP_CLIENT_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_MCP_CLIENTS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseClientRow(row: Record<string, unknown>): StorageMCPClientType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): MCPClientVersion {\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: this.safeParseJSON(row.servers) as MCPClientVersion['servers'],\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_CLIENTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseClientRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\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 try {\n await this.operations.delete({ tableName: TABLE_MCP_CLIENTS, keys: { id: mcpClient.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback MCP client creation:', rollbackError);\n }\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_MCP_CLIENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP client with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_MCP_CLIENTS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_CLIENTS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_MCP_CLIENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause = { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_CLIENTS, whereClause });\n if (total === 0) return { mcpClients: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENTS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n mcpClients: rows.map(row => this.parseClientRow(row)),\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('MYSQL', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const now = new Date();\n await this.operations.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,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_CLIENT_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [mcpClientId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`, args: [mcpClientId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`, args: [mcpClientId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_CLIENT_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_CLIENT_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_MCP_CLIENT_VERSIONS)} WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`, args: [mcpClientId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { 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 TABLE_SCHEMAS,\n MCP_SERVERS_SCHEMA,\n MCP_SERVER_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class MCPServersMySQL extends MCPServersStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the mcp-servers domain tables.\n * Currently no default indexes are defined for mcp-servers.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_MCP_SERVERS, schema: TABLE_SCHEMAS[TABLE_MCP_SERVERS] }),\n generateTableSQL({ tableName: TABLE_MCP_SERVER_VERSIONS, schema: TABLE_SCHEMAS[TABLE_MCP_SERVER_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MCPServersMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the mcp-servers domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return MCPServersMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for mcp-servers.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for mcp-servers domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_MCP_SERVERS, schema: MCP_SERVERS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_MCP_SERVER_VERSIONS, schema: MCP_SERVER_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_MCP_SERVER_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_MCP_SERVERS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseServerRow(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: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private 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:\n row.isLatest === null || row.isLatest === undefined\n ? undefined\n : Boolean(row.isLatest === true || row.isLatest === 1 || row.isLatest === '1'),\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: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageMCPServerType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_SERVERS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseServerRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\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 try {\n await this.operations.delete({ tableName: TABLE_MCP_SERVERS, keys: { id: mcpServer.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback MCP server creation:', rollbackError);\n }\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_MCP_SERVER', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP server with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_MCP_SERVERS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_SERVERS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_MCP_SERVERS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause = { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_SERVERS, whereClause });\n if (total === 0) return { mcpServers: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVERS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n mcpServers: rows.map(row => this.parseServerRow(row)),\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('MYSQL', 'LIST_MCP_SERVERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n try {\n const now = new Date();\n await this.operations.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,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_SERVER_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [mcpServerId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`, args: [mcpServerId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`, args: [mcpServerId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_SERVER_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_SERVER_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_MCP_SERVER_VERSIONS)} WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`, args: [mcpServerId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","//#region src/memory/index.ts\n/**\n* Shared rules for observational memory lifecycle writes. Every storage adapter applies\n* these inside its own atomic section (lock, transaction, or conditional update), so the\n* decisions are identical across adapters.\n*/\n/**\n* Observational memory columns that lifecycle writes depend on. Storage adapters merge these\n* into the table schema they get from `@mastra/core`, so the columns exist even when the\n* installed core predates them.\n*/\nconst OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS = { supersededBy: {\n\ttype: \"text\",\n\tnullable: true\n} };\n/** `schema` plus {@link OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS}; `undefined` when `schema` is. */\nfunction withObservationalMemoryLifecycleColumns(schema) {\n\treturn schema ? {\n\t\t...schema,\n\t\t...OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS\n\t} : void 0;\n}\n/**\n* Canonical head order: `generationCount DESC, createdAt ASC, id ASC`.\n* Returns a negative number when `a` sorts before `b` (i.e. `a` is the better head candidate).\n*/\nfunction compareObservationalMemoryHeadOrder(a, b) {\n\tif (a.generationCount !== b.generationCount) return b.generationCount - a.generationCount;\n\tconst at = new Date(a.createdAt).getTime();\n\tconst bt = new Date(b.createdAt).getTime();\n\tif (at !== bt) return at - bt;\n\treturn a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n/**\n* A buffered chunk stores `lastObservedAt = max message time + 1ms`. It is wholly covered\n* (every message it observed is already at or before the cursor) iff\n* `cursor >= chunk.lastObservedAt - 1ms`.\n*/\nfunction isBufferedChunkCoveredByCursor(chunkLastObservedAt, cursor) {\n\tif (!cursor) return false;\n\treturn new Date(cursor).getTime() >= new Date(chunkLastObservedAt).getTime() - 1;\n}\n/** The later of two cursors; `undefined` only when both are absent. */\nfunction maxObservationCursor(a, b) {\n\tif (!a) return b ? new Date(b) : void 0;\n\tif (!b) return new Date(a);\n\treturn new Date(Math.max(new Date(a).getTime(), new Date(b).getTime()));\n}\n/**\n* Decide the new generation's text when a reflection built from `snapshot` commits against\n* the stored record.\n*\n* - Stored text equals the snapshot: the reflection replaces it.\n* - Stored text extends the snapshot (activation only appends): the appended tail is kept\n* after the reflection, and its tokens are added.\n* - Anything else (a non-append rewrite): `null` — the reflection must not be applied.\n*/\nfunction planReflectionGenerationText(input) {\n\tconst stored = input.storedObservations ?? \"\";\n\tconst snapshot = input.snapshotObservations ?? \"\";\n\tif (stored === snapshot) return {\n\t\tmode: \"equal\",\n\t\tobservations: input.reflection,\n\t\ttokenCount: input.tokenCount\n\t};\n\tif (!stored.startsWith(snapshot)) return null;\n\tconst tail = stored.slice(snapshot.length).trimStart();\n\tif (!tail.trim()) return {\n\t\tmode: \"equal\",\n\t\tobservations: input.reflection,\n\t\ttokenCount: input.tokenCount\n\t};\n\treturn {\n\t\tmode: \"append\",\n\t\tobservations: input.reflection ? `${input.reflection}\\n\\n${tail}` : tail,\n\t\ttokenCount: input.tokenCount + Math.max(0, (input.storedObservationTokenCount ?? 0) - (input.snapshotObservationTokenCount ?? 0))\n\t};\n}\n/**\n* Backs `updateActiveObservations` in adapters that implement `commitActiveObservations`.\n* Callers of `updateActiveObservations` (which resolves `void`) can't see a commit result, so a\n* write that was not applied throws instead of resolving as if it had committed.\n*/\nfunction assertActiveObservationsApplied(result, id) {\n\tif (result.applied) return;\n\tthrow new Error(result.reason === \"retired\" ? `Observational memory record ${id} was superseded by a newer generation; observations were not written` : `Observational memory record ${id} changed since the observations were composed; observations were not written`);\n}\n/**\n* Whether the stored text can still accept a reflection built from `snapshot`\n* (equal, or only appended to since).\n*/\nfunction isAppendOnlySince(storedObservations, snapshotObservations) {\n\tconst stored = storedObservations ?? \"\";\n\tconst snapshot = snapshotObservations ?? \"\";\n\treturn stored === snapshot || stored.startsWith(snapshot);\n}\n//#endregion\nexport { OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS, assertActiveObservationsApplied, compareObservationalMemoryHeadOrder, isAppendOnlySince, isBufferedChunkCoveredByCursor, maxObservationCursor, planReflectionGenerationText, withObservationalMemoryLifecycleColumns };\n\n//# sourceMappingURL=index.js.map","import type { RunFence } from '@mastra/core/storage';\nimport { matchesRunFence, RunFenceConflictError } from '@mastra/core/storage';\nimport type { Connection, Pool, PoolConnection, RowDataPacket } from 'mysql2/promise';\nimport { quoteIdentifier } from '../domains/utils';\n\n/** The query method both the pool and a pooled connection offer. */\nexport type Queryable = Pick<Connection, 'execute'>;\n\n/**\n * Epoch milliseconds on the database clock. `UTC_TIMESTAMP` is the time the\n * statement started and doesn't depend on the session time zone. Every lease\n * comparison runs in a statement that already holds the run's owner row, so\n * no lock wait sits between that start time and the comparison.\n */\nexport const DB_NOW_MS = `(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(3)) DIV 1000)`;\n\nconst ER_DUP_ENTRY = 1062;\nconst ER_LOCK_DEADLOCK = 1213;\nconst MAX_CLAIM_ATTEMPTS = 5;\n\n/**\n * The check half of a fenced write; call it first inside the write's\n * transaction. The shared lock holds the claim row until commit, so a claim\n * that updates the row waits for the write to finish, and every later write\n * sees the new claim.\n */\nexport async function assertRunFence(\n q: Queryable,\n claimsTable: string,\n fence: RunFence,\n operation: string,\n): Promise<void> {\n const [rows] = await q.execute<RowDataPacket[]>(\n `SELECT generation, ${quoteIdentifier('ownerId', 'column name')} AS ownerId FROM ${claimsTable}\n WHERE ${quoteIdentifier('runId', 'column name')} = ? LOCK IN SHARE MODE`,\n [fence.runId],\n );\n const row = rows[0];\n const current = row ? { generation: Number(row.generation), ownerId: String(row.ownerId) } : null;\n if (!matchesRunFence(current, fence)) {\n throw new RunFenceConflictError(fence, operation);\n }\n}\n\n/** Runs `fn` in a transaction on its own pooled connection. */\nexport async function inTransaction<T>(pool: Pool, fn: (connection: PoolConnection) => Promise<T>): Promise<T> {\n const connection = await pool.getConnection();\n try {\n await connection.beginTransaction();\n const result = await fn(connection);\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback().catch(() => {});\n throw error;\n } finally {\n connection.release();\n }\n}\n\n/**\n * Runs `write` directly when it carries no fence, or in a transaction behind\n * the fence check when it does.\n */\nexport function withRunFence<T>(\n pool: Pool,\n claimsTable: string,\n fence: RunFence | undefined,\n operation: string,\n write: (q: Queryable) => Promise<T>,\n): Promise<T> {\n if (!fence) return write(pool);\n return inTransaction(pool, async connection => {\n await assertRunFence(connection, claimsTable, fence, operation);\n return write(connection);\n });\n}\n\n/**\n * Runs a transaction that creates or updates a run's claim row, retrying when\n * two first claims race to insert it. Under REPEATABLE READ both lock the gap\n * where the row would go and one is chosen as a deadlock victim; under READ\n * COMMITTED the later insert hits the duplicate key. On retry the row exists\n * and the claim serializes behind its row lock.\n */\nexport async function claimTransaction<T>(pool: Pool, fn: (connection: PoolConnection) => Promise<T>): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await inTransaction(pool, fn);\n } catch (error) {\n const errno = (error as { errno?: number }).errno;\n if (attempt >= MAX_CLAIM_ATTEMPTS || (errno !== ER_DUP_ENTRY && errno !== ER_LOCK_DEADLOCK)) throw error;\n }\n }\n}\n","import { createHash } from 'node:crypto';\nimport {\n assertActiveObservationsApplied,\n isAppendOnlySince,\n isBufferedChunkCoveredByCursor,\n maxObservationCursor,\n planReflectionGenerationText,\n type UpdateActiveObservationsResult,\n type UpdateBufferedObservationsResult,\n withObservationalMemoryLifecycleColumns,\n} from '@internal/core/memory';\n\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraDBMessage, MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n OBSERVATIONAL_MEMORY_TABLE_SCHEMA,\n RUN_FENCING_TABLE_SCHEMAS,\n TABLE_MEMORY_RUN_FENCES,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n calculatePagination,\n normalizePerPage,\n resolveRunFence,\n validateStorageMetadataFilter,\n createStorageErrorId,\n isRunFenceConflictError,\n executeRetentionPrune,\n resolveRetentionTargets,\n retentionCutoffMs,\n} from '@mastra/core/storage';\nimport type {\n BufferedObservationChunk,\n CreateIndexOptions,\n CreateObservationalMemoryInput,\n CreateReflectionGenerationInput,\n ObservationalMemoryHistoryOptions,\n ObservationalMemoryRecord,\n PaginationArgs,\n PaginationInfo,\n RunFence,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageMetadataFilter,\n StorageResourceType,\n SwapBufferedReflectionToActiveInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n TABLE_NAMES,\n ThreadCloneMetadata,\n ThreadSortOptions,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n UpdateBufferedReflectionInput,\n PruneOptions,\n PruneResult,\n RetentionTablesDescriptor,\n TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport type { Pool, PoolConnection, RowDataPacket, ResultSetHeader } from 'mysql2/promise';\nimport { assertRunFence, claimTransaction, DB_NOW_MS, inTransaction, withRunFence } from '../../db/run-fencing';\nimport type { Queryable } from '../../db/run-fencing';\nimport { indexKey } from '../../db/schema-snapshot';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport {\n formatTableName,\n parseDateTime,\n prepareStatement,\n prepareUpdateStatement,\n quoteIdentifier,\n transformToSqlValue,\n} from '../utils';\n\nconst OM_TABLE = 'mastra_observational_memory' as const;\nconst OM_TABLE_QUOTED = quoteIdentifier(OM_TABLE, 'table name');\nconst RUN_FENCES_TABLE = formatTableName(TABLE_MEMORY_RUN_FENCES as TABLE_NAMES);\nconst RUN_ID = quoteIdentifier('runId', 'column name');\nconst OWNER_ID = quoteIdentifier('ownerId', 'column name');\nconst RETIRED_AT = quoteIdentifier('retiredAt', 'column name');\n\n/** Canonical head order: newest generation, then earliest createdAt, then lowest id. */\nconst OM_HEAD_ORDER = `${quoteIdentifier('generationCount', 'column name')} DESC, ${quoteIdentifier('createdAt', 'column name')} ASC, ${quoteIdentifier('id', 'column name')} ASC`;\n/** Max `supersededBy` hops when redirecting a write aimed at a retired record. */\nconst OM_MAX_HEAD_HOPS = 3;\n/** Attempts for an OM transaction that hits a deadlock or lock-wait timeout. */\nconst OM_MAX_TRANSACTION_ATTEMPTS = 3;\n/** How long initialization waits for the per-key `GET_LOCK` before failing. */\nconst OM_INIT_LOCK_TIMEOUT_SECONDS = 30;\n\n/** ER_LOCK_DEADLOCK (1213) or ER_LOCK_WAIT_TIMEOUT (1205): the transaction was rolled back and can be retried. */\nfunction isRetryableLockError(error: unknown): boolean {\n const errno = (error as { errno?: number } | null)?.errno;\n return errno === 1213 || errno === 1205;\n}\n\nfunction emitValidationError(message: string): MastraError {\n return new MastraError({\n id: 'MYSQL_MEMORY_VALIDATION_ERROR',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: message,\n });\n}\n\nfunction omCol(name: string): string {\n return quoteIdentifier(name, 'column name');\n}\n\nfunction rethrowOrWrapOM(error: unknown, id: string, operation: string, details?: Record<string, any>): never {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', operation, 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: details ?? { id },\n },\n error,\n );\n}\n\nfunction throwOMNotFound(id: string, operation: string, details?: Record<string, any>): never {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', operation, 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: details ?? { id },\n });\n}\n\nfunction parseMySQLBool(value: unknown): boolean {\n return value === true || value === 1 || value === '1';\n}\n\nfunction parseJSONColumn<T>(value: unknown): T | undefined {\n if (!value) return undefined;\n if (typeof value === 'string') return JSON.parse(value) as T;\n return value as T;\n}\n\nfunction parseBufferedChunks(raw: unknown): BufferedObservationChunk[] {\n if (!raw) return [];\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\ninterface ThreadRow {\n id: string;\n resourceId: string;\n title: string;\n metadata: string | Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\ninterface MessageRow {\n id: string;\n thread_id: string;\n content: string | Record<string, unknown>;\n role: MastraDBMessage['role'];\n type: string | null;\n createdAt: Date | string;\n resourceId: string | null;\n}\n\ninterface ResourceRow {\n id: string;\n workingMemory: string | null;\n metadata: string | Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\nfunction parseJSON<T>(value: T | string | null | undefined): T | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'object') return value as T;\n if (typeof value !== 'string') return null;\n if (!value) return null;\n try {\n return JSON.parse(value) as T;\n } catch {\n return null;\n }\n}\n\nfunction addMySQLMessageMetadataFilter(\n conditions: string[],\n params: any[],\n metadataFilter: StorageMetadataFilter | undefined,\n): void {\n if (!metadataFilter) return;\n\n for (const [key, value] of Object.entries(metadataFilter)) {\n const path = `$.metadata.${key}`;\n conditions.push(`JSON_VALID(${quoteIdentifier('content', 'column name')})`);\n conditions.push(`JSON_CONTAINS_PATH(${quoteIdentifier('content', 'column name')}, 'one', ?)`);\n params.push(path);\n if (value === null) {\n conditions.push(`JSON_TYPE(JSON_EXTRACT(${quoteIdentifier('content', 'column name')}, ?)) = 'NULL'`);\n params.push(path);\n } else {\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('content', 'column name')}, ?) = CAST(? AS JSON)`);\n params.push(path, JSON.stringify(value));\n }\n }\n}\n\nexport class MemoryMySQL extends MemoryStorage {\n override readonly supportsPartialThreadUpdate = true;\n readonly supportsObservationalMemory = true;\n readonly supportsObservationalMemoryHistorySearch = true;\n\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const;\n\n /**\n * Tables `prune()` can clean up. Run fences anchor on `retiredAt` (epoch ms), which stays NULL until the\n * execution holding the fence settles, so a running execution's fence is\n * never pruned.\n */\n static override readonly retentionTables: RetentionTablesDescriptor = {\n runFences: { table: TABLE_MEMORY_RUN_FENCES, column: 'retiredAt', indexed: false, anchorType: 'epoch-ms' },\n };\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MemoryMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n override supportsRunFencing(): boolean {\n return true;\n }\n\n override async raiseRunFence(fence: RunFence): Promise<boolean> {\n try {\n return await claimTransaction(this.pool, async connection => {\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT generation, ${OWNER_ID} AS ownerId FROM ${RUN_FENCES_TABLE} WHERE ${RUN_ID} = ? FOR UPDATE`,\n [fence.runId],\n );\n const row = rows[0];\n if (!row) {\n await connection.execute(\n `INSERT INTO ${RUN_FENCES_TABLE} (${RUN_ID}, generation, ${OWNER_ID}) VALUES (?, ?, ?)`,\n [fence.runId, fence.generation, fence.ownerId],\n );\n return true;\n }\n const generation = Number(row.generation);\n const raises = generation < fence.generation;\n const reaffirms = generation === fence.generation && String(row.ownerId) === fence.ownerId;\n if (!raises && !reaffirms) return false;\n // Every write un-retires the fence.\n await connection.execute(\n `UPDATE ${RUN_FENCES_TABLE} SET generation = ?, ${OWNER_ID} = ?, ${RETIRED_AT} = NULL WHERE ${RUN_ID} = ?`,\n [fence.generation, fence.ownerId, fence.runId],\n );\n return true;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'RAISE_RUN_FENCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: fence.runId },\n },\n error,\n );\n }\n }\n\n override async retireRunFence(fence: RunFence): Promise<boolean> {\n try {\n return await inTransaction(this.pool, async connection => {\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT generation, ${OWNER_ID} AS ownerId FROM ${RUN_FENCES_TABLE} WHERE ${RUN_ID} = ? FOR UPDATE`,\n [fence.runId],\n );\n const row = rows[0];\n if (!row || Number(row.generation) !== fence.generation || String(row.ownerId) !== fence.ownerId) {\n return false;\n }\n await connection.execute(`UPDATE ${RUN_FENCES_TABLE} SET ${RETIRED_AT} = ${DB_NOW_MS} WHERE ${RUN_ID} = ?`, [\n fence.runId,\n ]);\n return true;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'RETIRE_RUN_FENCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: fence.runId },\n },\n error,\n );\n }\n }\n\n /** Runs `write` behind its own fence, otherwise the one in scope for this store. */\n #fenced<T>(fence: RunFence | undefined, operation: string, write: (q: Queryable) => Promise<T>): Promise<T> {\n return withRunFence(this.pool, RUN_FENCES_TABLE, resolveRunFence(this, fence), operation, write);\n }\n\n /** The fence check for a write that already runs in its own transaction. */\n async #assertFence(connection: PoolConnection, fence: RunFence | undefined, operation: string): Promise<void> {\n const resolved = resolveRunFence(this, fence);\n if (resolved) await assertRunFence(connection, RUN_FENCES_TABLE, resolved, operation);\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.operations.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.operations.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n await this.operations.createTable({\n tableName: TABLE_MEMORY_RUN_FENCES as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_MEMORY_RUN_FENCES],\n });\n\n // Static import — `await import('@mastra/core/storage')` deadlocks\n // `mastra build` output: bundlers rewrite the dynamic import to point at\n // the entry chunk that statically depends on this file, so the cycle never\n // resolves when storage initializes during module evaluation (#18298). The\n // peerDependency on `@mastra/core` is already `>=1.42.1` (the version that\n // introduced `OBSERVATIONAL_MEMORY_TABLE_SCHEMA`), so the older-core compat\n // the dynamic import was guarding against can no longer occur via npm\n // resolution.\n const omSchema = withObservationalMemoryLifecycleColumns(OBSERVATIONAL_MEMORY_TABLE_SCHEMA?.[OM_TABLE]);\n\n if (omSchema) {\n await this.operations.createTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n });\n await this.operations.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 'supersededBy',\n ],\n });\n }\n\n // Add resourceId column for backwards compatibility\n await this.operations.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n\n if (omSchema) {\n // Create index on lookupKey for efficient OM queries. Consult the\n // init-scoped snapshot (held by the operations domain) first so a warm\n // boot does not re-issue DDL that is doomed to fail; the errno-1061\n // swallow below stays as the concurrent-boot safety net.\n const snapshot = this.operations.getInitSchemaSnapshot();\n if (!snapshot?.indexes.has(indexKey(OM_TABLE, 'idx_om_lookup_key'))) {\n // MySQL does not support CREATE INDEX IF NOT EXISTS, so catch ER_DUP_KEYNAME (errno 1061)\n try {\n await this.pool.execute(\n `CREATE INDEX idx_om_lookup_key ON ${OM_TABLE_QUOTED} (${quoteIdentifier('lookupKey', 'column name')}(191))`,\n );\n snapshot?.indexes.add(indexKey(OM_TABLE, 'idx_om_lookup_key'));\n } catch (err: any) {\n if (err?.errno !== 1061) {\n throw err;\n }\n }\n }\n }\n\n if (omSchema) {\n await this.backfillSupersededBy();\n }\n\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_threads_resourceid_createdat_idx`,\n table: TABLE_THREADS,\n columns: ['resourceId', 'createdAt DESC'],\n },\n {\n name: `${prefix}mastra_messages_thread_id_createdat_idx`,\n table: TABLE_MESSAGES,\n columns: ['thread_id', 'createdAt DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n statements.push(\n generateTableSQL({\n tableName: TABLE_MEMORY_RUN_FENCES as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_MEMORY_RUN_FENCES],\n }),\n );\n\n for (const idx of MemoryMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return MemoryMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n const targets = resolveRetentionTargets({\n policies,\n descriptor: MemoryMySQL.retentionTables,\n order: ['runFences'],\n });\n return executeRetentionPrune({\n domain: 'memory',\n targets,\n options,\n cutoffFor: (target, now) => retentionCutoffMs(target.policy, now),\n deleteBatch: (target, cutoff, limit) =>\n this.operations.pruneBatch({ tableName: target.table as TABLE_NAMES, column: target.column, cutoff, limit }),\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_MESSAGES)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_THREADS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_RESOURCES)}`);\n await this.pool.execute(`DELETE FROM ${RUN_FENCES_TABLE}`);\n try {\n await this.pool.execute(`DELETE FROM ${OM_TABLE_QUOTED}`);\n } catch (err: any) {\n // errno 1146 = ER_NO_SUCH_TABLE — table may not exist yet\n if (err?.errno !== 1146) {\n throw err;\n }\n }\n }\n\n private mapThread(row: ThreadRow): StorageThreadType {\n return {\n id: row.id,\n resourceId: row.resourceId,\n title: row.title,\n metadata: parseJSON<Record<string, unknown>>(row.metadata) ?? undefined,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n } satisfies StorageThreadType;\n }\n\n private mapMessage(row: MessageRow): MastraDBMessage {\n const createdAt = parseDateTime(row.createdAt) ?? new Date();\n let content: MastraMessageContentV2;\n content = row.content as MastraMessageContentV2;\n if (typeof row.content === 'string') {\n try {\n content = JSON.parse(row.content) as MastraMessageContentV2;\n } catch {\n // Wrap legacy v1 string content into v2 shape\n content = {\n format: 2,\n parts: [{ type: 'text', text: row.content } as any],\n content: row.content,\n } as MastraMessageContentV2;\n }\n }\n\n const message: MastraDBMessage = {\n id: row.id,\n threadId: row.thread_id,\n resourceId: row.resourceId ?? undefined,\n role: row.role,\n content,\n createdAt,\n };\n\n if (row.type && row.type !== 'v2') {\n message.type = row.type;\n }\n\n return message;\n }\n\n /**\n * Loads a thread's messages in chronological order.\n *\n * @param threadId - Thread to read.\n * @param limit - Optional cap on the number of rows.\n * @param resourceId - When set, returns only the rows owned by that resource.\n */\n private async fetchMessagesForThread(threadId: string, limit?: number, resourceId?: string): Promise<MessageRow[]> {\n const resourceCondition = resourceId ? ` AND ${quoteIdentifier('resourceId', 'column name')} = ?` : '';\n let sql = `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${formatTableName(TABLE_MESSAGES)} WHERE ${quoteIdentifier('thread_id', 'column name')} = ?${resourceCondition} ORDER BY ${quoteIdentifier('createdAt', 'column name')} ASC`;\n const params: any[] = resourceId ? [threadId, resourceId] : [threadId];\n if (limit && limit > 0) {\n sql += ` LIMIT ?`;\n params.push(limit);\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n return rows as unknown as MessageRow[];\n }\n\n /**\n * Fetches included messages by ID, discovering their thread automatically.\n * This handles cross-thread includes where the include item doesn't specify a threadId.\n *\n * @param include - Message ids to pin, each with an optional before/after window.\n * @param resourceId - When set, restricts both the pinned messages and their context\n * to that resource so an id from another resource returns nothing.\n */\n private async _getIncludedMessages({\n include,\n resourceId,\n }: {\n include: StorageListMessagesInput['include'];\n resourceId?: string;\n }): Promise<MessageRow[] | null> {\n if (!include || include.length === 0) return null;\n\n const tableName = formatTableName(TABLE_MESSAGES);\n const selectColumns = `id, thread_id, content, role, type, createdAt, resourceId`;\n const resourceCondition = resourceId ? ` AND m.${quoteIdentifier('resourceId', 'column name')} = ?` : '';\n\n // Phase 1: Batch-fetch metadata for all target messages\n const targetIds = include.map(inc => inc.id).filter(Boolean);\n if (targetIds.length === 0) return null;\n\n const idPlaceholders = targetIds.map(() => '?').join(', ');\n const [targetRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id, createdAt FROM ${tableName} WHERE id IN (${idPlaceholders})${\n resourceId ? ` AND ${quoteIdentifier('resourceId', 'column name')} = ?` : ''\n }`,\n resourceId ? [...targetIds, resourceId] : targetIds,\n );\n\n if (!targetRows || targetRows.length === 0) return null;\n\n const targetMap = new Map(targetRows.map(r => [r.id, { threadId: r.thread_id, createdAt: r.createdAt }]));\n\n // Phase 2: Build UNION queries for each include item\n const unionQueries: string[] = [];\n const params: any[] = [];\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const target = targetMap.get(id);\n if (!target) continue;\n\n // Validate LIMIT values are safe integers\n const prevLimit = Math.max(0, Math.floor(withPreviousMessages + 1));\n const nextLimit = Math.max(0, Math.floor(withNextMessages));\n\n // Fetch the target message plus previous messages\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = ?\n AND m.createdAt <= ?${resourceCondition}\n ORDER BY m.createdAt DESC, m.id DESC\n LIMIT ${prevLimit}\n )`);\n params.push(target.threadId, target.createdAt);\n if (resourceId) params.push(resourceId);\n\n // Fetch messages after the target (only if requested)\n if (nextLimit > 0) {\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = ?\n AND m.createdAt > ?${resourceCondition}\n ORDER BY m.createdAt ASC, m.id ASC\n LIMIT ${nextLimit}\n )`);\n params.push(target.threadId, target.createdAt);\n if (resourceId) params.push(resourceId);\n }\n }\n\n if (unionQueries.length === 0) return null;\n\n // Combine queries with UNION ALL and sort\n const finalQuery = `SELECT * FROM (${unionQueries.join(' UNION ALL ')}) AS combined ORDER BY createdAt ASC, id ASC`;\n const [rows] = await this.pool.execute<RowDataPacket[]>(finalQuery, params);\n\n return rows as unknown as MessageRow[];\n }\n\n /**\n * Resolves include items against loaded threads, adding each pinned message and its\n * before/after window.\n *\n * @param threadId - Thread used when an include item names no thread of its own.\n * @param include - Message ids to pin, each with an optional before/after window.\n * @param messagesByThread - Cache of thread snapshots, reused and filled as threads load.\n * @param resourceId - When set, restricts both the pinned messages and their context\n * to that resource so an id from another resource returns nothing.\n */\n private async collectIncludeMessages({\n threadId,\n include,\n messagesByThread,\n resourceId,\n }: {\n threadId: string;\n include?: StorageListMessagesInput['include'];\n messagesByThread: Map<string, MastraDBMessage[]>;\n resourceId?: string;\n }): Promise<MastraDBMessage[]> {\n if (!include?.length) return [];\n\n const includeMessages: MastraDBMessage[] = [];\n const seenIds = new Set<string>();\n const unresolvedIds = include.filter(inc => !inc.threadId).map(inc => inc.id);\n const resolvedThreadIds = new Map<string, string>();\n\n if (unresolvedIds.length > 0) {\n const placeholders = unresolvedIds.map(() => '?').join(', ');\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders})${\n resourceId ? ` AND ${quoteIdentifier('resourceId', 'column name')} = ?` : ''\n }`,\n resourceId ? [...unresolvedIds, resourceId] : unresolvedIds,\n );\n for (const row of rows) {\n resolvedThreadIds.set(row.id, row.thread_id);\n }\n }\n\n for (const inc of include) {\n const targetThreadId = inc.threadId ?? resolvedThreadIds.get(inc.id) ?? threadId;\n\n let threadMessages = messagesByThread.get(targetThreadId);\n if (!threadMessages) {\n const rows = await this.fetchMessagesForThread(targetThreadId, undefined, resourceId);\n threadMessages = rows.map(row => this.mapMessage(row));\n messagesByThread.set(targetThreadId, threadMessages);\n }\n\n // If the current cached set might be partial (e.g., paginated main thread), reload full thread\n const needsContext =\n !threadMessages.some(message => message.id === inc.id) ||\n (inc.withPreviousMessages ?? 0) > 0 ||\n (inc.withNextMessages ?? 0) > 0 ||\n threadMessages.length < (inc.withNextMessages ?? 0) + (inc.withPreviousMessages ?? 0) + 1;\n if (needsContext) {\n const rows = await this.fetchMessagesForThread(targetThreadId, undefined, resourceId);\n threadMessages = rows.map(row => this.mapMessage(row));\n messagesByThread.set(targetThreadId, threadMessages);\n }\n\n const targetIndex = threadMessages.findIndex(msg => msg.id === inc.id);\n if (targetIndex === -1) continue;\n\n // Add the target message itself if not already included\n if (!seenIds.has(inc.id)) {\n seenIds.add(inc.id);\n includeMessages.push(threadMessages[targetIndex]!);\n }\n\n // Add previous messages\n if (inc.withPreviousMessages) {\n const start = Math.max(0, targetIndex - inc.withPreviousMessages);\n for (let i = start; i < targetIndex; i++) {\n const message = threadMessages[i]!;\n if (!seenIds.has(message.id)) {\n seenIds.add(message.id);\n includeMessages.push(message);\n }\n }\n }\n\n // Add next messages\n if (inc.withNextMessages) {\n const end = Math.min(threadMessages.length, targetIndex + inc.withNextMessages + 1);\n for (let i = targetIndex + 1; i < end; i++) {\n const message = threadMessages[i]!;\n if (!seenIds.has(message.id)) {\n seenIds.add(message.id);\n includeMessages.push(message);\n }\n }\n }\n }\n\n return includeMessages;\n }\n\n private async upsertThread(q: Queryable, thread: StorageThreadType): Promise<void> {\n const statement = prepareStatement({\n tableName: TABLE_THREADS,\n record: {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: thread.metadata ? JSON.stringify(thread.metadata) : null,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n },\n });\n await q.execute(statement.sql, statement.args);\n }\n\n async #readThread(q: Queryable, threadId: string, resourceId?: string): Promise<StorageThreadType | null> {\n let sql = `SELECT * FROM ${formatTableName(TABLE_THREADS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`;\n const params: any[] = [threadId];\n\n if (resourceId !== undefined) {\n sql += ` AND ${quoteIdentifier('resourceId', 'column name')} = ?`;\n params.push(resourceId);\n }\n\n const [rows] = await q.execute<RowDataPacket[]>(sql, params);\n const row = rows[0];\n return row ? this.mapThread(row as ThreadRow) : null;\n }\n\n async getThreadById({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise<StorageThreadType | null> {\n try {\n return await this.#readThread(this.pool, threadId, resourceId);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, ...(resourceId !== undefined && { resourceId }) },\n },\n error,\n );\n }\n }\n\n /**\n * Atomically reassign a thread and all of its messages to a different resource.\n *\n * Runs inside a single transaction and takes a `SELECT ... FOR UPDATE` row lock on the\n * thread, so overlapping transfers of the same thread serialize and can never interleave\n * the thread update with the message update. Either both the thread and every message move\n * to the new resource, or neither does — there is no split-ownership window. The thread's\n * `createdAt` is preserved. Callers are responsible for authorizing the reassignment.\n */\n async updateThreadResourceId({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId: string;\n }): Promise<StorageThreadType> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n // Lock the thread row for the duration of the transaction. Concurrent transfers of the\n // same thread block here until this transaction commits, so they cannot interleave.\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_THREADS)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [threadId],\n );\n const row = rows[0];\n if (!row) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_THREAD_RESOURCE_ID', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread \"${threadId}\" not found`,\n details: { threadId },\n });\n }\n\n const thread = this.mapThread(row as ThreadRow);\n\n if (thread.resourceId === resourceId) {\n await connection.commit();\n return thread;\n }\n\n const updatedAt = new Date();\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_THREADS)} SET ${quoteIdentifier('resourceId', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [resourceId, transformToSqlValue(updatedAt), threadId],\n );\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_MESSAGES)} SET ${quoteIdentifier('resourceId', 'column name')} = ? WHERE ${quoteIdentifier('thread_id', 'column name')} = ?`,\n [resourceId, threadId],\n );\n\n await connection.commit();\n return { ...thread, resourceId, updatedAt };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'UPDATE_THREAD_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n const { field, direction } = this.parseOrderBy(orderBy, 'DESC');\n const perPageNormalized = normalizePerPage(perPageInput, 100);\n const { offset, perPage } = calculatePagination(page, perPageInput, perPageNormalized);\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (filter?.resourceId) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(filter.resourceId);\n }\n\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n conditions.push(`JSON_EXTRACT(\\`metadata\\`, ?) = CAST(? AS JSON)`);\n params.push(`$.${key}`, JSON.stringify(value));\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: params } : { sql: '', args: [] };\n\n try {\n const total = await this.operations.loadTotalCount({ tableName: TABLE_THREADS, whereClause });\n if (total === 0) {\n return { threads: [], total: 0, page, perPage, hasMore: false };\n }\n\n const limitValue = perPageInput === false ? total : perPageNormalized;\n const rows = await this.operations.loadMany<ThreadRow>({\n tableName: TABLE_THREADS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n const threads = rows.map(row => this.mapThread(row));\n\n return {\n threads,\n total,\n page,\n perPage,\n hasMore: perPageInput === false ? false : offset + perPageNormalized < 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('MYSQL', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { filter: JSON.stringify(filter ?? {}) },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n public async getThreadsByResourceId(args: { resourceId: string } & ThreadSortOptions): Promise<StorageThreadType[]> {\n const { threads } = await this.listThreads({\n filter: { resourceId: args.resourceId },\n orderBy: args.orderBy || args.sortDirection ? { field: args.orderBy, direction: args.sortDirection } : undefined,\n page: 0,\n perPage: false,\n });\n\n return threads;\n }\n\n public async getThreadsByResourceIdPaginated(\n args: {\n resourceId: string;\n } & PaginationArgs &\n ThreadSortOptions,\n ): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n return this.listThreads({\n filter: { resourceId: args.resourceId },\n page: args.page as number | undefined,\n perPage: args.perPage as number | false | undefined,\n orderBy: args.orderBy || args.sortDirection ? { field: args.orderBy, direction: args.sortDirection } : undefined,\n });\n }\n\n async saveThread({ thread, fence }: { thread: StorageThreadType; fence?: RunFence }): Promise<StorageThreadType> {\n try {\n await this.#fenced(fence, 'saveThread', q => this.upsertThread(q, thread));\n return thread;\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n fence,\n }: {\n id: string;\n title?: string;\n metadata?: Record<string, unknown>;\n fence?: RunFence;\n }): Promise<StorageThreadType> {\n try {\n return await this.#fenced(fence, 'updateThread', async q => {\n const existing = await this.#readThread(q, id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_THREAD', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: { threadId: id },\n });\n }\n\n const mergedMetadata = {\n ...(existing.metadata ?? {}),\n ...(metadata ?? {}),\n } as Record<string, unknown>;\n\n const updatedAt = new Date();\n const statement = prepareUpdateStatement({\n tableName: TABLE_THREADS,\n keys: { id },\n updates: {\n title: title ?? existing.title,\n metadata: JSON.stringify(mergedMetadata),\n updatedAt,\n },\n });\n await q.execute(statement.sql, statement.args);\n\n return {\n ...existing,\n title: title ?? existing.title,\n metadata: mergedMetadata,\n updatedAt,\n } satisfies StorageThreadType;\n });\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n await this.operations.batchDelete({\n tableName: TABLE_MESSAGES,\n keys: [{ thread_id: threadId }],\n });\n await this.operations.delete({ tableName: TABLE_THREADS, keys: { id: threadId } });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n const placeholders = messageIds.map(() => '?').join(', ');\n const sql = `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders}) ORDER BY ${quoteIdentifier('createdAt', 'column name')} ASC`;\n\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, messageIds);\n const messages = (rows as unknown as MessageRow[]).map(row => this.mapMessage(row));\n return { messages };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveMessages(args: {\n messages: MastraDBMessage[];\n fence?: RunFence;\n }): Promise<{ messages: MastraDBMessage[] }> {\n const messages = args.messages;\n if (messages.length === 0) {\n return { messages: [] };\n }\n\n const threadIds = new Set<string>();\n for (const message of messages) {\n if (!message.threadId || !message.threadId.trim()) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'INVALID_INPUT'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Thread ID is required',\n details: { messageId: message.id ?? null },\n });\n }\n threadIds.add(message.threadId);\n if (!message.resourceId) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'INVALID_INPUT'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.`,\n details: { messageId: message.id ?? null, threadId: message.threadId },\n });\n }\n }\n\n for (const threadId of threadIds) {\n const existingThread = await this.getThreadById({ threadId });\n if (!existingThread) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${threadId} not found`,\n details: { threadId },\n });\n }\n }\n\n const connection = await this.pool.getConnection();\n const affectedThreads = new Map<string, Date>();\n const insertedIds: string[] = [];\n\n try {\n await connection.beginTransaction();\n await this.#assertFence(connection, args.fence, 'saveMessages');\n\n for (const message of messages) {\n if (!message.threadId) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'INVALID_INPUT'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Message must have threadId',\n details: { messageId: message.id ?? null },\n });\n }\n const createdAt = message.createdAt ? new Date(message.createdAt) : new Date();\n const id = message.id ?? globalThis.crypto.randomUUID();\n const record = {\n id,\n thread_id: message.threadId,\n content: JSON.stringify(message.content ?? message),\n role: message.role,\n type: message.type ?? 'v2',\n createdAt,\n resourceId: message.resourceId ?? null,\n } satisfies Record<string, any>;\n const statement = {\n sql: `INSERT INTO ${formatTableName(TABLE_MESSAGES)} (id, thread_id, content, role, type, createdAt, resourceId)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON DUPLICATE KEY UPDATE thread_id = VALUES(thread_id), content = VALUES(content), role = VALUES(role), type = VALUES(type), resourceId = VALUES(resourceId)`,\n args: [\n record.id,\n record.thread_id,\n record.content,\n record.role,\n record.type,\n transformToSqlValue(record.createdAt),\n record.resourceId,\n ],\n };\n await connection.execute(statement.sql, statement.args);\n const currentMax = affectedThreads.get(record.thread_id);\n if (!currentMax || currentMax.getTime() < createdAt.getTime()) {\n affectedThreads.set(record.thread_id, createdAt);\n }\n insertedIds.push(record.id);\n }\n\n for (const [threadId, updatedAt] of affectedThreads.entries()) {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_THREADS)} SET ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE id = ?`,\n [transformToSqlValue(updatedAt), threadId],\n );\n }\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n\n const { messages: persisted } = await this.listMessagesById({ messageIds: insertedIds });\n const ordered = insertedIds.map(id => persisted.find(msg => msg.id === id)).filter(Boolean) as MastraDBMessage[];\n return { messages: ordered };\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: Partial<MastraMessageContentV2>;\n })[];\n fence?: RunFence;\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n if (!messages.length) return [];\n\n try {\n const { messages: existing } = await this.listMessagesById({\n messageIds: messages.map(m => m.id),\n });\n const existingMap = new Map(existing.map(msg => [msg.id, msg]));\n\n const updates: { keys: Record<string, any>; data: Record<string, any> }[] = [];\n const affectedThreads = new Map<string, Date>();\n\n for (const update of messages) {\n const current = existingMap.get(update.id);\n if (!current) continue;\n\n const targetThreadId = update.threadId ?? current.threadId;\n if (!targetThreadId) {\n // If threadId is somehow missing, skip this update safely\n continue;\n }\n const data: Record<string, any> = {};\n\n if (update.threadId && update.threadId !== current.threadId) {\n data.thread_id = update.threadId;\n }\n if (update.role) {\n data.role = update.role;\n }\n if (update.type) {\n data.type = update.type;\n }\n if (update.resourceId !== undefined) {\n data.resourceId = update.resourceId;\n }\n\n if (update.content) {\n const existingContent = (current.content ?? {}) as Record<string, any>;\n const mergedContent: Record<string, any> = { ...existingContent, ...update.content };\n if (\n existingContent.metadata &&\n typeof existingContent.metadata === 'object' &&\n update.content.metadata &&\n typeof update.content.metadata === 'object'\n ) {\n mergedContent.metadata = {\n ...(existingContent.metadata as Record<string, any>),\n ...(update.content.metadata as Record<string, any>),\n };\n }\n data.content = JSON.stringify(mergedContent);\n }\n\n if (Object.keys(data).length === 0) {\n continue;\n }\n\n updates.push({ keys: { id: update.id }, data });\n\n const now = new Date();\n affectedThreads.set(targetThreadId, now);\n if (update.threadId && update.threadId !== current.threadId && current.threadId) {\n affectedThreads.set(current.threadId, now);\n }\n }\n\n if (!updates.length) {\n return existing;\n }\n\n await inTransaction(this.pool, async connection => {\n await this.#assertFence(connection, args.fence, 'updateMessages');\n for (const { keys, data } of updates) {\n const statement = prepareUpdateStatement({ tableName: TABLE_MESSAGES, updates: data, keys });\n await connection.execute(statement.sql, statement.args);\n }\n for (const [threadId, timestamp] of affectedThreads.entries()) {\n const statement = prepareUpdateStatement({\n tableName: TABLE_THREADS,\n updates: { updatedAt: timestamp },\n keys: { id: threadId },\n });\n await connection.execute(statement.sql, statement.args);\n }\n });\n\n const { messages: updated } = await this.listMessagesById({ messageIds: messages.map(m => m.id) });\n return updated;\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_UPDATE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteMessages(messageIds: string[], options?: { fence?: RunFence }): Promise<void> {\n if (!messageIds.length) return;\n try {\n await this.#fenced(options?.fence, 'deleteMessages', async q => {\n const placeholders = messageIds.map(() => '?').join(', ');\n const [rows] = await q.execute<RowDataPacket[]>(\n `SELECT DISTINCT thread_id FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders})`,\n messageIds,\n );\n const threadIds = (rows as { thread_id: string | null }[])\n .map(row => row.thread_id)\n .filter((threadId): threadId is string => Boolean(threadId));\n\n await q.execute(`DELETE FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders})`, messageIds);\n\n if (threadIds.length) {\n const threadPlaceholders = threadIds.map(() => '?').join(', ');\n const timestamp = transformToSqlValue(new Date());\n await q.execute(\n `UPDATE ${formatTableName(TABLE_THREADS)} SET ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE id IN (${threadPlaceholders})`,\n [timestamp, ...threadIds],\n );\n }\n });\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_DELETE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\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('MYSQL', '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 || globalThis.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('MYSQL', '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 const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n // Build message query with filters\n let messageQuery = `SELECT id, thread_id, content, role, type, createdAt, resourceId\n FROM ${formatTableName(TABLE_MESSAGES)} WHERE thread_id = ?`;\n const messageParams: any[] = [sourceThreadId];\n\n // Apply date filters\n if (options?.messageFilter?.startDate) {\n messageQuery += ` AND createdAt >= ?`;\n messageParams.push(transformToSqlValue(options.messageFilter.startDate));\n }\n if (options?.messageFilter?.endDate) {\n messageQuery += ` AND createdAt <= ?`;\n messageParams.push(transformToSqlValue(options.messageFilter.endDate));\n }\n\n // Apply message ID filter\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n const placeholders = options.messageFilter.messageIds.map(() => '?').join(', ');\n messageQuery += ` AND id IN (${placeholders})`;\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 ?) AS limited ORDER BY createdAt ASC`;\n messageParams.push(options.messageLimit);\n messageQuery = limitQuery;\n }\n\n const [sourceMessageRows] = await connection.execute<RowDataPacket[]>(messageQuery, messageParams);\n\n const now = new Date();\n\n // Determine the last message ID for clone metadata\n const lastMessageId =\n sourceMessageRows.length > 0 ? (sourceMessageRows[sourceMessageRows.length - 1] as any).id : 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 // Insert the new thread\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_THREADS)} (id, resourceId, title, metadata, createdAt, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [\n newThread.id,\n newThread.resourceId,\n newThread.title,\n newThread.metadata ? JSON.stringify(newThread.metadata) : null,\n transformToSqlValue(now),\n transformToSqlValue(now),\n ],\n );\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const messageIdMap: Record<string, string> = {};\n const targetResourceId = resourceId || sourceThread.resourceId;\n\n for (const sourceRow of sourceMessageRows) {\n const row = sourceRow as MessageRow;\n const newMessageId = globalThis.crypto.randomUUID();\n messageIdMap[row.id] = newMessageId;\n\n let content = row.content;\n try {\n content = typeof content === 'string' ? JSON.parse(content) : content;\n } catch {\n // use content as-is\n }\n\n const msgCreatedAt = parseDateTime(row.createdAt) ?? now;\n\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_MESSAGES)} (id, thread_id, content, createdAt, role, type, resourceId)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n newMessageId,\n newThreadId,\n typeof row.content === 'string' ? row.content : JSON.stringify(row.content),\n transformToSqlValue(msgCreatedAt),\n row.role,\n row.type || 'v2',\n targetResourceId,\n ],\n );\n\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: content as MastraMessageContentV2,\n role: row.role as MastraDBMessage['role'],\n type: row.type ?? undefined,\n createdAt: msgCreatedAt,\n resourceId: targetResourceId,\n });\n }\n\n await connection.commit();\n\n return {\n thread: newThread,\n clonedMessages,\n messageIdMap,\n };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, filter, orderBy, page = 0, perPage: perPageInput } = args;\n const selectBy = (\n args as StorageListMessagesInput & {\n selectBy?: { include?: StorageListMessagesInput['include']; last?: number; vectorSearchString?: string };\n }\n ).selectBy;\n const include = args.include ?? selectBy?.include;\n const metadataFilter = validateStorageMetadataFilter(filter?.metadata);\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 emitValidationError('threadId must be a non-empty string or array of non-empty strings');\n }\n\n const primaryThreadId = threadIds[0]!;\n\n const normalizedPerPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage } = calculatePagination(page, perPageInput, normalizedPerPage);\n\n const field = orderBy?.field ?? 'createdAt';\n const direction = (orderBy?.direction ?? 'ASC').toUpperCase() === 'DESC' ? 'DESC' : 'ASC';\n const comparator = (a: MastraDBMessage, b: MastraDBMessage) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n if (aValue == null && bValue == null) return a.id.localeCompare(b.id);\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n if (aValue === bValue) return a.id.localeCompare(b.id);\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 try {\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (threadIds.length === 1) {\n conditions.push(`${quoteIdentifier('thread_id', 'column name')} = ?`);\n params.push(threadIds[0]!);\n } else {\n const placeholders = threadIds.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier('thread_id', 'column name')} IN (${placeholders})`);\n params.push(...threadIds);\n }\n\n if (resourceId) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(resourceId);\n }\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${startOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.start));\n }\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${endOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.end));\n }\n\n addMySQLMessageMetadataFilter(conditions, params, metadataFilter);\n\n if (selectBy?.vectorSearchString) {\n conditions.push(`${quoteIdentifier('content', 'column name')} LIKE ?`);\n params.push(`%${selectBy.vectorSearchString}%`);\n }\n\n const whereSql = conditions.length ? ` WHERE ${conditions.join(' AND ')}` : '';\n const tableName = formatTableName(TABLE_MESSAGES);\n\n // Fast path: perPage=0 with no includes returns empty immediately\n if (perPage === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Fast path: perPage=0 with includes skips COUNT and main query\n if (perPage === 0 && include && include.length > 0) {\n const includeRows = await this._getIncludedMessages({ include, resourceId });\n if (!includeRows || includeRows.length === 0) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const includeMessages = includeRows.map(row => this.mapMessage(row));\n const list = new MessageList();\n list.add(includeMessages, 'memory');\n const messages = list.get.all.db().sort(comparator);\n\n return {\n messages,\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableName}${whereSql}`,\n params,\n );\n const total = Number(countRows[0]?.count ?? 0);\n\n // If nothing to return and no include, short circuit\n if (total === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // last takes precedence over perPage\n const lastLimit =\n selectBy?.last !== undefined\n ? typeof selectBy.last === 'number' && selectBy.last > 0\n ? selectBy.last\n : Number.MAX_SAFE_INTEGER\n : undefined;\n\n const limitValue = lastLimit !== undefined ? lastLimit : perPageInput === false ? total : normalizedPerPage;\n const safeLimit = Math.max(0, Number(limitValue));\n const safeOffset = lastLimit !== undefined ? Math.max(0, total - safeLimit) : Math.max(0, Number(offset));\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${tableName}${whereSql} ORDER BY ${quoteIdentifier(field, 'column name')} ${direction} LIMIT ${safeLimit} OFFSET ${safeOffset}`,\n params,\n );\n\n const messagesByThread = new Map<string, MastraDBMessage[]>();\n const paginatedMain = (rows as unknown as MessageRow[]).map(row => this.mapMessage(row));\n messagesByThread.set(primaryThreadId, paginatedMain);\n\n const includeMessages = await this.collectIncludeMessages({\n threadId: primaryThreadId,\n include,\n messagesByThread,\n resourceId,\n });\n\n const combinedMap = new Map<string, MastraDBMessage>();\n for (const msg of paginatedMain) combinedMap.set(msg.id, msg);\n for (const msg of includeMessages) combinedMap.set(msg.id, msg);\n\n const combinedMessages = Array.from(combinedMap.values()).sort(comparator);\n\n const list = new MessageList();\n list.add(combinedMessages, 'memory');\n const normalizedMessages = list.get.all.db();\n const messages = [...normalizedMessages].sort(comparator);\n\n const baseHasMore = perPageInput === false ? false : safeOffset + safeLimit < total;\n\n const threadIdSet = new Set(threadIds);\n const mainThreadMessageCount = messages.filter(\n msg => msg.threadId !== undefined && threadIdSet.has(msg.threadId),\n ).length;\n const hasMore = metadataFilter || !include?.length || mainThreadMessageCount < total ? baseHasMore : false;\n\n return {\n messages,\n total,\n page,\n perPage,\n hasMore,\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('MYSQL', '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 page,\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\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 const metadataFilter = validateStorageMetadataFilter(filter?.metadata);\n\n if (!resourceId || typeof resourceId !== 'string' || resourceId.trim().length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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 const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n const conditions: string[] = [];\n const params: any[] = [];\n\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(resourceId);\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${startOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.start));\n }\n\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${endOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.end));\n }\n\n addMySQLMessageMetadataFilter(conditions, params, metadataFilter);\n\n const whereSql = `WHERE ${conditions.join(' AND ')}`;\n const tableName = formatTableName(TABLE_MESSAGES);\n\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereSql}`,\n params,\n );\n const total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${tableName} ${whereSql} ORDER BY ${quoteIdentifier(field, 'column name')} ${direction} LIMIT ${Number(limitValue)} OFFSET ${Number(offset)}`,\n params,\n );\n const messages: MastraDBMessage[] = (rows as unknown as MessageRow[]).map(row => this.mapMessage(row));\n\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n // For listMessagesByResourceId, resolve threadId for include items that don't have one\n const resolvedInclude = await Promise.all(\n include.map(async inc => {\n if (inc.threadId) return inc;\n // Look up the message's thread_id\n const [msgRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT thread_id FROM ${tableName} WHERE id = ? AND ${quoteIdentifier('resourceId', 'column name')} = ? LIMIT 1`,\n [inc.id, resourceId],\n );\n const threadId = msgRows?.[0]?.thread_id as string | undefined;\n return threadId ? { ...inc, threadId } : inc;\n }),\n );\n const validInclude = resolvedInclude.filter(inc => inc.threadId);\n if (validInclude.length > 0) {\n const messagesByThread = new Map<string, MastraDBMessage[]>();\n const includeMessages = await this.collectIncludeMessages({\n threadId: validInclude[0]!.threadId!,\n include: validInclude,\n messagesByThread,\n resourceId,\n });\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 const list = new MessageList().add(messages, 'memory');\n let finalMessages = list.get.all.db();\n\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 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 // 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('MYSQL', 'LIST_MESSAGES_BY_RESOURCE_ID', '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 throw mastraError;\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const row = await this.operations.load<ResourceRow>({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n if (!row) return null;\n\n const parsedMetadata =\n typeof row.metadata === 'string'\n ? parseJSON<Record<string, unknown>>(row.metadata)\n : (row.metadata as Record<string, unknown> | null | undefined);\n\n return {\n id: row.id,\n workingMemory: row.workingMemory ?? undefined,\n metadata: parsedMetadata ?? undefined,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n } satisfies StorageResourceType;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_GET_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async #insertResource(q: Queryable, resource: StorageResourceType): Promise<void> {\n const metadataValue =\n resource.metadata === undefined || resource.metadata === null ? null : JSON.stringify(resource.metadata);\n const statement = prepareStatement({\n tableName: TABLE_RESOURCES,\n record: {\n id: resource.id,\n workingMemory: resource.workingMemory ?? null,\n metadata: metadataValue,\n createdAt: resource.createdAt ?? new Date(),\n updatedAt: resource.updatedAt ?? new Date(),\n },\n });\n await q.execute(statement.sql, statement.args);\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n await this.#insertResource(this.pool, resource);\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_SAVE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n fence,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n fence?: RunFence;\n }): Promise<StorageResourceType> {\n try {\n const existing = await this.getResourceById({ resourceId });\n\n if (!existing) {\n // Create new resource if not exists\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory: workingMemory ?? '',\n metadata: metadata ?? {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n await this.#fenced(fence, 'updateResource', q => this.#insertResource(q, newResource));\n return newResource;\n }\n\n const mergedMetadata =\n metadata !== undefined ? { ...(existing.metadata ?? {}), ...(metadata ?? {}) } : existing.metadata;\n const metadataValue =\n metadata !== undefined ? (metadata === null ? null : JSON.stringify(mergedMetadata ?? {})) : undefined;\n\n const statement = prepareUpdateStatement({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n updates: {\n ...(workingMemory !== undefined ? { workingMemory } : {}),\n ...(metadataValue !== undefined ? { metadata: metadataValue } : {}),\n updatedAt: new Date(),\n },\n });\n await this.#fenced(fence, 'updateResource', q => q.execute(statement.sql, statement.args));\n const updated = await this.getResourceById({ resourceId });\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_RESOURCE', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Resource ${resourceId} not found after update`,\n details: { resourceId },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_UPDATE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? ORDER BY ${OM_HEAD_ORDER} LIMIT 1`,\n [lookupKey],\n );\n if (!rows || rows.length === 0) return null;\n return this.parseOMRow(rows[0]);\n } catch (error) {\n rethrowOrWrapOM(error, '', 'GET_OBSERVATIONAL_MEMORY', { threadId, resourceId });\n }\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit: number = 10,\n options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const safeLimit = Math.max(1, Math.floor(Number(limit)) || 10);\n\n const conditions: string[] = [`${omCol('lookupKey')} = ?`];\n const params: any[] = [lookupKey];\n\n if (options?.recordId !== undefined) {\n conditions.push(`${omCol('id')} = ?`);\n params.push(options.recordId);\n }\n if (options?.from) {\n conditions.push(`${omCol('createdAt')} >= ?`);\n params.push(transformToSqlValue(options.from));\n }\n if (options?.to) {\n conditions.push(`${omCol('createdAt')} <= ?`);\n params.push(transformToSqlValue(options.to));\n }\n\n if (options?.groupId !== undefined) {\n conditions.push(`(LOCATE(CAST(? AS BINARY), CAST(${omCol('activeObservations')} AS BINARY)) > 0 OR EXISTS (\n SELECT 1 FROM JSON_TABLE(${omCol('bufferedObservationChunks')}, '$[*]'\n COLUMNS (observations LONGTEXT PATH '$.observations')) AS chunk\n WHERE LOCATE(CAST(? AS BINARY), CAST(chunk.observations AS BINARY)) > 0\n ))`);\n const prefix = `<observation-group id=\"${options.groupId}\"`;\n params.push(prefix, prefix);\n }\n if (options?.beforeGeneration !== undefined) {\n conditions.push(`${omCol('generationCount')} < ?`);\n params.push(options.beforeGeneration);\n }\n if (options?.afterGeneration !== undefined) {\n conditions.push(`${omCol('generationCount')} > ?`);\n params.push(options.afterGeneration);\n }\n const direction = options?.sortDirection === 'ASC' ? 'ASC' : 'DESC';\n const whereClause = conditions.join(' AND ');\n let sql = `SELECT * FROM ${OM_TABLE_QUOTED} WHERE ${whereClause} ORDER BY ${omCol('generationCount')} ${direction}, ${omCol('createdAt')} ASC, id ASC LIMIT ${safeLimit}`;\n\n if (options?.offset != null && options.offset > 0) {\n sql += ` OFFSET ${options.offset}`;\n }\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n if (!rows) return [];\n return rows.map(row => this.parseOMRow(row));\n } catch (error) {\n rethrowOrWrapOM(error, '', 'GET_OBSERVATIONAL_MEMORY_HISTORY', { threadId, resourceId, limit });\n }\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n try {\n const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n // Never reused: a write addressed to a cleared record must not land on its successor.\n const id = globalThis.crypto.randomUUID();\n const now = new Date();\n\n const existing = await this.getObservationalMemory(input.threadId, input.resourceId);\n if (existing) return existing;\n\n const nowSql = transformToSqlValue(now);\n const cols = [\n 'id',\n 'lookupKey',\n 'scope',\n 'resourceId',\n 'threadId',\n 'activeObservations',\n 'activeObservationsPendingUpdate',\n 'originType',\n 'config',\n 'generationCount',\n 'lastObservedAt',\n 'lastReflectionAt',\n 'pendingMessageTokens',\n 'totalTokensObserved',\n 'observationTokenCount',\n 'isObserving',\n 'isReflecting',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n 'observedTimezone',\n 'createdAt',\n 'updatedAt',\n 'supersededBy',\n ]\n .map(omCol)\n .join(', ');\n const placeholders = Array.from({ length: 25 }, () => '?').join(', ');\n\n // A named lock keeps concurrent initializers (any process) to one record: each re-checks\n // for a live record while holding it, and the insert commits before it is released.\n const lockName = `mastra_om_init:${createHash('sha256').update(lookupKey).digest('hex').slice(0, 40)}`;\n const connection = await this.pool.getConnection();\n try {\n const [lockRows] = await connection.query<RowDataPacket[]>('SELECT GET_LOCK(?, ?) AS acquired', [\n lockName,\n OM_INIT_LOCK_TIMEOUT_SECONDS,\n ]);\n if (Number(lockRows[0]?.acquired) !== 1) {\n throw new Error(`Timed out waiting for the observational memory initialization lock for ${lookupKey}`);\n }\n try {\n const [liveRows] = await connection.query<RowDataPacket[]>(\n `SELECT 1 FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? AND ${omCol('supersededBy')} IS NULL LIMIT 1`,\n [lookupKey],\n );\n if (liveRows.length === 0) {\n await connection.execute(`INSERT INTO ${OM_TABLE_QUOTED} (${cols}) VALUES (${placeholders})`, [\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,\n false,\n 0,\n null,\n input.observedTimezone || null,\n nowSql,\n nowSql,\n null,\n ]);\n }\n } finally {\n await connection.query('SELECT RELEASE_LOCK(?)', [lockName]);\n }\n } finally {\n connection.release();\n }\n\n // Whoever inserted first (this call or a concurrent one), the head is now the answer.\n const head = await this.getObservationalMemory(input.threadId, input.resourceId);\n if (!head) throwOMNotFound(id, 'INITIALIZE_OBSERVATIONAL_MEMORY');\n return head;\n } catch (error) {\n rethrowOrWrapOM(error, '', 'INITIALIZE_OBSERVATIONAL_MEMORY', {\n threadId: input.threadId,\n resourceId: input.resourceId,\n });\n }\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n assertActiveObservationsApplied(await this.commitActiveObservations(input), input.id);\n }\n\n async commitActiveObservations(input: UpdateActiveObservationsInput): Promise<UpdateActiveObservationsResult> {\n try {\n const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, input.id);\n if (!row) throwOMNotFound(input.id, 'UPDATE_ACTIVE_OBSERVATIONS');\n if (row.supersededBy) return { applied: false, reason: 'retired' as const };\n if (\n input.expectedActiveObservations !== undefined &&\n input.expectedActiveObservations !== ((row.activeObservations as string) || '')\n ) {\n return { applied: false, reason: 'conflict' as const };\n }\n\n // The cursor never moves backward.\n const lastObservedAt = maxObservationCursor(parseDateTime(row.lastObservedAt), input.lastObservedAt)!;\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('activeObservations')} = ?,\n ${omCol('lastObservedAt')} = ?,\n ${omCol('pendingMessageTokens')} = 0,\n ${omCol('observationTokenCount')} = ?,\n ${omCol('totalTokensObserved')} = ${omCol('totalTokensObserved')} + ?,\n ${omCol('observedMessageIds')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n input.observations,\n transformToSqlValue(lastObservedAt),\n input.tokenCount,\n input.tokenCount,\n observedMessageIdsJson,\n transformToSqlValue(new Date()),\n input.id,\n ],\n );\n return { applied: true };\n }, 'commitActiveObservations');\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'UPDATE_ACTIVE_OBSERVATIONS');\n }\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n try {\n const { currentRecord } = input;\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, currentRecord.id);\n if (!row) return currentRecord;\n // A retired snapshot creates nothing; the caller adopts the head.\n if (row.supersededBy) return this.parseOMRow(await this.resolveLiveOMRow(connection, row));\n const stored = this.parseOMRow(row);\n const plan = planReflectionGenerationText({\n storedObservations: stored.activeObservations,\n storedObservationTokenCount: stored.observationTokenCount,\n snapshotObservations: currentRecord.activeObservations,\n snapshotObservationTokenCount: currentRecord.observationTokenCount,\n reflection: input.reflection,\n tokenCount: input.tokenCount,\n });\n // The text was rewritten (not only appended to) since the snapshot: the reflection is stale.\n if (!plan) return stored;\n return this.rollOverOMRow(connection, stored.id, plan.observations, plan.tokenCount, input.newRecordId, false);\n }, 'createReflectionGeneration');\n } catch (error) {\n rethrowOrWrapOM(error, input.currentRecord.id, 'CREATE_REFLECTION_GENERATION', {\n currentRecordId: input.currentRecord.id,\n });\n }\n }\n\n async #insertReflectionGeneration(\n q: Queryable,\n input: CreateReflectionGenerationInput,\n ): Promise<ObservationalMemoryRecord> {\n const id = globalThis.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 const nowSql = transformToSqlValue(now);\n const cols = [\n 'id',\n 'lookupKey',\n 'scope',\n 'resourceId',\n 'threadId',\n 'activeObservations',\n 'activeObservationsPendingUpdate',\n 'originType',\n 'config',\n 'generationCount',\n 'lastObservedAt',\n 'lastReflectionAt',\n 'pendingMessageTokens',\n 'totalTokensObserved',\n 'observationTokenCount',\n 'isObserving',\n 'isReflecting',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n 'observedTimezone',\n 'createdAt',\n 'updatedAt',\n ]\n .map(omCol)\n .join(', ');\n const placeholders = Array.from({ length: 24 }, () => '?').join(', ');\n\n await q.execute(`INSERT INTO ${OM_TABLE_QUOTED} (${cols}) VALUES (${placeholders})`, [\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 ? transformToSqlValue(record.lastObservedAt) : null,\n nowSql,\n record.pendingMessageTokens,\n record.totalTokensObserved,\n record.observationTokenCount,\n false,\n false,\n false,\n false,\n 0,\n null,\n record.observedTimezone || null,\n nowSql,\n nowSql,\n ]);\n\n return record;\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n await this.updateOMFlag(id, 'isReflecting', isReflecting, 'SET_REFLECTING_FLAG');\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n await this.updateOMFlag(id, 'isObserving', isObserving, 'SET_OBSERVING_FLAG');\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n try {\n await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, id);\n if (!row) throwOMNotFound(id, 'SET_BUFFERING_OBSERVATION_FLAG');\n // A retired id is redirected to the head.\n const target = await this.resolveLiveOMRow(connection, row);\n const sets = [\n `${omCol('isBufferingObservation')} = ?`,\n ...(lastBufferedAtTokens !== undefined ? [`${omCol('lastBufferedAtTokens')} = ?`] : []),\n `${omCol('updatedAt')} = ?`,\n ].join(', ');\n await connection.execute(`UPDATE ${OM_TABLE_QUOTED} SET ${sets} WHERE ${omCol('id')} = ?`, [\n isBuffering,\n ...(lastBufferedAtTokens !== undefined ? [lastBufferedAtTokens] : []),\n transformToSqlValue(new Date()),\n target.id,\n ]);\n });\n } catch (error) {\n rethrowOrWrapOM(error, id, 'SET_BUFFERING_OBSERVATION_FLAG');\n }\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n await this.updateOMFlag(id, 'isBufferingReflection', isBuffering, 'SET_BUFFERING_REFLECTION_FLAG');\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n await this.pool.execute(`DELETE FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ?`, [lookupKey]);\n } catch (error) {\n rethrowOrWrapOM(error, '', 'CLEAR_OBSERVATIONAL_MEMORY', { threadId, resourceId });\n }\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n try {\n await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, id);\n if (!row) throwOMNotFound(id, 'SET_PENDING_MESSAGE_TOKENS');\n // A retired id is redirected to the head.\n const target = await this.resolveLiveOMRow(connection, row);\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('pendingMessageTokens')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [tokenCount, transformToSqlValue(new Date()), target.id],\n );\n });\n } catch (error) {\n rethrowOrWrapOM(error, id, 'SET_PENDING_MESSAGE_TOKENS');\n }\n }\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n await this.appendBufferedObservations(input);\n }\n\n async appendBufferedObservations(input: UpdateBufferedObservationsInput): Promise<UpdateBufferedObservationsResult> {\n try {\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${globalThis.crypto.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 threadTitle: input.chunk.threadTitle,\n extractedValues: input.chunk.extractedValues,\n extractionFailures: input.chunk.extractionFailures,\n };\n\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, input.id);\n if (!row) throwOMNotFound(input.id, 'UPDATE_BUFFERED_OBSERVATIONS');\n // A retired id is redirected to the head.\n const target = await this.resolveLiveOMRow(connection, row);\n const existingChunks = parseBufferedChunks(target.bufferedObservationChunks);\n\n // Skip a retried append (same cycle) and a chunk the cursor already wholly covers.\n if (\n existingChunks.some(existing => existing.cycleId === input.chunk.cycleId) ||\n isBufferedChunkCoveredByCursor(input.chunk.lastObservedAt, parseDateTime(target.lastObservedAt))\n ) {\n return { persisted: false, recordId: target.id as string };\n }\n\n // lastBufferedAtTime never moves backward.\n const lastBufferedAtTime = maxObservationCursor(\n parseDateTime(target.lastBufferedAtTime),\n input.lastBufferedAtTime ?? undefined,\n );\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('bufferedObservationChunks')} = ?,\n ${omCol('lastBufferedAtTime')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n JSON.stringify([...existingChunks, newChunk]),\n transformToSqlValue(lastBufferedAtTime),\n transformToSqlValue(new Date()),\n target.id,\n ],\n );\n return { persisted: true, recordId: target.id as string };\n }, 'appendBufferedObservations');\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'UPDATE_BUFFERED_OBSERVATIONS');\n }\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n try {\n return await this.withOMTransaction(async connection => {\n // Lock the record: activation is computed from (and written back to) the stored state.\n const row = await this.lockOMRow(connection, input.id);\n if (!row) throwOMNotFound(input.id, 'SWAP_BUFFERED_TO_ACTIVE');\n\n const emptyResult: SwapBufferedToActiveResult = {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n // A retired record is frozen: activation reports it and writes nothing.\n if (row.supersededBy) return { ...emptyResult, retired: true };\n\n // Activation always works on the stored list, so a chunk appended after the caller read\n // the record is never dropped. Caller-provided chunks only override token weights.\n const persistedChunks = parseBufferedChunks(row.bufferedObservationChunks);\n const refreshedWeights = new Map(\n (Array.isArray(input.bufferedChunks) ? input.bufferedChunks : []).map(c => [c.id, c.messageTokens]),\n );\n const chunks = persistedChunks.map(c =>\n refreshedWeights.has(c.id) ? { ...c, messageTokens: refreshedWeights.get(c.id)! } : c,\n );\n\n if (chunks.length === 0) {\n return emptyResult;\n }\n\n // Calculate target message 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\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 if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n bestOverBoundary = boundary;\n bestOverTokens = cumulativeMessageTokens;\n }\n } else {\n if (cumulativeMessageTokens > bestUnderTokens) {\n bestUnderBoundary = boundary;\n bestUnderTokens = cumulativeMessageTokens;\n }\n }\n }\n\n const maxOvershoot = retentionFloor * 0.95;\n const overshoot = bestOverTokens - targetMessageTokens;\n const remainingAfterOver = input.currentPendingTokens - bestOverTokens;\n const remainingAfterUnder = input.currentPendingTokens - bestUnderTokens;\n const minRemaining = Math.min(1000, retentionFloor);\n\n let chunksToActivate: number;\n if (input.forceMaxActivation && bestOverBoundary > 0 && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {\n chunksToActivate = bestUnderBoundary;\n } else if (bestOverBoundary > 0) {\n chunksToActivate = bestOverBoundary;\n } else {\n chunksToActivate = 1;\n }\n\n // Split chunks: activate a stored prefix, keep the rest of the stored list.\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = persistedChunks.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((cid): cid is string => !!cid);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n // Derive lastObservedAt from the latest activated chunk; the stored cursor never moves\n // backward (a sync observation may already be past this chunk).\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const derivedLastObservedAt =\n input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n const lastObservedAt = maxObservationCursor(parseDateTime(row.lastObservedAt), derivedLastObservedAt)!;\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\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 connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('activeObservations')} = ?,\n ${omCol('observationTokenCount')} = ?,\n ${omCol('pendingMessageTokens')} = ?,\n ${omCol('bufferedObservationChunks')} = ?,\n ${omCol('lastObservedAt')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n newActive,\n newTokenCount,\n newPending,\n remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n transformToSqlValue(lastObservedAt),\n transformToSqlValue(new Date()),\n input.id,\n ],\n );\n\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 }, 'swapBufferedToActive');\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'SWAP_BUFFERED_TO_ACTIVE');\n }\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n try {\n const nowSql = transformToSqlValue(new Date());\n const br = omCol('bufferedReflection');\n\n const [result] = await this.#fenced(undefined, 'updateBufferedReflection', q =>\n q.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${br} = CASE\n WHEN ${br} IS NOT NULL AND ${br} != ''\n THEN CONCAT(${br}, CHAR(10), CHAR(10), ?)\n ELSE ?\n END,\n ${omCol('bufferedReflectionTokens')} = COALESCE(${omCol('bufferedReflectionTokens')}, 0) + ?,\n ${omCol('bufferedReflectionInputTokens')} = COALESCE(${omCol('bufferedReflectionInputTokens')}, 0) + ?,\n ${omCol('reflectedObservationLineCount')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n input.reflection,\n input.reflection,\n input.tokenCount,\n input.inputTokenCount,\n input.reflectedObservationLineCount,\n nowSql,\n input.id,\n ],\n ),\n );\n\n if ((result as ResultSetHeader).affectedRows === 0) {\n throwOMNotFound(input.id, 'UPDATE_BUFFERED_REFLECTION');\n }\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'UPDATE_BUFFERED_REFLECTION');\n }\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n try {\n const { currentRecord } = input;\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, currentRecord.id);\n if (!row) return currentRecord;\n // A retired snapshot creates nothing; the caller adopts the head.\n if (row.supersededBy) return this.parseOMRow(await this.resolveLiveOMRow(connection, row));\n const stored = this.parseOMRow(row);\n\n const bufferedReflection = stored.bufferedReflection || '';\n if (!bufferedReflection) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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: currentRecord.id },\n });\n }\n // Only appends may have happened since the caller's snapshot; a rewrite invalidates the\n // reflected line count.\n if (!isAppendOnlySince(stored.activeObservations, currentRecord.activeObservations)) {\n return stored;\n }\n\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const reflectedLineCount = stored.reflectedObservationLineCount ?? 0;\n const unreflectedContent = (stored.activeObservations || '')\n .split('\\n')\n .slice(reflectedLineCount)\n .join('\\n')\n .trim();\n const newObservations = unreflectedContent\n ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n : bufferedReflection;\n // tokenCount is computed by the processor from its snapshot; add tokens appended since.\n const tokenCount =\n input.tokenCount +\n Math.max(0, (stored.observationTokenCount ?? 0) - (currentRecord.observationTokenCount ?? 0));\n\n return this.rollOverOMRow(connection, stored.id, newObservations, tokenCount, input.newRecordId, true);\n }, 'swapBufferedReflectionToActive');\n } catch (error) {\n rethrowOrWrapOM(error, input.currentRecord.id, 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE');\n }\n }\n\n /**\n * Runs `fn` in one transaction on a dedicated connection. Every OM lifecycle write locks its\n * target row by primary key (`SELECT … FOR UPDATE`, a record lock — never a range), so the\n * only expected lock conflict is a wait; a deadlock or lock-wait timeout (e.g. against the\n * startup backfill's scan) is retried a bounded number of times.\n */\n private async withOMTransaction<T>(\n fn: (connection: PoolConnection) => Promise<T>,\n fencedOperation?: string,\n ): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n if (fencedOperation) await this.#assertFence(connection, undefined, fencedOperation);\n const result = await fn(connection);\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback().catch(() => {});\n if (attempt < OM_MAX_TRANSACTION_ATTEMPTS && isRetryableLockError(error)) continue;\n throw error;\n } finally {\n connection.release();\n }\n }\n }\n\n /** Row-locks one OM record by primary key for the rest of the transaction. */\n private async lockOMRow(connection: PoolConnection, id: string): Promise<RowDataPacket | null> {\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT * FROM ${OM_TABLE_QUOTED} WHERE ${omCol('id')} = ? FOR UPDATE`,\n [id],\n );\n return rows?.[0] ?? null;\n }\n\n /**\n * The live, row-locked record a lifecycle write aimed at `row` lands on: `row` itself while\n * live, otherwise the head. The head is found with a plain (non-locking, so no range locks)\n * canonical head read, then locked by primary key. Under REPEATABLE READ that read can predate\n * a rollover committed after this transaction started; the locking read sees the latest\n * committed row, so a head retired since is followed through `supersededBy` (bounded).\n */\n private async resolveLiveOMRow(connection: PoolConnection, row: RowDataPacket): Promise<RowDataPacket> {\n if (!row.supersededBy) return row;\n const [heads] = await connection.execute<RowDataPacket[]>(\n `SELECT id FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? ORDER BY ${OM_HEAD_ORDER} LIMIT 1`,\n [row.lookupKey],\n );\n const headId = (heads?.[0]?.id as string | undefined) ?? (row.supersededBy as string);\n let current: RowDataPacket = (await this.lockOMRow(connection, headId)) ?? row;\n for (let hop = 0; current.supersededBy; hop++) {\n const next = hop < OM_MAX_HEAD_HOPS ? await this.lockOMRow(connection, current.supersededBy as string) : null;\n if (!next) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'RESOLVE_OBSERVATIONAL_MEMORY_HEAD', 'FAILED'),\n text: `Observational memory record ${row.id} is superseded but no live head was found`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: row.id as string },\n });\n }\n current = next;\n }\n return current;\n }\n\n /**\n * Create the next generation from the stored (live, row-locked) record and retire the stored\n * record in the same transaction. Carried columns are copied in SQL from the stored row, so\n * nothing round-trips through a client-side date conversion. Buffered chunks move to the new\n * generation; the cursor, buffering markers, flags, and counters carry over; buffered\n * reflection state does not (and is cleared on the retired row after a buffered swap).\n */\n private async rollOverOMRow(\n connection: PoolConnection,\n storedId: string,\n observations: string,\n tokenCount: number,\n newRecordId: string | undefined,\n clearBufferedReflection: boolean,\n ): Promise<ObservationalMemoryRecord> {\n const id = newRecordId ?? globalThis.crypto.randomUUID();\n const nowSql = transformToSqlValue(new Date());\n const c = omCol;\n await connection.execute(\n `INSERT INTO ${OM_TABLE_QUOTED} (\n ${c('id')}, ${c('lookupKey')}, ${c('scope')}, ${c('resourceId')}, ${c('threadId')},\n ${c('activeObservations')}, ${c('activeObservationsPendingUpdate')},\n ${c('originType')}, ${c('config')}, ${c('generationCount')}, ${c('lastObservedAt')}, ${c('lastReflectionAt')},\n ${c('pendingMessageTokens')}, ${c('totalTokensObserved')}, ${c('observationTokenCount')}, ${c('bufferedObservationChunks')},\n ${c('isObserving')}, ${c('isReflecting')}, ${c('isBufferingObservation')}, ${c('isBufferingReflection')},\n ${c('lastBufferedAtTokens')}, ${c('lastBufferedAtTime')},\n ${c('observedTimezone')}, ${c('metadata')}, ${c('supersededBy')}, ${c('createdAt')}, ${c('updatedAt')}\n )\n SELECT\n ?, ${c('lookupKey')}, ${c('scope')}, ${c('resourceId')}, ${c('threadId')},\n ?, NULL,\n 'reflection', ${c('config')}, ${c('generationCount')} + 1, ${c('lastObservedAt')}, ?,\n ${c('pendingMessageTokens')}, ${c('totalTokensObserved')}, ?, ${c('bufferedObservationChunks')},\n false, false, ${c('isBufferingObservation')}, false,\n ${c('lastBufferedAtTokens')}, ${c('lastBufferedAtTime')},\n ${c('observedTimezone')}, ${c('metadata')}, NULL, ?, ?\n FROM ${OM_TABLE_QUOTED} WHERE ${c('id')} = ?`,\n [id, observations, nowSql, Math.round(tokenCount), nowSql, nowSql, storedId],\n );\n\n // Retire the stored record: chunks moved, liveness marker set (never cleared).\n const [retired] = await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${c('supersededBy')} = ?,\n ${c('bufferedObservationChunks')} = NULL,\n ${\n clearBufferedReflection\n ? `${c('bufferedReflection')} = NULL, ${c('bufferedReflectionTokens')} = NULL,\n ${c('bufferedReflectionInputTokens')} = NULL, ${c('reflectedObservationLineCount')} = NULL,`\n : ''\n }\n ${c('updatedAt')} = ?\n WHERE ${c('id')} = ? AND ${c('supersededBy')} IS NULL`,\n [id, nowSql, storedId],\n );\n if ((retired as ResultSetHeader).affectedRows !== 1) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'CREATE_REFLECTION_GENERATION', 'RETIRE_FAILED'),\n text: `Failed to retire observational memory record ${storedId}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: storedId },\n });\n }\n\n const inserted = await this.lockOMRow(connection, id);\n if (!inserted) throwOMNotFound(id, 'CREATE_REFLECTION_GENERATION');\n return this.parseOMRow(inserted);\n }\n\n /**\n * Retire every live row that sorts after its key's canonical head, marking it superseded by\n * the head. Rows retired by older adapter versions (which never set `supersededBy`) become\n * frozen. Only keys with more than one live row are touched; each update embeds the head's\n * ordering key, so a row created by a concurrent rollover (a newer generation) never matches.\n * Runs at READ COMMITTED so the scan takes no gap locks.\n */\n private async backfillSupersededBy(): Promise<void> {\n const [keys] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${omCol('lookupKey')} AS lookupKey FROM ${OM_TABLE_QUOTED}\n WHERE ${omCol('supersededBy')} IS NULL GROUP BY ${omCol('lookupKey')} HAVING COUNT(*) > 1`,\n );\n for (const { lookupKey } of keys ?? []) {\n for (let attempt = 1; ; attempt++) {\n const connection = await this.pool.getConnection();\n try {\n await connection.query('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');\n await connection.beginTransaction();\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} AS r\n JOIN (\n SELECT ${omCol('id')} AS id, ${omCol('generationCount')} AS generationCount, ${omCol('createdAt')} AS createdAt\n FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? ORDER BY ${OM_HEAD_ORDER} LIMIT 1\n ) AS h\n SET r.${omCol('supersededBy')} = h.id\n WHERE r.${omCol('lookupKey')} = ?\n AND r.${omCol('supersededBy')} IS NULL\n AND (\n r.${omCol('generationCount')} < h.generationCount\n OR (r.${omCol('generationCount')} = h.generationCount AND r.${omCol('createdAt')} > h.createdAt)\n OR (r.${omCol('generationCount')} = h.generationCount AND r.${omCol('createdAt')} = h.createdAt AND r.${omCol('id')} > h.id)\n )`,\n [lookupKey, lookupKey],\n );\n await connection.commit();\n break;\n } catch (error) {\n await connection.rollback().catch(() => {});\n if (attempt < OM_MAX_TRANSACTION_ATTEMPTS && isRetryableLockError(error)) continue;\n throw error;\n } finally {\n connection.release();\n }\n }\n }\n }\n\n private async updateOMFlag(id: string, column: string, value: boolean, operation: string): Promise<void> {\n try {\n const [result] = await this.pool.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET ${omCol(column)} = ?, ${omCol('updatedAt')} = ? WHERE ${omCol('id')} = ?`,\n [value, transformToSqlValue(new Date()), id],\n );\n\n if ((result as ResultSetHeader).affectedRows === 0) {\n throwOMNotFound(id, operation);\n }\n } catch (error) {\n rethrowOrWrapOM(error, id, operation);\n }\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: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n lastObservedAt: row.lastObservedAt ? parseDateTime(row.lastObservedAt) : undefined,\n originType: row.originType || 'initial',\n generationCount: Number(row.generationCount || 0),\n activeObservations: row.activeObservations || '',\n bufferedObservationChunks: parseJSONColumn<BufferedObservationChunk[]>(row.bufferedObservationChunks),\n bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n bufferedMessageIds: undefined,\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: parseMySQLBool(row.isReflecting),\n isObserving: parseMySQLBool(row.isObserving),\n isBufferingObservation: parseMySQLBool(row.isBufferingObservation),\n isBufferingReflection: parseMySQLBool(row.isBufferingReflection),\n lastBufferedAtTokens:\n typeof row.lastBufferedAtTokens === 'number'\n ? row.lastBufferedAtTokens\n : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n lastBufferedAtTime: row.lastBufferedAtTime ? (parseDateTime(row.lastBufferedAtTime) ?? null) : null,\n config: parseJSONColumn(row.config) ?? {},\n metadata: parseJSONColumn(row.metadata),\n observedMessageIds: parseJSONColumn<string[]>(row.observedMessageIds),\n observedTimezone: row.observedTimezone || undefined,\n supersededBy: row.supersededBy ?? null,\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n executeRetentionPrune,\n listTracesArgsSchema,\n ObservabilityStorage,\n resolveRetentionTargets,\n retentionCutoffMs,\n SPAN_SCHEMA,\n TABLE_SCHEMAS,\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 CreateIndexOptions,\n GetSpanArgs,\n PruneOptions,\n PruneResult,\n RetentionTablesDescriptor,\n TableRetentionPolicy,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n LightSpanRecord,\n} from '@mastra/core/storage';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformFromSqlRow } from '../utils';\n\nconst JSON_SPAN_FIELDS = ['input', 'output', 'attributes', 'metadata', 'error', 'links', 'scope', 'tags'] as const;\n\nfunction serializeJsonFields(source: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const field of JSON_SPAN_FIELDS) {\n if (field in source && source[field] !== undefined) {\n result[field] = source[field] !== null ? JSON.stringify(source[field]) : null;\n }\n }\n return result;\n}\n\nexport class ObservabilityMySQL extends ObservabilityStorage {\n static override readonly retentionTables: RetentionTablesDescriptor = {\n spans: { table: TABLE_SPANS, column: 'startedAt', indexed: true },\n };\n\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SPANS] as const;\n\n constructor({\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ObservabilityMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n const targets = resolveRetentionTargets({\n policies,\n descriptor: ObservabilityMySQL.retentionTables,\n order: ['spans'],\n });\n return executeRetentionPrune({\n domain: 'observability',\n targets,\n options,\n cutoffFor: (target, now) => new Date(retentionCutoffMs(target.policy, now)),\n deleteBatch: (target, cutoff, limit) =>\n this.operations.pruneBatch({\n tableName: target.table as typeof TABLE_SPANS,\n column: target.column,\n cutoff,\n limit,\n }),\n });\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_SPANS,\n schema: SPAN_SCHEMA,\n ifNotExists: Object.keys(SPAN_SCHEMA),\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_ai_spans_traceid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['traceId', 'startedAt DESC'],\n },\n {\n name: `${prefix}mastra_ai_spans_parentspanid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['parentSpanId', 'startedAt DESC'],\n },\n {\n name: `${prefix}mastra_ai_spans_name_idx`,\n table: TABLE_SPANS,\n columns: ['name'],\n },\n {\n name: `${prefix}mastra_ai_spans_spantype_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['spanType', 'startedAt DESC'],\n },\n {\n name: `${prefix}mastra_ai_spans_root_spans_idx`,\n table: TABLE_SPANS,\n columns: ['startedAt DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_SPANS,\n schema: TABLE_SCHEMAS[TABLE_SPANS],\n compositePrimaryKey: ['traceId', 'spanId'],\n }),\n );\n\n for (const idx of ObservabilityMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ObservabilityMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SPANS });\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 now = new Date();\n const record = {\n ...span,\n ...serializeJsonFields(span),\n createdAt: now,\n updatedAt: now,\n };\n await this.operations.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ? AND ${quoteIdentifier('spanId', 'column name')} = ?`,\n args: [traceId, spanId],\n },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return { span: rows[0]! };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ? AND ${quoteIdentifier('parentSpanId', 'column name')} IS NULL`,\n args: [traceId],\n },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return { span: rows[0]! };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ?`,\n args: [traceId],\n },\n orderBy: `${quoteIdentifier('startedAt', 'column name')} ASC`,\n });\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getStructure(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n try {\n const spans = await this.operations.loadMany<LightSpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ?`,\n args: [traceId],\n },\n orderBy: `${quoteIdentifier('startedAt', 'column name')} ASC`,\n });\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n // Strip heavy fields (input, output, attributes, metadata, tags, links) for lightweight response\n const lightSpans: LightSpanRecord[] = spans.map(span => ({\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n entityType: span.entityType,\n entityId: span.entityId,\n entityName: span.entityName,\n spanType: span.spanType,\n error: span.error,\n isEvent: span.isEvent,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n createdAt: span.createdAt,\n updatedAt: span.updatedAt,\n }));\n\n return {\n traceId,\n spans: lightSpans,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'GET_STRUCTURE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\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> = {\n ...updates,\n ...serializeJsonFields(updates),\n updatedAt: new Date(),\n };\n\n await this.operations.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n const tbl = formatTableName(TABLE_SPANS);\n\n try {\n const conditions: string[] = [`${quoteIdentifier('parentSpanId', 'column name')} IS NULL`];\n const queryArgs: any[] = [];\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`${quoteIdentifier('startedAt', 'column name')} >= ?`);\n queryArgs.push(filters.startedAt.start);\n }\n if (filters.startedAt?.end) {\n conditions.push(`${quoteIdentifier('startedAt', 'column name')} <= ?`);\n queryArgs.push(filters.startedAt.end);\n }\n if (filters.endedAt?.start) {\n conditions.push(`${quoteIdentifier('endedAt', 'column name')} >= ?`);\n queryArgs.push(filters.endedAt.start);\n }\n if (filters.endedAt?.end) {\n conditions.push(`${quoteIdentifier('endedAt', 'column name')} <= ?`);\n queryArgs.push(filters.endedAt.end);\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`${quoteIdentifier('spanType', 'column name')} = ?`);\n queryArgs.push(filters.spanType);\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`${quoteIdentifier('entityType', 'column name')} = ?`);\n queryArgs.push(filters.entityType);\n }\n if (filters.entityId !== undefined) {\n conditions.push(`${quoteIdentifier('entityId', 'column name')} = ?`);\n queryArgs.push(filters.entityId);\n }\n if (filters.entityName !== undefined) {\n conditions.push(`${quoteIdentifier('entityName', 'column name')} = ?`);\n queryArgs.push(filters.entityName);\n }\n\n // Identity & tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`${quoteIdentifier('userId', 'column name')} = ?`);\n queryArgs.push(filters.userId);\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n queryArgs.push(filters.organizationId);\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n queryArgs.push(filters.resourceId);\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`${quoteIdentifier('runId', 'column name')} = ?`);\n queryArgs.push(filters.runId);\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`${quoteIdentifier('sessionId', 'column name')} = ?`);\n queryArgs.push(filters.sessionId);\n }\n if (filters.threadId !== undefined) {\n conditions.push(`${quoteIdentifier('threadId', 'column name')} = ?`);\n queryArgs.push(filters.threadId);\n }\n if (filters.requestId !== undefined) {\n conditions.push(`${quoteIdentifier('requestId', 'column name')} = ?`);\n queryArgs.push(filters.requestId);\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`${quoteIdentifier('environment', 'column name')} = ?`);\n queryArgs.push(filters.environment);\n }\n if (filters.source !== undefined) {\n conditions.push(`${quoteIdentifier('source', 'column name')} = ?`);\n queryArgs.push(filters.source);\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`${quoteIdentifier('serviceName', 'column name')} = ?`);\n queryArgs.push(filters.serviceName);\n }\n\n // Scope filter (JSON containment - MySQL uses JSON_EXTRACT)\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('scope', 'column name')}, '$.${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 if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryArgs.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryArgs.push(JSON.stringify(value));\n }\n }\n }\n\n // Tags filter (all tags must be present - MySQL uses JSON_CONTAINS)\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n conditions.push(`JSON_CONTAINS(${quoteIdentifier('tags', 'column name')}, ?, '$')`);\n queryArgs.push(JSON.stringify(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(`${quoteIdentifier('error', 'column name')} IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(\n `${quoteIdentifier('endedAt', 'column name')} IS NULL AND ${quoteIdentifier('error', 'column name')} IS NULL`,\n );\n break;\n case TraceStatus.SUCCESS:\n conditions.push(\n `${quoteIdentifier('endedAt', 'column name')} IS NOT NULL AND ${quoteIdentifier('error', 'column name')} IS NULL`,\n );\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 ${tbl} c\n WHERE c.${quoteIdentifier('traceId', 'column name')} = ${tbl}.${quoteIdentifier('traceId', 'column name')}\n AND c.${quoteIdentifier('parentSpanId', 'column name')} IS NOT NULL\n AND c.${quoteIdentifier('error', 'column name')} IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${tbl} c\n WHERE c.${quoteIdentifier('traceId', 'column name')} = ${tbl}.${quoteIdentifier('traceId', 'column name')}\n AND c.${quoteIdentifier('parentSpanId', 'column name')} IS NOT NULL\n AND c.${quoteIdentifier('error', 'column name')} 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 // MySQL's natural behavior: NULLs are \"smaller\" than any value\n // - ASC: NULLs first (natural)\n // - DESC: NULLs last (natural)\n // We need CASE WHEN workarounds for endedAt to get desired ordering\n const sortField = quoteIdentifier(orderBy.field, 'column name');\n const sortDirection = orderBy.direction;\n let orderByClause: string;\n if (orderBy.field === 'endedAt') {\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.operations.loadTotalCount({\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 // Use raw query to support CASE WHEN in ORDER BY (sanitizeOrderBy in loadMany rejects it)\n const offset = page * perPage;\n const selectSql = `SELECT * FROM ${tbl}${whereClause} ORDER BY ${orderByClause} LIMIT ${Math.max(0, perPage)} OFFSET ${Math.max(0, offset)}`;\n const rawRows = await this.operations.query(selectSql, queryArgs);\n const spans = rawRows.map(row => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: row as any }));\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: (page + 1) * perPage < count,\n },\n spans: toTraceSpans(spans),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 if (!args.records.length) {\n return;\n }\n const now = new Date();\n await this.operations.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n ...serializeJsonFields(record),\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 try {\n if (!args.records.length) {\n return;\n }\n const now = new Date();\n await this.operations.batchUpdate({\n tableName: TABLE_SPANS,\n items: args.records.map(record => ({\n keys: { spanId: record.spanId, traceId: record.traceId },\n data: {\n ...record.updates,\n ...serializeJsonFields(record.updates),\n updatedAt: now,\n },\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 this.assertUnscopedBatchDeleteTraces(args);\n try {\n if (!args.traceIds.length) {\n return;\n }\n const keys = args.traceIds.map(traceId => ({ traceId }));\n await this.operations.batchDelete({\n tableName: TABLE_SPANS,\n keys,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n}\n","import { 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 TABLE_SCHEMAS,\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 CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class PromptBlocksMySQL extends PromptBlocksStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (PromptBlocksMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: PROMPT_BLOCKS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, schema: PROMPT_BLOCK_VERSIONS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n schema: PROMPT_BLOCK_VERSIONS_SCHEMA,\n ifNotExists: ['requestContextSchema'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_prompt_block_versions_block_version`,\n table: TABLE_PROMPT_BLOCK_VERSIONS,\n columns: ['blockId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of PromptBlocksMySQL.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n\n for (const idx of PromptBlocksMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return PromptBlocksMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_PROMPT_BLOCKS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseBlockRow(row: Record<string, unknown>): StoragePromptBlockType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): PromptBlockVersion {\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: this.safeParseJSON(row.rules) as PromptBlockVersion['rules'],\n requestContextSchema: this.safeParseJSON(row.requestContextSchema) as Record<string, unknown> | undefined,\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_PROMPT_BLOCKS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseBlockRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n try {\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 } catch (versionError) {\n try {\n await this.operations.delete({ tableName: TABLE_PROMPT_BLOCKS, keys: { id: promptBlock.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback prompt block creation:', rollbackError);\n }\n throw versionError;\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Prompt block with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_PROMPT_BLOCKS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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.operations.delete({ tableName: TABLE_PROMPT_BLOCKS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: any[] = [];\n\n if (status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_PROMPT_BLOCKS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n }\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams } : undefined;\n const total = await this.operations.loadTotalCount({ tableName: TABLE_PROMPT_BLOCKS, whereClause });\n\n if (total === 0) {\n return { promptBlocks: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCKS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n promptBlocks: rows.map(row => this.parseBlockRow(row)),\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('MYSQL', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const now = new Date();\n await this.operations.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 requestContextSchema: input.requestContextSchema ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_PROMPT_BLOCK_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [blockId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ?`, args: [blockId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ?`, args: [blockId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, whereClause });\n\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_PROMPT_BLOCK_VERSIONS)} WHERE ${quoteIdentifier('blockId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ?`, args: [blockId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import {\n normalizeScheduleTarget,\n SchedulesStorage,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n Schedule,\n ScheduleFilter,\n ScheduleTrigger,\n ScheduleTriggerListOptions,\n ScheduleStatus,\n ScheduleTarget,\n ScheduleUpdate,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket, ResultSetHeader } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nfunction parseJson<T = unknown>(val: unknown): T | undefined {\n if (val == null) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n}\n\nfunction toNumber(val: unknown): number {\n if (typeof val === 'bigint') return Number(val);\n return Number(val);\n}\n\nfunction rowToSchedule(row: Record<string, any>): Schedule {\n const target = parseJson<ScheduleTarget>(row.target);\n if (!target) {\n throw new Error(`Schedule row ${row.id} has invalid target`);\n }\n const schedule: Schedule = {\n id: String(row.id),\n target: normalizeScheduleTarget(target),\n cron: String(row.cron),\n status: String(row.status) as ScheduleStatus,\n nextFireAt: toNumber(row.next_fire_at),\n createdAt: toNumber(row.created_at),\n updatedAt: toNumber(row.updated_at),\n };\n if (row.timezone != null) schedule.timezone = String(row.timezone);\n if (row.last_fire_at != null) schedule.lastFireAt = toNumber(row.last_fire_at);\n if (row.last_run_id != null) schedule.lastRunId = String(row.last_run_id);\n const metadata = parseJson<Record<string, unknown>>(row.metadata);\n if (metadata !== undefined) schedule.metadata = metadata;\n if (row.owner_type != null) schedule.ownerType = String(row.owner_type) as Schedule['ownerType'];\n if (row.owner_id != null) schedule.ownerId = String(row.owner_id);\n return schedule;\n}\n\nfunction rowToTrigger(row: Record<string, any>): ScheduleTrigger {\n const trigger: ScheduleTrigger = {\n id: row.id != null ? String(row.id) : undefined,\n scheduleId: String(row.schedule_id),\n runId: row.run_id != null ? String(row.run_id) : null,\n scheduledFireAt: toNumber(row.scheduled_fire_at),\n actualFireAt: toNumber(row.actual_fire_at),\n outcome: String(row.outcome) as ScheduleTrigger['outcome'],\n triggerKind:\n row.trigger_kind != null ? (String(row.trigger_kind) as ScheduleTrigger['triggerKind']) : 'schedule-fire',\n };\n if (row.error != null) trigger.error = String(row.error);\n if (row.parent_trigger_id != null) trigger.parentTriggerId = String(row.parent_trigger_id);\n const metadata = parseJson<Record<string, unknown>>(row.metadata);\n if (metadata !== undefined) trigger.metadata = metadata;\n return trigger;\n}\n\nexport class SchedulesMySQL extends SchedulesStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (SchedulesMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_SCHEDULES,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULES],\n });\n await this.operations.createTable({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_mastra_schedules_status_next_fire`,\n table: TABLE_SCHEDULES,\n columns: ['status', 'next_fire_at'],\n },\n {\n name: `${prefix}idx_mastra_schedule_triggers_schedule_fire`,\n table: TABLE_SCHEDULE_TRIGGERS,\n columns: ['schedule_id', 'actual_fire_at DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCHEDULES,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULES],\n }),\n );\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n }),\n );\n\n for (const idx of SchedulesMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return SchedulesMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SCHEDULE_TRIGGERS });\n await this.operations.clearTable({ tableName: TABLE_SCHEDULES });\n }\n\n async createSchedule(schedule: Schedule): Promise<Schedule> {\n const existing = await this.getSchedule(schedule.id);\n if (existing) {\n throw new Error(`Schedule with id \"${schedule.id}\" already exists`);\n }\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_SCHEDULES)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('target', 'column name')}, ${quoteIdentifier('cron', 'column name')}, ${quoteIdentifier('timezone', 'column name')}, ${quoteIdentifier('status', 'column name')}, ${quoteIdentifier('next_fire_at', 'column name')}, ${quoteIdentifier('last_fire_at', 'column name')}, ${quoteIdentifier('last_run_id', 'column name')}, ${quoteIdentifier('created_at', 'column name')}, ${quoteIdentifier('updated_at', 'column name')}, ${quoteIdentifier('metadata', 'column name')}, ${quoteIdentifier('owner_type', 'column name')}, ${quoteIdentifier('owner_id', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n schedule.id,\n JSON.stringify(schedule.target),\n schedule.cron,\n schedule.timezone ?? null,\n schedule.status,\n schedule.nextFireAt,\n schedule.lastFireAt ?? null,\n schedule.lastRunId ?? null,\n schedule.createdAt,\n schedule.updatedAt,\n schedule.metadata ? JSON.stringify(schedule.metadata) : null,\n schedule.ownerType ?? null,\n schedule.ownerId ?? null,\n ],\n );\n return schedule;\n }\n\n async getSchedule(id: string): Promise<Schedule | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULES)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n const row = rows[0];\n return row ? rowToSchedule(row as Record<string, any>) : null;\n }\n\n async listSchedules(filter?: ScheduleFilter): Promise<Schedule[]> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n\n if (filter?.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(filter.status);\n }\n if (filter?.workflowId) {\n // target is JSON; MySQL JSON_EXTRACT\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('target', 'column name')}, '$.workflowId') = ?`);\n params.push(filter.workflowId);\n }\n if (filter?.ownerType !== undefined) {\n if (filter.ownerType === null) {\n conditions.push(`${quoteIdentifier('owner_type', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdentifier('owner_type', 'column name')} = ?`);\n params.push(filter.ownerType);\n }\n }\n if (filter?.ownerId !== undefined) {\n if (filter.ownerId === null) {\n conditions.push(`${quoteIdentifier('owner_id', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdentifier('owner_id', 'column name')} = ?`);\n params.push(filter.ownerId);\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULES)} ${where} ORDER BY ${quoteIdentifier('created_at', 'column name')} ASC`,\n params,\n );\n return rows.map(r => rowToSchedule(r as Record<string, any>));\n }\n\n async listDueSchedules(now: number, limit?: number): Promise<Schedule[]> {\n const cap = limit ?? 100;\n const [rows] = await this.pool.query<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULES)} WHERE ${quoteIdentifier('status', 'column name')} = ? AND ${quoteIdentifier('next_fire_at', 'column name')} <= ? ORDER BY ${quoteIdentifier('next_fire_at', 'column name')} ASC LIMIT ?`,\n ['active', String(now), cap],\n );\n return rows.map(r => rowToSchedule(r as Record<string, any>));\n }\n\n async updateSchedule(id: string, update: ScheduleUpdate): Promise<Schedule> {\n const setClauses: string[] = [];\n const params: (string | number | null)[] = [];\n\n if ('cron' in update) {\n setClauses.push(`${quoteIdentifier('cron', 'column name')} = ?`);\n params.push(update.cron as string);\n }\n if ('timezone' in update) {\n setClauses.push(`${quoteIdentifier('timezone', 'column name')} = ?`);\n params.push((update.timezone as string) ?? null);\n }\n if ('status' in update) {\n setClauses.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(update.status as string);\n }\n if ('nextFireAt' in update) {\n setClauses.push(`${quoteIdentifier('next_fire_at', 'column name')} = ?`);\n params.push(update.nextFireAt as number);\n }\n if ('metadata' in update) {\n setClauses.push(`${quoteIdentifier('metadata', 'column name')} = ?`);\n params.push(update.metadata ? JSON.stringify(update.metadata) : null);\n }\n if ('ownerType' in update) {\n setClauses.push(`${quoteIdentifier('owner_type', 'column name')} = ?`);\n params.push((update.ownerType as string) ?? null);\n }\n if ('ownerId' in update) {\n setClauses.push(`${quoteIdentifier('owner_id', 'column name')} = ?`);\n params.push((update.ownerId as string) ?? null);\n }\n\n if (setClauses.length === 0) {\n const existing = await this.getSchedule(id);\n if (!existing) throw new Error(`Schedule ${id} not found`);\n return existing;\n }\n\n setClauses.push(`${quoteIdentifier('updated_at', 'column name')} = ?`);\n params.push(Date.now());\n params.push(id);\n\n await this.pool.execute(\n `UPDATE ${formatTableName(TABLE_SCHEDULES)} SET ${setClauses.join(', ')} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n params,\n );\n\n const updated = await this.getSchedule(id);\n if (!updated) throw new Error(`Schedule ${id} not found`);\n return updated;\n }\n\n async updateScheduleNextFire(\n id: string,\n expectedNextFireAt: number,\n newNextFireAt: number,\n lastFireAt: number,\n lastRunId: string,\n newStatus?: ScheduleStatus,\n ): Promise<boolean> {\n const [result] = await this.pool.execute<ResultSetHeader>(\n `UPDATE ${formatTableName(TABLE_SCHEDULES)} SET ${quoteIdentifier('next_fire_at', 'column name')} = ?, ${quoteIdentifier('last_fire_at', 'column name')} = ?, ${quoteIdentifier('last_run_id', 'column name')} = ?, ${quoteIdentifier('updated_at', 'column name')} = ?, ${quoteIdentifier('status', 'column name')} = COALESCE(?, ${quoteIdentifier('status', 'column name')}) WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('next_fire_at', 'column name')} = ? AND ${quoteIdentifier('status', 'column name')} = ?`,\n [newNextFireAt, lastFireAt, lastRunId, Date.now(), newStatus ?? null, id, expectedNextFireAt, 'active'],\n );\n return result.affectedRows > 0;\n }\n\n async deleteSchedule(id: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SCHEDULE_TRIGGERS)} WHERE ${quoteIdentifier('schedule_id', 'column name')} = ?`,\n [id],\n );\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SCHEDULES)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n }\n\n async recordTrigger(trigger: ScheduleTrigger): Promise<void> {\n const id = trigger.id ?? globalThis.crypto.randomUUID();\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_SCHEDULE_TRIGGERS)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('schedule_id', 'column name')}, ${quoteIdentifier('run_id', 'column name')}, ${quoteIdentifier('scheduled_fire_at', 'column name')}, ${quoteIdentifier('actual_fire_at', 'column name')}, ${quoteIdentifier('outcome', 'column name')}, ${quoteIdentifier('error', 'column name')}, ${quoteIdentifier('trigger_kind', 'column name')}, ${quoteIdentifier('parent_trigger_id', 'column name')}, ${quoteIdentifier('metadata', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n trigger.scheduleId,\n trigger.runId,\n trigger.scheduledFireAt,\n trigger.actualFireAt,\n trigger.outcome,\n trigger.error ?? null,\n trigger.triggerKind ?? 'schedule-fire',\n trigger.parentTriggerId ?? null,\n trigger.metadata ? JSON.stringify(trigger.metadata) : null,\n ],\n );\n }\n\n async listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise<ScheduleTrigger[]> {\n const conditions: string[] = [`${quoteIdentifier('schedule_id', 'column name')} = ?`];\n const params: (string | number | null)[] = [scheduleId];\n\n if (opts?.fromActualFireAt != null) {\n conditions.push(`${quoteIdentifier('actual_fire_at', 'column name')} >= ?`);\n params.push(opts.fromActualFireAt);\n }\n if (opts?.toActualFireAt != null) {\n conditions.push(`${quoteIdentifier('actual_fire_at', 'column name')} < ?`);\n params.push(opts.toActualFireAt);\n }\n\n const limitClause = opts?.limit != null ? `LIMIT ${Math.floor(opts.limit)}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULE_TRIGGERS)} WHERE ${conditions.join(' AND ')} ORDER BY ${quoteIdentifier('actual_fire_at', 'column name')} DESC ${limitClause}`,\n params,\n );\n return rows.map(r => rowToTrigger(r as Record<string, any>));\n }\n}\n","import { 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 TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n ScorerDefinitionVersion,\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class ScorerDefinitionsMySQL extends ScorerDefinitionsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ScorerDefinitionsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SCORER_DEFINITIONS, schema: SCORER_DEFINITIONS_SCHEMA });\n await this.operations.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: SCORER_DEFINITION_VERSIONS_SCHEMA,\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_scorer_definition_versions_def_version`,\n table: TABLE_SCORER_DEFINITION_VERSIONS,\n columns: ['scorerDefinitionId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of ScorerDefinitionsMySQL.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n\n for (const idx of ScorerDefinitionsMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ScorerDefinitionsMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_SCORER_DEFINITIONS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseScorerRow(row: Record<string, unknown>): StorageScorerDefinitionType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): ScorerDefinitionVersion {\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: this.safeParseJSON(row.model) as ScorerDefinitionVersion['model'],\n instructions: (row.instructions as string) ?? undefined,\n scoreRange: this.safeParseJSON(row.scoreRange) as ScorerDefinitionVersion['scoreRange'],\n presetConfig: this.safeParseJSON(row.presetConfig) as ScorerDefinitionVersion['presetConfig'],\n defaultSampling: this.safeParseJSON(row.defaultSampling) as ScorerDefinitionVersion['defaultSampling'],\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCORER_DEFINITIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseScorerRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n const versionId = crypto.randomUUID();\n try {\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 } catch (versionError) {\n try {\n await this.operations.delete({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id: scorerDefinition.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback scorer definition creation:', rollbackError);\n }\n throw versionError;\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Scorer definition with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.withTransaction(async () => {\n await this.deleteVersionsByParentId(id);\n await this.operations.delete({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id } });\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n if (status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_SCORER_DEFINITIONS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams } : undefined;\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SCORER_DEFINITIONS, whereClause });\n if (total === 0) return { scorerDefinitions: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n scorerDefinitions: rows.map(row => this.parseScorerRow(row)),\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('MYSQL', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const now = new Date();\n await this.operations.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,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCORER_DEFINITION_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [scorerDefinitionId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n args: [scorerDefinitionId],\n },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n args: [scorerDefinitionId],\n };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SCORER_DEFINITION_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_SCORER_DEFINITION_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SCORER_DEFINITION_VERSIONS)} WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n args: [scorerDefinitionId],\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n ScoresStorage,\n SCORERS_SCHEMA,\n TABLE_SCHEMAS,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination, CreateIndexOptions, ScoreTenancyFilters } from '@mastra/core/storage';\nimport type { Pool } from 'mysql2/promise';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { parseDateTime, quoteIdentifier } from '../utils';\n\ntype SaveScoreInput = Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>;\ntype ListScoresResult = { pagination: PaginationInfo; scores: ScoreRowData[] };\n\ninterface ScoreRow {\n id: string;\n scorerId: string;\n traceId: string | null;\n spanId: string | null;\n runId: string;\n score: number;\n reason: string | null;\n metadata: string | null;\n preprocessStepResult: string | null;\n extractStepResult: string | null;\n analyzeStepResult: string | null;\n preprocessPrompt: string | null;\n extractPrompt: string | null;\n generateScorePrompt: string | null;\n generateReasonPrompt: string | null;\n analyzePrompt: string | null;\n reasonPrompt: string | null;\n scorer: string | null;\n input: string | null;\n output: string | null;\n additionalContext: string | null;\n requestContext: string | null;\n entityType: string | null;\n entity: string | null;\n entityId: string | null;\n source: string | null;\n resourceId: string | null;\n organizationId: string | null;\n projectId: string | null;\n batchId: string | null;\n datasetId: string | null;\n datasetItemId: string | null;\n threadId: string | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\nfunction parseJSON<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n }\n if (typeof value === 'object') {\n return value as T;\n }\n return undefined;\n}\n\nexport class ScoresMySQL extends ScoresStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORERS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ScoresMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SCORERS, schema: SCORERS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_SCORERS,\n schema: SCORERS_SCHEMA,\n ifNotExists: ['spanId', 'requestContext', 'organizationId', 'projectId', 'batchId', 'datasetId', 'datasetItemId'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_scores_trace_id_span_id_created_at_idx`,\n table: TABLE_SCORERS,\n columns: ['traceId', 'spanId', 'createdAt DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCORERS,\n schema: TABLE_SCHEMAS[TABLE_SCORERS],\n }),\n );\n\n for (const idx of ScoresMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ScoresMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${TABLE_SCORERS}`);\n }\n\n private mapScore(row: ScoreRow): ScoreRowData {\n const mapped = {\n id: row.id,\n scorerId: row.scorerId,\n traceId: row.traceId ?? undefined,\n spanId: row.spanId ?? undefined,\n runId: row.runId,\n score: row.score,\n reason: row.reason ?? undefined,\n metadata: parseJSON<Record<string, unknown>>(row.metadata),\n preprocessStepResult: parseJSON<Record<string, unknown>>(row.preprocessStepResult),\n extractStepResult: parseJSON<Record<string, unknown>>(row.extractStepResult),\n analyzeStepResult: parseJSON<Record<string, unknown>>(row.analyzeStepResult),\n preprocessPrompt: row.preprocessPrompt ?? undefined,\n extractPrompt: row.extractPrompt ?? undefined,\n generateScorePrompt: row.generateScorePrompt ?? undefined,\n generateReasonPrompt: row.generateReasonPrompt ?? undefined,\n analyzePrompt: row.analyzePrompt ?? undefined,\n reasonPrompt: row.reasonPrompt ?? undefined,\n scorer: parseJSON<Record<string, unknown>>(row.scorer) as ScoreRowData['scorer'],\n input: parseJSON<any>(row.input) ?? undefined,\n output: parseJSON<Record<string, unknown>>(row.output),\n additionalContext: parseJSON<Record<string, unknown>>(row.additionalContext),\n requestContext: parseJSON<Record<string, unknown>>(row.requestContext) ?? undefined,\n // entityType is required by the ScoreRowData type but may be null in DB; keep as-is and cast below\n entityType: (row.entityType ?? undefined) as any,\n entity: parseJSON<Record<string, unknown>>(row.entity),\n entityId: row.entityId ?? undefined,\n source: (row.source ?? undefined) as ScoreRowData['source'],\n resourceId: row.resourceId ?? undefined,\n organizationId: row.organizationId ?? undefined,\n projectId: row.projectId ?? undefined,\n batchId: row.batchId ?? undefined,\n datasetId: row.datasetId ?? undefined,\n datasetItemId: row.datasetItemId ?? undefined,\n threadId: row.threadId ?? undefined,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n return mapped as ScoreRowData;\n }\n\n private serializeScore(score: SaveScoreInput, id: string, createdAt: Date, updatedAt: Date): Record<string, any> {\n const toJson = (value: unknown): string | null => (value === undefined ? null : JSON.stringify(value));\n\n return {\n id,\n scorerId: score.scorerId,\n traceId: score.traceId ?? null,\n spanId: score.spanId ?? null,\n runId: score.runId,\n score: score.score,\n reason: score.reason ?? null,\n metadata: toJson(score.metadata),\n preprocessStepResult: toJson(score.preprocessStepResult),\n extractStepResult: toJson(score.extractStepResult),\n analyzeStepResult: toJson(score.analyzeStepResult),\n preprocessPrompt: score.preprocessPrompt ?? null,\n extractPrompt: score.extractPrompt ?? null,\n generateScorePrompt: score.generateScorePrompt ?? null,\n generateReasonPrompt: score.generateReasonPrompt ?? null,\n analyzePrompt: score.analyzePrompt ?? null,\n reasonPrompt: score.reasonPrompt ?? null,\n scorer: toJson(score.scorer),\n input: toJson(score.input),\n output: toJson(score.output),\n additionalContext: toJson(score.additionalContext),\n requestContext: toJson(score.requestContext),\n entityType: score.entityType ?? null,\n entity: toJson(score.entity),\n entityId: score.entityId ?? null,\n resourceId: score.resourceId ?? null,\n organizationId: score.organizationId ?? null,\n projectId: score.projectId ?? null,\n batchId: score.batchId ?? null,\n datasetId: score.datasetId ?? null,\n datasetItemId: score.datasetItemId ?? null,\n threadId: score.threadId ?? null,\n source: score.source ?? null,\n createdAt,\n updatedAt,\n };\n }\n\n async saveScore(score: SaveScoreInput): Promise<{ score: ScoreRowData }> {\n try {\n // Caller-supplied ids give scores a stable identity: operations.insert\n // is INSERT ... ON DUPLICATE KEY UPDATE, so retried writes for the same\n // id converge on one row (latest wins).\n const id = (score as { id?: string }).id ?? crypto.randomUUID();\n const now = new Date();\n\n await this.operations.insert({\n tableName: TABLE_SCORERS,\n record: this.serializeScore(score, id, now, now),\n });\n return { score: { ...score, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_SCORES_SAVE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const row = await this.operations.load<ScoreRow>({ tableName: TABLE_SCORERS, keys: { id } });\n return row ? this.mapScore(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_SCORES_GET_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n private async fetchScores(\n whereClause: { sql: string; args: any[] },\n pagination: StoragePagination,\n ): Promise<ListScoresResult> {\n const { page = 0, perPage: perPageInput } = pagination;\n const perPageNormalized = normalizePerPage(perPageInput, 50);\n const { offset, perPage } = calculatePagination(page, perPageInput, perPageNormalized);\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SCORERS, whereClause });\n if (total === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage, hasMore: false },\n };\n }\n\n const limitValue = perPageInput === false ? total : perPageNormalized;\n\n const rows = await this.operations.loadMany<ScoreRow>({\n tableName: TABLE_SCORERS,\n whereClause,\n orderBy: `${quoteIdentifier('createdAt', 'column name')} DESC`,\n offset,\n limit: limitValue,\n });\n\n const scores = rows.map(row => this.mapScore(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage,\n hasMore: perPageInput === false ? false : offset + scores.length < total,\n },\n };\n }\n\n private buildWhereClause(filters: Record<string, string | undefined>): { sql: string; args: any[] } {\n const conditions: string[] = [];\n const args: any[] = [];\n for (const [column, value] of Object.entries(filters)) {\n if (value !== undefined) {\n conditions.push(`${quoteIdentifier(column, 'column name')} = ?`);\n args.push(value);\n }\n }\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n }\n\n async getScoresByScorerId(args: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresByScorerId(args);\n }\n\n async getScoresByRunId(args: {\n runId: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresByRunId(args);\n }\n\n async getScoresByEntityId(args: {\n entityId: string;\n entityType: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresByEntityId(args);\n }\n\n async getScoresBySpan(args: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresBySpan(args);\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n filters,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n scorerId,\n entityId,\n entityType,\n source,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n entityId,\n entityType,\n source,\n filters,\n }: {\n runId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n runId,\n entityId,\n entityType,\n source,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n filters,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n traceId,\n spanId,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n\n async listScoresByEntityId({\n entityId,\n pagination,\n entityType,\n source,\n filters,\n }: {\n entityId: string;\n pagination: StoragePagination;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n entityId,\n entityType,\n source,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n SkillsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n TABLE_FAVORITES,\n TABLE_SCHEMAS,\n SKILLS_SCHEMA,\n SKILL_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 { skillSnapshotFieldValuesEqual } from '@mastra/core/storage/domains/skills';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'instructions',\n 'license',\n 'compatibility',\n 'source',\n 'references',\n 'scripts',\n 'assets',\n 'files',\n 'metadata',\n 'tree',\n] as const;\n\nexport class SkillsMySQL extends SkillsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SKILLS, TABLE_SKILL_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the skills domain tables.\n * Currently no default indexes are defined for skills.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_SKILLS, schema: TABLE_SCHEMAS[TABLE_SKILLS] }),\n generateTableSQL({ tableName: TABLE_SKILL_VERSIONS, schema: TABLE_SCHEMAS[TABLE_SKILL_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (SkillsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the skills domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return SkillsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for skills.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for skills domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SKILLS, schema: SKILLS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_SKILL_VERSIONS, schema: SKILL_VERSIONS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_SKILLS,\n schema: SKILLS_SCHEMA,\n ifNotExists: ['visibility', 'favoriteCount'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SKILL_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_SKILLS });\n }\n\n private safeParseJSON(val: unknown): any {\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 private 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 visibility: (row.visibility as StorageSkillType['visibility']) ?? undefined,\n favoriteCount: row.favoriteCount === null || row.favoriteCount === undefined ? 0 : Number(row.favoriteCount),\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): SkillVersion {\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: this.safeParseJSON(row.compatibility) as SkillVersion['compatibility'],\n source: this.safeParseJSON(row.source) as SkillVersion['source'],\n references: this.safeParseJSON(row.references) as SkillVersion['references'],\n scripts: this.safeParseJSON(row.scripts) as SkillVersion['scripts'],\n assets: this.safeParseJSON(row.assets) as SkillVersion['assets'],\n files: this.safeParseJSON(row.files) as SkillVersion['files'],\n metadata: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n tree: this.safeParseJSON(row.tree) as SkillVersion['tree'],\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageSkillType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILLS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseSkillRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n await this.operations.insert({\n tableName: TABLE_SKILLS,\n record: {\n id: skill.id,\n status: 'draft',\n activeVersionId: null,\n authorId: skill.authorId ?? null,\n visibility: visibility ?? null,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, visibility: _visibility, ...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 await this.operations.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 visibility,\n favoriteCount: 0,\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('MYSQL', '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('MYSQL', '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 const { authorId, visibility, activeVersionId, status, ...configFields } = updates;\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (authorId !== undefined) updateData.authorId = authorId;\n if (visibility !== undefined) updateData.visibility = visibility;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) updateData.status = 'published';\n }\n if (status !== undefined) updateData.status = status;\n\n await this.operations.update({ tableName: TABLE_SKILLS, keys: { id }, data: updateData });\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 const {\n id: _versionId,\n skillId: _skillId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n !skillSnapshotFieldValuesEqual(\n configFields[field as keyof typeof configFields],\n latestConfig[field as keyof typeof latestConfig],\n ),\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 const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.delete({ tableName: TABLE_SKILLS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n status,\n visibility,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'LIST_SKILLS', '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 // Empty entityIds is short-circuit: no rows possible\n if (entityIds && entityIds.length === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const skillsTable = formatTableName(TABLE_SKILLS);\n const favoritesTable = formatTableName(TABLE_FAVORITES);\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 0;\n\n // Determine if we need a JOIN\n const joinUserId = pinFavoritedFor;\n const useJoin = Boolean(joinUserId);\n let joinUserIdParamIdx: number | null = null;\n if (useJoin) {\n joinUserIdParamIdx = paramIdx++;\n }\n\n if (status) {\n conditions.push(`s.${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n paramIdx++;\n }\n\n if (authorId !== undefined) {\n conditions.push(`s.${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\n paramIdx++;\n }\n\n if (visibility !== undefined) {\n conditions.push(`s.${quoteIdentifier('visibility', 'column name')} = ?`);\n queryParams.push(visibility);\n paramIdx++;\n }\n\n if (entityIds && entityIds.length > 0) {\n const placeholders = entityIds.map(() => '?').join(', ');\n conditions.push(`s.${quoteIdentifier('id', 'column name')} IN (${placeholders})`);\n queryParams.push(...entityIds);\n paramIdx += entityIds.length;\n }\n\n // Handle favoritedOnly\n if (useJoin && favoritedOnly) {\n conditions.push(`sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL`);\n } else if (favoritedOnly) {\n // Defensive: favoritedOnly with no userId can never match a real row\n conditions.push('1=0');\n }\n\n const joinClause =\n useJoin && joinUserIdParamIdx !== null\n ? `LEFT JOIN ${favoritesTable} sr ON sr.${quoteIdentifier('entityType', 'column name')} = 'skill' AND sr.${quoteIdentifier('entityId', 'column name')} = s.${quoteIdentifier('id', 'column name')} AND sr.${quoteIdentifier('userId', 'column name')} = ?`\n : '';\n\n const joinParams: any[] = useJoin && joinUserId ? [joinUserId] : [];\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const [countRows] = await this.pool.query<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${skillsTable} s ${joinClause} ${whereClause}`,\n [...joinParams, ...queryParams],\n );\n const total = parseInt(countRows[0]?.count ?? '0', 10);\n\n if (total === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const hasMore = perPageInput === false ? false : offset + perPage < total;\n\n // Build ORDER BY\n let orderByClause: string;\n if (useJoin) {\n // Pin favorited skills first\n orderByClause = `CASE WHEN sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL THEN 0 ELSE 1 END ASC, s.${quoteIdentifier(field, 'column name')} ${direction}`;\n } else {\n orderByClause = `s.${quoteIdentifier(field, 'column name')} ${direction}`;\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>(\n `SELECT s.* FROM ${skillsTable} s ${joinClause} ${whereClause} ORDER BY ${orderByClause} LIMIT ? OFFSET ?`,\n [...joinParams, ...queryParams, limitValue, offset],\n );\n\n return {\n skills: rows.map(row => this.parseSkillRow(row)),\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'LIST_SKILLS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n try {\n const now = new Date();\n await this.operations.insert({\n tableName: TABLE_SKILL_VERSIONS,\n record: {\n id: input.id,\n skillId: input.skillId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n license: input.license ?? null,\n compatibility: input.compatibility ?? null,\n source: input.source ?? null,\n references: input.references ?? null,\n scripts: input.scripts ?? null,\n assets: input.assets ?? null,\n files: input.files ?? null,\n metadata: input.metadata ?? null,\n tree: input.tree ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILL_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [skillId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ?`, args: [skillId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ?`, args: [skillId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SKILL_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_SKILL_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SKILL_VERSIONS)} WHERE ${quoteIdentifier('skillId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ?`, args: [skillId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ToolProviderConnectionsStorage,\n createStorageErrorId,\n TABLE_TOOL_PROVIDER_CONNECTIONS,\n TABLE_SCHEMAS,\n TOOL_PROVIDER_CONNECTIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageDeleteToolProviderConnectionInput,\n StorageListToolProviderConnectionsInput,\n StorageToolProviderConnection,\n StorageToolProviderConnectionKey,\n StorageToolProviderConnectionScope,\n StorageUpsertToolProviderConnectionInput,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformToSqlValue, parseDateTime } from '../utils';\n\nfunction normaliseScope(raw: unknown): StorageToolProviderConnectionScope {\n const value = raw == null ? 'per-author' : String(raw);\n if (value === 'shared') return 'shared';\n if (value === 'caller-supplied') return 'caller-supplied';\n return 'per-author';\n}\n\nfunction rowToToolProviderConnection(row: Record<string, unknown>): StorageToolProviderConnection {\n return {\n authorId: String(row.authorId),\n providerId: String(row.providerId),\n toolkit: String(row.toolkit),\n connectionId: String(row.connectionId),\n label: row.label == null ? null : String(row.label),\n scope: normaliseScope(row.scope),\n createdAt: parseDateTime(row.createdAt as string | number | Date | null | undefined) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt as string | number | Date | null | undefined) ?? new Date(),\n };\n}\n\nexport class ToolProviderConnectionsMySQL extends ToolProviderConnectionsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_TOOL_PROVIDER_CONNECTIONS] as const;\n\n /**\n * Returns default index definitions for the tool-provider-connections domain tables.\n * Currently no default indexes are defined for tool-provider-connections.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n schema: TABLE_SCHEMAS[TABLE_TOOL_PROVIDER_CONNECTIONS],\n compositePrimaryKey: ['authorId', 'providerId', 'connectionId'],\n }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ToolProviderConnectionsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /**\n * Returns default index definitions for the tool-provider-connections domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ToolProviderConnectionsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for tool-provider-connections.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for tool-provider-connections domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n schema: TOOL_PROVIDER_CONNECTIONS_SCHEMA,\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_TOOL_PROVIDER_CONNECTIONS });\n }\n\n async getConnectionById({\n authorId,\n providerId,\n connectionId,\n }: StorageToolProviderConnectionKey): Promise<StorageToolProviderConnection | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ? LIMIT 1`,\n [authorId, providerId, connectionId],\n );\n return rows.length ? rowToToolProviderConnection(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_GET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId, providerId, connectionId },\n },\n error,\n );\n }\n }\n\n async upsertConnection(input: StorageUpsertToolProviderConnectionInput): Promise<StorageToolProviderConnection> {\n const { authorId, providerId, toolkit, connectionId, label } = input;\n const now = new Date();\n const labelValue = label == null ? null : label;\n\n try {\n return await this.operations.withTransaction(async connection => {\n const [existing] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('scope', 'column name')} FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ? LIMIT 1`,\n [authorId, providerId, connectionId],\n );\n\n const existingRow = existing[0];\n const createdAt = existingRow ? existingRow.createdAt : now;\n const existingScope = existingRow && existingRow.scope != null ? normaliseScope(existingRow.scope) : undefined;\n const scope: StorageToolProviderConnectionScope = input.scope ?? existingScope ?? 'per-author';\n\n if (existingRow) {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} SET ${quoteIdentifier('toolkit', 'column name')} = ?, ${quoteIdentifier('label', 'column name')} = ?, ${quoteIdentifier('scope', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ?`,\n [toolkit, labelValue, scope, transformToSqlValue(now), authorId, providerId, connectionId],\n );\n } else {\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} (${quoteIdentifier('authorId', 'column name')}, ${quoteIdentifier('providerId', 'column name')}, ${quoteIdentifier('toolkit', 'column name')}, ${quoteIdentifier('connectionId', 'column name')}, ${quoteIdentifier('label', 'column name')}, ${quoteIdentifier('scope', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n authorId,\n providerId,\n toolkit,\n connectionId,\n labelValue,\n scope,\n transformToSqlValue(createdAt),\n transformToSqlValue(now),\n ],\n );\n }\n\n return {\n authorId,\n providerId,\n toolkit,\n connectionId,\n label: labelValue,\n scope,\n createdAt: parseDateTime(createdAt) ?? now,\n updatedAt: now,\n };\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId, providerId, connectionId },\n },\n error,\n );\n }\n }\n\n async listConnectionsByAuthor({\n authorId,\n providerId,\n toolkit,\n scope,\n }: StorageListToolProviderConnectionsInput): Promise<StorageToolProviderConnection[]> {\n try {\n const clauses: string[] = [];\n const args: (string | number | null)[] = [];\n if (authorId !== undefined) {\n clauses.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n args.push(authorId);\n }\n if (providerId) {\n clauses.push(`${quoteIdentifier('providerId', 'column name')} = ?`);\n args.push(providerId);\n }\n if (toolkit) {\n clauses.push(`${quoteIdentifier('toolkit', 'column name')} = ?`);\n args.push(toolkit);\n }\n if (scope) {\n clauses.push(`${quoteIdentifier('scope', 'column name')} = ?`);\n args.push(scope);\n }\n const whereClause = clauses.length > 0 ? ` WHERE ${clauses.join(' AND ')}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)}${whereClause}`,\n args,\n );\n return rows.map(row => rowToToolProviderConnection(row as Record<string, unknown>));\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_LIST', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId: authorId ?? '', providerId: providerId ?? '', toolkit: toolkit ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteConnection({\n authorId,\n providerId,\n connectionId,\n }: StorageDeleteToolProviderConnectionInput): Promise<void> {\n try {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ?`,\n [authorId, providerId, connectionId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId, providerId, connectionId },\n },\n error,\n );\n }\n }\n}\n","import {\n TABLE_WORKFLOW_DEFINITIONS,\n WORKFLOW_DEFINITIONS_SCHEMA,\n WorkflowDefinitionsStorage,\n} from '@mastra/core/storage';\nimport type {\n CreateWorkflowDefinitionInput,\n ListWorkflowDefinitionsInput,\n ListWorkflowDefinitionsOutput,\n UpdateWorkflowDefinitionInput,\n WorkflowDefinition,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformFromSqlRow } from '../utils';\n\nfunction rowToDefinition(row: Record<string, unknown>): WorkflowDefinition {\n const transformed = transformFromSqlRow<Record<string, unknown>>({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n sqlRow: row,\n });\n const def: WorkflowDefinition = {\n id: String(transformed.id),\n inputSchema: transformed.inputSchema,\n outputSchema: transformed.outputSchema,\n graph: transformed.graph as WorkflowDefinition['graph'],\n status: String(transformed.status) as WorkflowDefinition['status'],\n source: String(transformed.source) as WorkflowDefinition['source'],\n createdAt: transformed.createdAt as Date,\n updatedAt: transformed.updatedAt as Date,\n };\n if (transformed.description != null) def.description = String(transformed.description);\n if (transformed.metadata != null) def.metadata = transformed.metadata as Record<string, unknown>;\n if (transformed.stateSchema != null) def.stateSchema = transformed.stateSchema;\n if (transformed.requestContextSchema != null) def.requestContextSchema = transformed.requestContextSchema;\n if (transformed.schedule != null) def.schedule = transformed.schedule as WorkflowDefinition['schedule'];\n if (transformed.authorId != null) def.authorId = String(transformed.authorId);\n return def;\n}\n\nexport class WorkflowDefinitionsMySQL extends WorkflowDefinitionsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n private database?: string;\n\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_DEFINITIONS] as const;\n\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n schema: WORKFLOW_DEFINITIONS_SCHEMA,\n }),\n ];\n }\n\n constructor({ pool, operations, database }: { pool: Pool; operations: StoreOperationsMySQL; database?: string }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.database = database;\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n schema: WORKFLOW_DEFINITIONS_SCHEMA,\n });\n await this.operations.alterTable({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n schema: WORKFLOW_DEFINITIONS_SCHEMA,\n ifNotExists: ['schedule'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_WORKFLOW_DEFINITIONS });\n }\n\n async upsert(input: CreateWorkflowDefinitionInput | UpdateWorkflowDefinitionInput): Promise<WorkflowDefinition> {\n const now = new Date();\n const existing = await this.get(input.id);\n\n if (!existing) {\n if (!('inputSchema' in input) || input.inputSchema === undefined)\n throw new Error(`Cannot create workflow definition \"${input.id}\": inputSchema is required.`);\n if (!('outputSchema' in input) || input.outputSchema === undefined)\n throw new Error(`Cannot create workflow definition \"${input.id}\": outputSchema is required.`);\n if (!('graph' in input) || input.graph === undefined)\n throw new Error(`Cannot create workflow definition \"${input.id}\": graph is required.`);\n\n const record: Record<string, any> = {\n id: input.id,\n description: input.description ?? null,\n metadata: input.metadata ?? null,\n inputSchema: input.inputSchema,\n outputSchema: input.outputSchema,\n stateSchema: input.stateSchema ?? null,\n requestContextSchema: input.requestContextSchema ?? null,\n graph: input.graph,\n schedule: 'schedule' in input ? (input.schedule ?? null) : null,\n status: 'active',\n source: 'storage',\n authorId: 'authorId' in input ? (input.authorId ?? null) : null,\n createdAt: now,\n updatedAt: now,\n };\n try {\n // insertOnly: a plain INSERT so a concurrent create is detected as a\n // duplicate-key error instead of ON DUPLICATE KEY UPDATE silently\n // clobbering the winning row (and its createdAt).\n await this.operations.insertOnly({ tableName: TABLE_WORKFLOW_DEFINITIONS, record });\n } catch (error) {\n // A concurrent upsert may have created the row after our existence\n // check; fall back to updating it so the upsert stays idempotent.\n if (!(await this.get(input.id))) throw error;\n return this.applyUpdate(input, now);\n }\n const created = await this.get(input.id);\n if (!created) throw new Error(`Failed to persist workflow definition \"${input.id}\".`);\n return created;\n }\n\n return this.applyUpdate(input, now);\n }\n\n private async applyUpdate(\n input: CreateWorkflowDefinitionInput | UpdateWorkflowDefinitionInput,\n now: Date,\n ): Promise<WorkflowDefinition> {\n const data: Record<string, any> = { updatedAt: now };\n if ('description' in input && input.description !== undefined) data.description = input.description;\n if ('metadata' in input && input.metadata !== undefined) data.metadata = input.metadata;\n if ('inputSchema' in input && input.inputSchema !== undefined) data.inputSchema = input.inputSchema;\n if ('outputSchema' in input && input.outputSchema !== undefined) data.outputSchema = input.outputSchema;\n if ('stateSchema' in input && input.stateSchema !== undefined) data.stateSchema = input.stateSchema;\n if ('requestContextSchema' in input && input.requestContextSchema !== undefined)\n data.requestContextSchema = input.requestContextSchema;\n if ('graph' in input && input.graph !== undefined) data.graph = input.graph;\n if ('schedule' in input && input.schedule !== undefined) data.schedule = input.schedule;\n if ('status' in input && input.status !== undefined) data.status = input.status;\n if ('authorId' in input && input.authorId !== undefined) data.authorId = input.authorId;\n\n await this.operations.update({ tableName: TABLE_WORKFLOW_DEFINITIONS, keys: { id: input.id }, data });\n const updated = await this.get(input.id);\n if (!updated) throw new Error(`Failed to update workflow definition \"${input.id}\".`);\n return updated;\n }\n\n async get(id: string): Promise<WorkflowDefinition | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKFLOW_DEFINITIONS, this.database)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n if (!rows.length) return null;\n return rowToDefinition(rows[0] as Record<string, unknown>);\n }\n\n async list(args?: ListWorkflowDefinitionsInput): Promise<ListWorkflowDefinitionsOutput> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n if (args?.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(args.status);\n }\n if (args?.authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n params.push(args.authorId);\n }\n const where = conditions.length ? ` WHERE ${conditions.join(' AND ')}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKFLOW_DEFINITIONS, this.database)}${where} ORDER BY ${quoteIdentifier('updatedAt', 'column name')} DESC`,\n params,\n );\n const definitions = rows.map(row => rowToDefinition(row as Record<string, unknown>));\n return { definitions, total: definitions.length };\n }\n\n async delete(id: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_WORKFLOW_DEFINITIONS, this.database)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n TABLE_WORKFLOW_RUN_OWNERS,\n RUN_FENCING_TABLE_SCHEMAS,\n WorkflowsStorage,\n createStorageErrorId,\n normalizePerPage,\n matchesExpectedWorkflowStatus,\n matchesRunFence,\n isRunFenceConflictError,\n resolveRunFence,\n executeRetentionPrune,\n resolveRetentionTargets,\n retentionCutoffMs,\n} from '@mastra/core/storage';\nimport type {\n ClaimRunOwnershipInput,\n ClaimRunOwnershipResult,\n CreateIndexOptions,\n RenewRunOwnershipInput,\n RenewRunOwnershipResult,\n RunFence,\n RunOwnershipRecord,\n StorageListWorkflowRunsInput,\n TABLE_NAMES,\n UpdateWorkflowStateOptions,\n WorkflowRun,\n WorkflowRuns,\n PruneOptions,\n PruneResult,\n RetentionTablesDescriptor,\n TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { Pool, ResultSetHeader, RowDataPacket } from 'mysql2/promise';\nimport { assertRunFence, claimTransaction, DB_NOW_MS, inTransaction, withRunFence } from '../../db/run-fencing';\nimport type { Queryable } from '../../db/run-fencing';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier, transformToSqlValue } from '../utils';\n\ninterface WorkflowRow {\n workflow_name: string;\n run_id: string;\n resourceId: string | null;\n snapshot: string | WorkflowRunState;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\nfunction parseSnapshot(snapshot: string | WorkflowRunState): WorkflowRunState | string {\n if (typeof snapshot === 'string') {\n try {\n return JSON.parse(snapshot) as WorkflowRunState;\n } catch {\n return snapshot;\n }\n }\n return snapshot;\n}\n\nconst RUN_OWNERS_TABLE = formatTableName(TABLE_WORKFLOW_RUN_OWNERS as TABLE_NAMES);\nconst RUN_ID = quoteIdentifier('runId', 'column name');\nconst OWNER_ID = quoteIdentifier('ownerId', 'column name');\nconst LEASE_EXPIRES_AT = quoteIdentifier('leaseExpiresAt', 'column name');\nconst UPDATED_AT = quoteIdentifier('updatedAt', 'column name');\nconst RUN_OWNER_COLUMNS = `generation, ${OWNER_ID} AS ownerId, ${LEASE_EXPIRES_AT} AS leaseExpiresAt, ${DB_NOW_MS} AS nowMs`;\n\nfunction toRunOwnershipRecord(runId: string, row: RowDataPacket): RunOwnershipRecord {\n const leaseExpiresAt = row.leaseExpiresAt === null ? null : Number(row.leaseExpiresAt);\n return {\n runId,\n generation: Number(row.generation),\n ownerId: String(row.ownerId),\n leaseExpiresAt: leaseExpiresAt === null ? null : new Date(leaseExpiresAt),\n live: leaseExpiresAt !== null && leaseExpiresAt > Number(row.nowMs),\n };\n}\n\nasync function readRunOwner(q: Queryable, runId: string): Promise<RunOwnershipRecord | null> {\n const [rows] = await q.execute<RowDataPacket[]>(\n `SELECT ${RUN_OWNER_COLUMNS} FROM ${RUN_OWNERS_TABLE} WHERE ${RUN_ID} = ?`,\n [runId],\n );\n return rows[0] ? toRunOwnershipRecord(runId, rows[0]) : null;\n}\n\nfunction mapWorkflowRow(row: WorkflowRow): WorkflowRun {\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n resourceId: row.resourceId ?? undefined,\n snapshot: parseSnapshot(row.snapshot),\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n}\n\nexport class WorkflowsMySQL extends WorkflowsStorage {\n private operations: StoreOperationsMySQL;\n private pool: Pool;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_SNAPSHOT] as const;\n\n /**\n * Tables `prune()` can clean up. Run ownership rows anchor on `updatedAt` (epoch ms), which every\n * claim, renewal and release refreshes, so a live execution's row is never\n * older than its renew interval.\n */\n static override readonly retentionTables: RetentionTablesDescriptor = {\n runOwnership: { table: TABLE_WORKFLOW_RUN_OWNERS, column: 'updatedAt', indexed: false, anchorType: 'epoch-ms' },\n };\n\n /**\n * Returns default index definitions for the workflows domain tables.\n * Currently no default indexes are defined for workflows.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n compositePrimaryKey: ['workflow_name', 'run_id'],\n }),\n generateTableSQL({\n tableName: TABLE_WORKFLOW_RUN_OWNERS as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_WORKFLOW_RUN_OWNERS],\n }),\n ];\n }\n\n constructor({\n operations,\n pool,\n skipDefaultIndexes,\n indexes,\n }: {\n operations: StoreOperationsMySQL;\n pool: Pool;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.operations = operations;\n this.pool = pool;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (WorkflowsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n supportsConcurrentUpdates(): boolean {\n return true;\n }\n\n /**\n * Returns default index definitions for the workflows domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return WorkflowsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for workflows.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for workflows domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.operations.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n await this.operations.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n await this.operations.createTable({\n tableName: TABLE_WORKFLOW_RUN_OWNERS as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_WORKFLOW_RUN_OWNERS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n const targets = resolveRetentionTargets({\n policies,\n descriptor: WorkflowsMySQL.retentionTables,\n order: ['runOwnership'],\n });\n return executeRetentionPrune({\n domain: 'workflows',\n targets,\n options,\n cutoffFor: (target, now) => retentionCutoffMs(target.policy, now),\n deleteBatch: (target, cutoff, limit) =>\n this.operations.pruneBatch({ tableName: target.table as TABLE_NAMES, column: target.column, cutoff, limit }),\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)}`);\n await this.pool.execute(`DELETE FROM ${RUN_OWNERS_TABLE}`);\n }\n\n supportsRunFencing(): boolean {\n return true;\n }\n\n #ownershipError(operation: string, runId: string, error: unknown): MastraError {\n return new MastraError(\n {\n id: createStorageErrorId('MYSQL', operation, 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\n },\n error,\n );\n }\n\n async claimRunOwnership({\n runId,\n ownerId,\n leaseMs,\n force,\n expectedGeneration,\n }: ClaimRunOwnershipInput): Promise<ClaimRunOwnershipResult> {\n try {\n return await claimTransaction(this.pool, async connection => {\n const [existing] = await connection.execute<RowDataPacket[]>(\n `SELECT generation FROM ${RUN_OWNERS_TABLE} WHERE ${RUN_ID} = ? FOR UPDATE`,\n [runId],\n );\n if (existing.length === 0) {\n if (expectedGeneration !== undefined && expectedGeneration !== 0) {\n return { acquired: false, record: null };\n }\n // A run's first generation is the database clock, so a run claimed\n // again after its record was pruned still gets a higher generation.\n await connection.execute(\n `INSERT INTO ${RUN_OWNERS_TABLE} (${RUN_ID}, generation, ${OWNER_ID}, ${LEASE_EXPIRES_AT}, ${UPDATED_AT})\n VALUES (?, GREATEST(1, ${DB_NOW_MS}), ?, ${DB_NOW_MS} + ?, ${DB_NOW_MS})`,\n [runId, ownerId, leaseMs],\n );\n return { acquired: true, record: (await readRunOwner(connection, runId))! };\n }\n // The row lock is held from the statement above, so the lease check in\n // this statement reads the database clock after any wait for it.\n await connection.execute(\n `UPDATE ${RUN_OWNERS_TABLE}\n SET generation = generation + 1, ${OWNER_ID} = ?, ${LEASE_EXPIRES_AT} = ${DB_NOW_MS} + ?,\n ${UPDATED_AT} = ${DB_NOW_MS}\n WHERE ${RUN_ID} = ?\n AND (? IS NULL OR generation = ?)\n AND (? OR ${LEASE_EXPIRES_AT} IS NULL OR ${LEASE_EXPIRES_AT} <= ${DB_NOW_MS})`,\n [ownerId, leaseMs, runId, expectedGeneration ?? null, expectedGeneration ?? null, force === true],\n );\n const record = await readRunOwner(connection, runId);\n // Comparing generations under the held row lock, rather than counting\n // affected rows, keeps the answer independent of the FOUND_ROWS flag.\n return record && record.generation === Number(existing[0]!.generation) + 1\n ? { acquired: true, record }\n : { acquired: false, record };\n });\n } catch (error) {\n throw this.#ownershipError('CLAIM_RUN_OWNERSHIP', runId, error);\n }\n }\n\n async renewRunOwnership({ leaseMs, ...fence }: RenewRunOwnershipInput): Promise<RenewRunOwnershipResult> {\n try {\n return await inTransaction(this.pool, async connection => {\n await connection.execute(\n `UPDATE ${RUN_OWNERS_TABLE}\n SET ${LEASE_EXPIRES_AT} = ${DB_NOW_MS} + ?, ${UPDATED_AT} = ${DB_NOW_MS}\n WHERE ${RUN_ID} = ? AND generation = ? AND ${OWNER_ID} = ? AND ${LEASE_EXPIRES_AT} IS NOT NULL`,\n [leaseMs, fence.runId, fence.generation, fence.ownerId],\n );\n const record = await readRunOwner(connection, fence.runId);\n return record && matchesRunFence(record, fence) && record.leaseExpiresAt !== null\n ? { renewed: true, record }\n : { renewed: false, record };\n });\n } catch (error) {\n throw this.#ownershipError('RENEW_RUN_OWNERSHIP', fence.runId, error);\n }\n }\n\n async releaseRunOwnership(fence: RunFence): Promise<boolean> {\n try {\n return await inTransaction(this.pool, async connection => {\n await connection.execute(\n `UPDATE ${RUN_OWNERS_TABLE} SET ${LEASE_EXPIRES_AT} = NULL, ${UPDATED_AT} = ${DB_NOW_MS}\n WHERE ${RUN_ID} = ? AND generation = ? AND ${OWNER_ID} = ?`,\n [fence.runId, fence.generation, fence.ownerId],\n );\n return matchesRunFence(await readRunOwner(connection, fence.runId), fence);\n });\n } catch (error) {\n throw this.#ownershipError('RELEASE_RUN_OWNERSHIP', fence.runId, error);\n }\n }\n\n async getRunOwnership({ runId }: { runId: string }): Promise<RunOwnershipRecord | null> {\n try {\n return await readRunOwner(this.pool, runId);\n } catch (error) {\n throw this.#ownershipError('GET_RUN_OWNERSHIP', runId, error);\n }\n }\n\n async deleteWorkflowRunById({\n runId,\n workflowName,\n fence,\n }: {\n runId: string;\n workflowName: string;\n fence?: RunFence;\n }): Promise<void> {\n try {\n await withRunFence(this.pool, RUN_OWNERS_TABLE, resolveRunFence(this, fence, runId), 'deleteWorkflowRunById', q =>\n q.execute(\n `DELETE FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [workflowName, runId],\n ),\n );\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_DELETE_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n state,\n fence: explicitFence,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext?: Record<string, any>;\n state?: Record<string, any>;\n fence?: RunFence;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n const fence = resolveRunFence(this, explicitFence, runId);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n if (fence) await assertRunFence(connection, RUN_OWNERS_TABLE, fence, 'updateWorkflowResults');\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT snapshot FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ? FOR UPDATE`,\n [workflowName, runId],\n );\n if (!Array.isArray(rows) || rows.length === 0) {\n await connection.rollback();\n throw new MastraError({\n id: 'MYSQL_WORKFLOWS_UPDATE_RESULTS_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { workflowName, runId },\n });\n }\n\n const currentSnapshot = parseSnapshot(rows[0]!.snapshot) as WorkflowRunState;\n const context = { ...(currentSnapshot.context ?? {}) };\n\n context[stepId] = result;\n if (state !== undefined) {\n (context as Record<string, unknown>).__state = state;\n }\n\n const updatedSnapshot: WorkflowRunState = {\n ...currentSnapshot,\n context,\n requestContext: { ...(currentSnapshot.requestContext ?? {}), ...(requestContext ?? {}) },\n };\n\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} SET ${quoteIdentifier('snapshot', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [JSON.stringify(updatedSnapshot), transformToSqlValue(new Date()), workflowName, runId],\n );\n\n await connection.commit();\n\n return context;\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_UPDATE_RESULTS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId, stepId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n fence: explicitFence,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n fence?: RunFence;\n }): Promise<WorkflowRunState | undefined> {\n const fence = resolveRunFence(this, explicitFence, runId);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n if (fence) await assertRunFence(connection, RUN_OWNERS_TABLE, fence, 'updateWorkflowState');\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT snapshot FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ? FOR UPDATE`,\n [workflowName, runId],\n );\n if (!Array.isArray(rows) || rows.length === 0) {\n await connection.rollback();\n return undefined;\n }\n\n const existing = parseSnapshot(rows[0]!.snapshot) as WorkflowRunState;\n\n const { expectedStatus, ...state } = opts;\n if (!matchesExpectedWorkflowStatus(existing.status, expectedStatus)) {\n await connection.rollback();\n return undefined;\n }\n\n // Merge opts into the snapshot\n const updatedSnapshot = { ...existing, ...state };\n\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} SET ${quoteIdentifier('snapshot', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [JSON.stringify(updatedSnapshot), transformToSqlValue(new Date()), workflowName, runId],\n );\n await connection.commit();\n\n return updatedSnapshot;\n } catch (error) {\n await connection.rollback();\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_UPDATE_STATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n fence,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n fence?: RunFence;\n }): Promise<void> {\n const now = new Date();\n const createdAtValue = createdAt ?? now;\n const updatedAtValue = updatedAt ?? now;\n const tableName = formatTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n await withRunFence(\n this.pool,\n RUN_OWNERS_TABLE,\n resolveRunFence(this, fence, runId),\n 'persistWorkflowSnapshot',\n async q => {\n const [updateResult] = await q.execute<ResultSetHeader>(\n `UPDATE ${tableName}\n SET ${quoteIdentifier('resourceId', 'column name')} = ?,\n ${quoteIdentifier('snapshot', 'column name')} = ?,\n ${quoteIdentifier('updatedAt', 'column name')} = ?\n WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [resourceId ?? null, JSON.stringify(snapshot), transformToSqlValue(updatedAtValue), workflowName, runId],\n );\n\n if (updateResult.affectedRows > 0) {\n return;\n }\n\n await q.execute(\n `INSERT INTO ${tableName} (${quoteIdentifier('workflow_name', 'column name')}, ${quoteIdentifier('run_id', 'column name')}, ${quoteIdentifier('resourceId', 'column name')}, ${quoteIdentifier('snapshot', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')})\n VALUES (?, ?, ?, ?, ?, ?)\n ON DUPLICATE KEY UPDATE ${quoteIdentifier('resourceId', 'column name')} = VALUES(${quoteIdentifier('resourceId', 'column name')}), ${quoteIdentifier('snapshot', 'column name')} = VALUES(${quoteIdentifier('snapshot', 'column name')}), ${quoteIdentifier('updatedAt', 'column name')} = VALUES(${quoteIdentifier('updatedAt', 'column name')})`,\n [\n workflowName,\n runId,\n resourceId ?? null,\n JSON.stringify(snapshot),\n transformToSqlValue(createdAtValue),\n transformToSqlValue(updatedAtValue),\n ],\n );\n },\n );\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_PERSIST_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const row = await this.operations.load<WorkflowRow>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n return row ? (parseSnapshot(row.snapshot) as WorkflowRunState) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_LOAD_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n const { workflowName, fromDate, toDate, perPage, page, resourceId, status } = args;\n\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (workflowName) {\n conditions.push(`${quoteIdentifier('workflow_name', 'column name')} = ?`);\n params.push(workflowName);\n }\n if (resourceId) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(resourceId);\n }\n if (status) {\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('snapshot', 'column name')}, '$.status') = ?`);\n params.push(status);\n }\n if (fromDate) {\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} >= ?`);\n params.push(transformToSqlValue(fromDate));\n }\n if (toDate) {\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} <= ?`);\n params.push(transformToSqlValue(toDate));\n }\n\n const whereSql = conditions.length ? ` WHERE ${conditions.join(' AND ')}` : '';\n const tableName = formatTableName(TABLE_WORKFLOW_SNAPSHOT);\n\n try {\n let total = 0;\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n\n if (usePagination) {\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableName}${whereSql}`,\n params,\n );\n total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0) {\n return { runs: [], total: 0 };\n }\n }\n\n let paginationClause = '';\n\n if (usePagination) {\n const normalizedPerPage = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalizedPerPage;\n paginationClause = ` LIMIT ${Number(normalizedPerPage)} OFFSET ${Number(offset)}`;\n }\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT workflow_name, run_id, resourceId, snapshot, createdAt, updatedAt FROM ${tableName}${whereSql} ORDER BY ${quoteIdentifier('createdAt', 'column name')} DESC${paginationClause}`,\n params,\n );\n\n const runs = (rows as unknown as WorkflowRow[]).map(mapWorkflowRow);\n\n return {\n runs,\n total: total || runs.length,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_GET_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const runs = await this.operations.loadMany<WorkflowRow>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n whereClause: {\n sql: workflowName ? ' WHERE workflow_name = ? AND run_id = ?' : ' WHERE run_id = ?',\n args: workflowName ? [workflowName, runId] : [runId],\n },\n orderBy: '`createdAt` DESC',\n limit: 1,\n });\n if (!runs.length) return null;\n return mapWorkflowRow(runs[0]!);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_GET_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n WorkspacesStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n TABLE_SCHEMAS,\n WORKSPACES_SCHEMA,\n WORKSPACE_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\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 WorkspacesMySQL extends WorkspacesStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the workspaces domain tables.\n * Currently no default indexes are defined for workspaces.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_WORKSPACES, schema: TABLE_SCHEMAS[TABLE_WORKSPACES] }),\n generateTableSQL({ tableName: TABLE_WORKSPACE_VERSIONS, schema: TABLE_SCHEMAS[TABLE_WORKSPACE_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (WorkspacesMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the workspaces domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return WorkspacesMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for workspaces.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for workspaces domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_WORKSPACES, schema: WORKSPACES_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_WORKSPACE_VERSIONS, schema: WORKSPACE_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_WORKSPACE_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_WORKSPACES });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseWorkspaceRow(row: Record<string, unknown>): StorageWorkspaceType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): WorkspaceVersion {\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: this.safeParseJSON(row.filesystem) as WorkspaceVersion['filesystem'],\n sandbox: this.safeParseJSON(row.sandbox) as WorkspaceVersion['sandbox'],\n mounts: this.safeParseJSON(row.mounts) as WorkspaceVersion['mounts'],\n search: this.safeParseJSON(row.search) as WorkspaceVersion['search'],\n skills: this.safeParseJSON(row.skills) as WorkspaceVersion['skills'],\n tools: this.safeParseJSON(row.tools) as WorkspaceVersion['tools'],\n autoSync: row.autoSync === true || row.autoSync === 1 || row.autoSync === '1',\n operationTimeout: row.operationTimeout != null ? Number(row.operationTimeout) : undefined,\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageWorkspaceType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKSPACES)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseWorkspaceRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.withTransaction(async () => {\n await this.operations.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,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;\n const versionId = crypto.randomUUID();\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 });\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('MYSQL', '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('MYSQL', '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 const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) updateData.status = 'published';\n }\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) updateData.metadata = { ...(existing.metadata || {}), ...metadata };\n\n await this.operations.withTransaction(async connection => {\n // Lock the workspace row so concurrent updates serialize and cannot\n // race on the version number increment below.\n await connection.execute(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${formatTableName(TABLE_WORKSPACES)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [id],\n );\n\n await this.operations.update({ tableName: TABLE_WORKSPACES, keys: { id }, data: updateData });\n\n if (hasConfigUpdate) {\n // Read latest version inside transaction to prevent race conditions\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) throw new Error(`No versions found for workspace ${id}`);\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 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\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.withTransaction(async () => {\n await this.deleteVersionsByParentId(id);\n await this.operations.delete({ tableName: TABLE_WORKSPACES, keys: { id } });\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_WORKSPACES', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams } : undefined;\n const total = await this.operations.loadTotalCount({ tableName: TABLE_WORKSPACES, whereClause });\n if (total === 0) return { workspaces: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACES,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n workspaces: rows.map(row => this.parseWorkspaceRow(row)),\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('MYSQL', 'LIST_WORKSPACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n try {\n const now = new Date();\n await this.operations.insert({\n tableName: TABLE_WORKSPACE_VERSIONS,\n record: {\n id: input.id,\n workspaceId: input.workspaceId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n filesystem: input.filesystem ?? null,\n sandbox: input.sandbox ?? null,\n mounts: input.mounts ?? null,\n search: input.search ?? null,\n skills: input.skills ?? null,\n tools: input.tools ?? null,\n autoSync: input.autoSync ? 1 : 0,\n operationTimeout: input.operationTimeout ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKSPACE_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [workspaceId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`, args: [workspaceId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`, args: [workspaceId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_WORKSPACE_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_WORKSPACE_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_WORKSPACE_VERSIONS)} WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`, args: [workspaceId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';\nimport { MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains, CreateIndexOptions, RetentionConfig } from '@mastra/core/storage';\nimport { createPool } from 'mysql2/promise';\nimport type { Pool, PoolOptions } from 'mysql2/promise';\n\nimport { AgentsMySQL } from './domains/agents';\nimport { BackgroundTasksMySQL } from './domains/background-tasks';\nimport { BlobsMySQL } from './domains/blobs';\nimport { ChannelsMySQL } from './domains/channels';\nimport { DatasetsMySQL } from './domains/datasets';\nimport { ExperimentsMySQL } from './domains/experiments';\nimport { FavoritesMySQL } from './domains/favorites';\nimport { KnowledgeMySQL } from './domains/knowledge';\nimport { MCPClientsMySQL } from './domains/mcp-clients';\nimport { MCPServersMySQL } from './domains/mcp-servers';\nimport { MemoryMySQL } from './domains/memory';\nimport { ObservabilityMySQL } from './domains/observability';\nimport { StoreOperationsMySQL } from './domains/operations';\nimport { PromptBlocksMySQL } from './domains/prompt-blocks';\nimport { SchedulesMySQL } from './domains/schedules';\nimport { ScorerDefinitionsMySQL } from './domains/scorer-definitions';\nimport { ScoresMySQL } from './domains/scores';\nimport { SkillsMySQL } from './domains/skills';\nimport { ToolProviderConnectionsMySQL } from './domains/tool-provider-connections';\nimport { WorkflowDefinitionsMySQL } from './domains/workflow-definitions';\nimport { WorkflowsMySQL } from './domains/workflows';\nimport { WorkspacesMySQL } from './domains/workspaces';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsMySQL,\n BackgroundTasksMySQL,\n BlobsMySQL,\n ChannelsMySQL,\n DatasetsMySQL,\n ExperimentsMySQL,\n FavoritesMySQL,\n KnowledgeMySQL,\n MCPClientsMySQL,\n MCPServersMySQL,\n MemoryMySQL,\n ObservabilityMySQL,\n StoreOperationsMySQL,\n PromptBlocksMySQL,\n SchedulesMySQL,\n ScorerDefinitionsMySQL,\n ScoresMySQL,\n SkillsMySQL,\n ToolProviderConnectionsMySQL,\n WorkflowsMySQL,\n WorkflowDefinitionsMySQL,\n WorkspacesMySQL,\n};\n\nexport type MySQLStoreConfig = (\n | {\n connectionString: string;\n database?: string;\n max?: number;\n ssl?: boolean | Record<string, unknown>;\n }\n | {\n host: string;\n port?: number;\n user: string;\n password?: string;\n database: string;\n ssl?: boolean | Record<string, unknown>;\n max?: number;\n waitForConnections?: boolean;\n queueLimit?: number;\n }\n) & {\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n retention?: RetentionConfig;\n};\n\nfunction validateConfig(config: MySQLStoreConfig): void {\n if ('connectionString' in config) {\n if (!config.connectionString || typeof config.connectionString !== 'string') {\n throw new Error('MySQLStore: connectionString must be a non-empty string.');\n }\n return;\n }\n\n const required: Array<keyof typeof config> = ['host', 'user', 'database'];\n for (const key of required) {\n const value = config[key];\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`MySQLStore: ${key} must be provided and cannot be empty.`);\n }\n }\n\n if ('password' in config && config.password !== undefined) {\n if (typeof config.password !== 'string') {\n throw new Error('MySQLStore: password must be a string if provided.');\n }\n }\n}\n\nfunction createMySQLPool(config: MySQLStoreConfig): { pool: Pool; database?: string } {\n if ('connectionString' in config) {\n const { options } = parseConnectionString(config.connectionString, config);\n return { pool: createPool(options), database: options.database };\n }\n\n const options: PoolOptions = {\n host: config.host,\n port: config.port ?? 3306,\n user: config.user,\n database: config.database,\n connectionLimit: config.max ?? 10,\n waitForConnections: config.waitForConnections ?? true,\n queueLimit: config.queueLimit ?? 0,\n dateStrings: true,\n };\n\n if (config.password !== undefined) {\n options.password = config.password;\n }\n\n if ('ssl' in config && config.ssl) {\n options.ssl = typeof config.ssl === 'boolean' ? {} : (config.ssl as PoolOptions['ssl']);\n }\n\n return { pool: createPool(options), database: options.database };\n}\n\nfunction parseConnectionString(\n connectionString: string,\n overrides: Extract<MySQLStoreConfig, { connectionString: string }>,\n): { options: PoolOptions } {\n const url = new URL(connectionString);\n\n const databaseFromUrl = url.pathname.replace(/^\\//, '') || undefined;\n\n const base: PoolOptions = {\n host: url.hostname || 'localhost',\n port: url.port ? Number(url.port) : 3306,\n user: decodeURIComponent(url.username),\n password: decodeURIComponent(url.password),\n database: overrides.database ?? databaseFromUrl,\n connectionLimit: overrides.max ?? 10,\n waitForConnections: true,\n queueLimit: 0,\n dateStrings: true,\n };\n\n if (url.searchParams.has('waitForConnections')) {\n base.waitForConnections = url.searchParams.get('waitForConnections') === 'true';\n }\n if (url.searchParams.has('queueLimit')) {\n const queueLimit = Number(url.searchParams.get('queueLimit'));\n if (!Number.isNaN(queueLimit)) {\n base.queueLimit = queueLimit;\n }\n }\n if (url.searchParams.has('connectionLimit')) {\n const connectionLimit = Number(url.searchParams.get('connectionLimit'));\n if (!Number.isNaN(connectionLimit)) {\n base.connectionLimit = connectionLimit;\n }\n }\n if (url.searchParams.has('dateStrings')) {\n base.dateStrings = url.searchParams.get('dateStrings') === 'true';\n }\n\n let sslParam: unknown = overrides.ssl ?? url.searchParams.get('ssl') ?? undefined;\n if (typeof sslParam === 'string') {\n const trimmed = sslParam.trim();\n const lowered = trimmed.toLowerCase();\n if (['false', '0', 'off', ''].includes(lowered)) {\n sslParam = undefined;\n } else if (['true', '1', 'on'].includes(lowered)) {\n sslParam = {};\n } else if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n sslParam = JSON.parse(trimmed);\n } catch {\n sslParam = undefined;\n }\n }\n }\n if (sslParam && typeof sslParam === 'object') {\n base.ssl = sslParam as PoolOptions['ssl'];\n }\n\n return { options: base };\n}\n\nexport class MySQLStore extends MastraCompositeStore {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n\n stores: StorageDomains;\n\n constructor(config: MySQLStoreConfig & { id?: string; disableInit?: boolean }) {\n super({\n id: config.id ?? 'mysql',\n name: 'MySQLStore',\n disableInit: config.disableInit,\n retention: config.retention,\n });\n validateConfig(config);\n const { pool, database } = createMySQLPool(config);\n this.pool = pool;\n\n const operations = new StoreOperationsMySQL({ pool: this.pool, database });\n this.operations = operations;\n\n const memory = new MemoryMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const knowledge = new KnowledgeMySQL({ pool: this.pool, operations });\n const workflows = new WorkflowsMySQL({\n operations,\n pool: this.pool,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const scores = new ScoresMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const observability = new ObservabilityMySQL({\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const agents = new AgentsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const datasets = new DatasetsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const experiments = new ExperimentsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const promptBlocks = new PromptBlocksMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const scorerDefinitions = new ScorerDefinitionsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const mcpClients = new MCPClientsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const mcpServers = new MCPServersMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const workspaces = new WorkspacesMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const skills = new SkillsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const blobs = new BlobsMySQL({ pool: this.pool, operations });\n const backgroundTasks = new BackgroundTasksMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const channels = new ChannelsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const favorites = new FavoritesMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const schedules = new SchedulesMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const toolProviderConnections = new ToolProviderConnectionsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const workflowDefinitions = new WorkflowDefinitionsMySQL({\n pool: this.pool,\n operations,\n database,\n });\n\n this.stores = {\n memory,\n knowledge,\n workflows,\n scores,\n observability,\n agents,\n datasets,\n experiments,\n promptBlocks,\n scorerDefinitions,\n mcpClients,\n mcpServers,\n workspaces,\n skills,\n blobs,\n backgroundTasks,\n channels,\n favorites,\n schedules,\n toolProviderConnections,\n workflowDefinitions,\n };\n }\n\n async init(): Promise<void> {\n try {\n const connection = await this.pool.getConnection();\n connection.release();\n // Load the init-scoped catalog snapshot so domain inits answer their\n // existence checks locally instead of probing the server per object.\n // A failed or empty load (no default database) simply leaves today's\n // per-probe behavior in place.\n await this.operations.loadInitSchemaSnapshot();\n await super.init();\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_INIT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n // Init-scoped by design: cleared on every exit path so runtime callers\n // keep querying the live catalog (never a process-global cache).\n this.operations.clearInitSchemaSnapshot();\n }\n }\n\n async close(): Promise<void> {\n await this.pool.end();\n }\n}\n\n/**\n * All storage domain classes that provide static getExportDDL methods.\n */\nconst ALL_DOMAINS = [\n MemoryMySQL,\n KnowledgeMySQL,\n ObservabilityMySQL,\n ScoresMySQL,\n ScorerDefinitionsMySQL,\n PromptBlocksMySQL,\n AgentsMySQL,\n WorkflowsMySQL,\n WorkflowDefinitionsMySQL,\n DatasetsMySQL,\n ExperimentsMySQL,\n BackgroundTasksMySQL,\n FavoritesMySQL,\n ChannelsMySQL,\n SchedulesMySQL,\n] as const;\n\n/**\n * Exports the Mastra database schema as MySQL DDL statements.\n * Does not require a database connection.\n */\nexport function exportSchemas(): string {\n const statements: string[] = [];\n\n for (const Domain of ALL_DOMAINS) {\n statements.push(...Domain.getExportDDL());\n }\n\n return statements.join('\\n');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["TABLE_SCHEMAS","StoreOperations","TABLE_CONFIGS","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","MastraError","ErrorDomain","ErrorCategory","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","AGENTS_SCHEMA","AGENT_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","TABLE_FAVORITES","parseJson","BackgroundTasksStorage","TABLE_BACKGROUND_TASKS","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","TABLE_SKILL_BLOBS","BlobStore","SKILL_BLOBS_SCHEMA","#insertArgs","#parseRow","ChannelsStorage","TABLE_CHANNEL_INSTALLATIONS","TABLE_CHANNEL_CONFIG","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","parseJSON","DATASET_ITEMS_SCHEMA","DatasetsStorage","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","MastraError","ErrorDomain","ErrorCategory","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","DATASETS_SCHEMA","DATASET_VERSIONS_SCHEMA","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","#rejectToolMocks","parseJSON","ExperimentsStorage","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","#withPurgeBarrier","TABLE_DATASETS","TABLE_DATASET_ITEMS","#ensureExperimentResultNaturalKey","MastraError","ErrorDomain","ErrorCategory","EXPERIMENTS_SCHEMA","EXPERIMENT_RESULTS_SCHEMA","TABLE_AGENTS","TABLE_SKILLS","FavoritesStorage","TABLE_FAVORITES","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","FAVORITES_SCHEMA","MastraError","ErrorDomain","ErrorCategory","parseJson","TABLE_KNOWLEDGE_NODES","TABLE_KNOWLEDGE_RECORDS","TABLE_KNOWLEDGE_MENTIONS","TABLE_KNOWLEDGE_ACTIVITY","TABLE_KNOWLEDGE_SEMANTIC_OUTBOX","KnowledgeStorage","KNOWLEDGE_NODES_SCHEMA","KNOWLEDGE_RECORDS_SCHEMA","KNOWLEDGE_MENTIONS_SCHEMA","KNOWLEDGE_ACTIVITY_SCHEMA","KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA","#pool","#client","#operations","#transaction","#getNodeByName","#resolveTerminalNode","#replaceMentions","#activity","#outbox","#getNode","#resolveNode","KnowledgeNotFoundError","KnowledgeConflictError","#queryKnowledge","#getKnowledge","MCPClientsStorage","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","MCP_CLIENTS_SCHEMA","MCP_CLIENT_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","MCPServersStorage","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","MCP_SERVERS_SCHEMA","MCP_SERVER_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","RunFenceConflictError","TABLE_MEMORY_RUN_FENCES","RUN_ID","OWNER_ID","MastraError","ErrorDomain","ErrorCategory","parseJSON","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","#skipDefaultIndexes","#indexes","#assertFence","TABLE_SCHEMAS","RUN_FENCING_TABLE_SCHEMAS","OBSERVATIONAL_MEMORY_TABLE_SCHEMA","#readThread","#fenced","MessageList","#insertResource","#insertReflectionGeneration","ObservabilityStorage","TABLE_SPANS","#skipDefaultIndexes","#indexes","SPAN_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","listTracesArgsSchema","TraceStatus","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","#skipDefaultIndexes","#indexes","PROMPT_BLOCKS_SCHEMA","PROMPT_BLOCK_VERSIONS_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","SchedulesStorage","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","#skipDefaultIndexes","#indexes","TABLE_SCHEMAS","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","#skipDefaultIndexes","#indexes","SCORER_DEFINITIONS_SCHEMA","SCORER_DEFINITION_VERSIONS_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","ScoresStorage","TABLE_SCORERS","#skipDefaultIndexes","#indexes","SCORERS_SCHEMA","TABLE_SCHEMAS","MastraError","ErrorDomain","ErrorCategory","SNAPSHOT_FIELDS","SkillsStorage","TABLE_SKILLS","TABLE_SKILL_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","SKILLS_SCHEMA","SKILL_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","TABLE_FAVORITES","ToolProviderConnectionsStorage","TABLE_TOOL_PROVIDER_CONNECTIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","TOOL_PROVIDER_CONNECTIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","TABLE_WORKFLOW_DEFINITIONS","WorkflowDefinitionsStorage","WORKFLOW_DEFINITIONS_SCHEMA","TABLE_WORKFLOW_RUN_OWNERS","WorkflowsStorage","TABLE_WORKFLOW_SNAPSHOT","TABLE_SCHEMAS","RUN_FENCING_TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","MastraError","ErrorDomain","ErrorCategory","#ownershipError","WorkspacesStorage","TABLE_WORKSPACES","TABLE_WORKSPACE_VERSIONS","TABLE_SCHEMAS","#skipDefaultIndexes","#indexes","WORKSPACES_SCHEMA","WORKSPACE_VERSIONS_SCHEMA","MastraError","ErrorDomain","ErrorCategory","MastraCompositeStore","MastraError","ErrorDomain","ErrorCategory"],"sources":["../src/storage/db/schema-snapshot.ts","../src/storage/domains/utils.ts","../src/storage/domains/operations/index.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/channels/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/favorites/index.ts","../src/storage/domains/knowledge/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/mcp-servers/index.ts","../../../packages/_internal-core/dist/memory/index.js","../src/storage/db/run-fencing.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/schedules/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/tool-provider-connections/index.ts","../src/storage/domains/workflow-definitions/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/domains/workspaces/index.ts","../src/storage/index.ts"],"sourcesContent":["import type { Pool, RowDataPacket } from 'mysql2/promise';\n\n/**\n * A read-only picture of one MySQL schema's catalog, taken once at the start of\n * `MySQLStore.init()`.\n *\n * Before this existed, every domain's init converged its own tables by asking\n * the server: a `SELECT COUNT(*)` table probe and a column-list probe per\n * table, an `information_schema.STATISTICS` probe per index, plus raw\n * `CREATE INDEX` statements whose duplicate errors were swallowed. On an\n * already-converged schema that is over a hundred statements that change\n * nothing, each one a client-server round trip.\n *\n * The snapshot answers all of those questions locally instead, from three\n * catalog reads. It only ever answers per-object presence questions (\"is this\n * table/column/index present?\"), never whole-schema equality: convergence is\n * additive, so an older client against a newer schema must still read as\n * converged.\n *\n * **Init-scoped by design.** The snapshot is installed on the store's shared\n * operations domain for exactly the init() window and cleared in the same\n * `finally`, so staleness is bounded to a single init() call and runtime code\n * paths keep querying the live catalog. It is deliberately *not* a\n * process-global cache (that shape was proposed for pg in PR #13960 and closed\n * unmerged): every init re-reads the catalog, so a schema that drifted out of\n * band between inits is still detected and healed. Consulting code maintains\n * the snapshot as it creates objects, so later domains in the same init see\n * what earlier ones created.\n *\n * Field reads are casing-agnostic (`row.TABLE_NAME ?? row.table_name`) because\n * mysql2 returns `information_schema` result keys uppercase on mysql:9.7 but\n * the casing can vary with server settings.\n */\nexport interface SchemaSnapshot {\n /** Schema the snapshot was taken from. */\n readonly schemaName: string;\n /** Lowercased names of tables present in the schema. */\n tables: Set<string>;\n /** lowercased table name -> lowercased column names present on that table. */\n columns: Map<string, Set<string>>;\n /**\n * `table.index` keys (both lowercased) for indexes present in the schema.\n * MySQL index names are unique per table, not per schema, so presence is\n * keyed the same way the STATISTICS probe matches: table plus index name.\n */\n indexes: Set<string>;\n}\n\n/** Builds the `table.index` presence key the snapshot uses. */\nexport function indexKey(table: string, index: string): string {\n return `${table.toLowerCase()}.${index.toLowerCase()}`;\n}\n\nconst lower = (value: unknown): string => String(value).toLowerCase();\n\n/**\n * Reads the catalog for `schemaName` in three queries. Returns null when no\n * schema name is available (a pool with no default database): correctness over\n * optimization, callers fall back to today's per-probe behavior.\n */\nexport async function loadSchemaSnapshot(pool: Pool, schemaName: string | undefined): Promise<SchemaSnapshot | null> {\n if (!schemaName) return null;\n\n const [[tableRows], [columnRows], [indexRows]] = await Promise.all([\n pool.execute<RowDataPacket[]>(`SELECT table_name FROM information_schema.tables WHERE table_schema = ?`, [\n schemaName,\n ]),\n pool.execute<RowDataPacket[]>(\n `SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = ?`,\n [schemaName],\n ),\n pool.execute<RowDataPacket[]>(\n `SELECT DISTINCT table_name, index_name FROM information_schema.statistics WHERE table_schema = ?`,\n [schemaName],\n ),\n ]);\n\n const tables = new Set<string>();\n for (const row of tableRows ?? []) {\n tables.add(lower(row.table_name ?? row.TABLE_NAME));\n }\n\n const columns = new Map<string, Set<string>>();\n for (const row of columnRows ?? []) {\n const table = lower(row.table_name ?? row.TABLE_NAME);\n let set = columns.get(table);\n if (!set) {\n set = new Set<string>();\n columns.set(table, set);\n }\n set.add(lower(row.column_name ?? row.COLUMN_NAME));\n }\n\n const indexes = new Set<string>();\n for (const row of indexRows ?? []) {\n indexes.add(indexKey(lower(row.table_name ?? row.TABLE_NAME), lower(row.index_name ?? row.INDEX_NAME)));\n }\n\n return { schemaName, tables, columns, indexes };\n}\n","import { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { TABLE_NAMES } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nexport type SqlParam = any;\n\nexport function quoteIdentifier(value: string, context: string): string {\n return `\\`${parseSqlIdentifier(value, context)}\\``;\n}\n\nexport function formatTableName(tableName: TABLE_NAMES, database?: string): string {\n const tableIdent = quoteIdentifier(tableName, 'table name');\n if (!database) {\n return tableIdent;\n }\n return `${quoteIdentifier(database, 'database name')}.${tableIdent}`;\n}\n\nexport function prepareWhereClause(filters: Record<string, any>): { sql: string; args: SqlParam[] } {\n const conditions: string[] = [];\n const args: SqlParam[] = [];\n\n Object.entries(filters).forEach(([key, value]) => {\n if (value === undefined) return;\n\n if (key.endsWith('_gte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} >= ?`);\n args.push(transformToSqlValue(value));\n } else if (key.endsWith('_lte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} <= ?`);\n args.push(transformToSqlValue(value));\n } else if (key.endsWith('_like')) {\n const fieldName = key.slice(0, -5);\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} LIKE ?`);\n args.push(transformToSqlValue(value));\n } else if (key.endsWith('_in')) {\n const fieldName = key.slice(0, -3);\n const list = Array.isArray(value) ? value : [value];\n if (list.length === 0) {\n conditions.push('FALSE');\n } else {\n const placeholders = list.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} IN (${placeholders})`);\n args.push(...list.map(transformToSqlValue));\n }\n } else if (key.endsWith('_null')) {\n const fieldName = key.slice(0, -5);\n if (value === true) {\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} IS NULL`);\n } else if (value === false) {\n conditions.push(`${quoteIdentifier(fieldName, 'column name')} IS NOT NULL`);\n }\n } else if (value === null) {\n conditions.push(`${quoteIdentifier(key, 'column name')} IS NULL`);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n conditions.push('FALSE');\n } else {\n const placeholders = value.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier(key, 'column name')} IN (${placeholders})`);\n args.push(...value.map(transformToSqlValue));\n }\n } else {\n conditions.push(`${quoteIdentifier(key, 'column name')} = ?`);\n args.push(transformToSqlValue(value));\n }\n });\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n}\n\nexport function transformToSqlValue(value: any): SqlParam {\n if (value === undefined || value === null) {\n return null;\n }\n if (value instanceof Date) {\n // MySQL DATETIME accepts 'YYYY-MM-DD HH:mm:ss.SSS' (no timezone). Preserve ms precision.\n return value.toISOString().slice(0, 23).replace('T', ' ');\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return value;\n}\n\nexport function prepareInsertOnlyStatement({\n tableName,\n record,\n database,\n}: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n const tableIdent = formatTableName(tableName, database);\n const columns = Object.keys(record);\n if (columns.length === 0) {\n throw new Error('Cannot prepare statement for empty record');\n }\n const columnIdentifiers = columns.map(column => quoteIdentifier(column, 'column name'));\n const values = columns.map(column => transformToSqlValue(record[column]));\n const placeholders = columns.map(() => '?').join(', ');\n\n return {\n sql: `INSERT INTO ${tableIdent} (${columnIdentifiers.join(', ')}) VALUES (${placeholders})`,\n args: values,\n };\n}\n\nexport function prepareStatement({\n tableName,\n record,\n database,\n}: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n const statement = prepareInsertOnlyStatement({ tableName, record, database });\n const columns = Object.keys(record).map(column => quoteIdentifier(column, 'column name'));\n const updateAssignments = columns.map(column => `${column} = ?`).join(', ');\n\n return {\n sql: `${statement.sql} ON DUPLICATE KEY UPDATE ${updateAssignments}`,\n args: [...statement.args, ...statement.args],\n };\n}\n\nexport function prepareUpdateStatement({\n tableName,\n updates,\n keys,\n database,\n}: {\n tableName: TABLE_NAMES;\n updates: Record<string, any>;\n keys: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n if (Object.keys(updates).length === 0) {\n throw new Error('Updates object cannot be empty');\n }\n const tableIdent = formatTableName(tableName, database);\n const setClause = Object.entries(updates)\n .map(([key]) => `${quoteIdentifier(key, 'column name')} = ?`)\n .join(', ');\n const updateValues = Object.values(updates).map(transformToSqlValue);\n const whereClause = prepareWhereClause(keys);\n\n return {\n sql: `UPDATE ${tableIdent} SET ${setClause}${whereClause.sql}`,\n args: [...updateValues, ...whereClause.args],\n };\n}\n\nexport function prepareDeleteStatement({\n tableName,\n keys,\n database,\n}: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n database?: string;\n}): {\n sql: string;\n args: SqlParam[];\n} {\n if (Object.keys(keys).length === 0) {\n throw new Error('Keys object cannot be empty for DELETE statement');\n }\n\n const tableIdent = formatTableName(tableName, database);\n const whereClause = prepareWhereClause(keys);\n\n return {\n sql: `DELETE FROM ${tableIdent}${whereClause.sql}`,\n args: whereClause.args,\n };\n}\n\nexport function transformFromSqlRow<T>({\n tableName,\n sqlRow,\n}: {\n tableName: TABLE_NAMES;\n sqlRow: Record<string, any>;\n}): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n\n Object.entries(sqlRow).forEach(([key, value]) => {\n const columnSchema = schema?.[key];\n\n if (columnSchema?.type === 'jsonb') {\n if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n } else if (columnSchema?.type === 'timestamp') {\n result[key] = value === null ? null : parseDateTime(value);\n } else if (columnSchema?.type === 'boolean') {\n result[key] = value === true || value === 1 || value === '1';\n } else {\n result[key] = value;\n }\n });\n\n return result as T;\n}\n\nexport function parseDateTime(value: Date | string | number | null | undefined): Date | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'number') {\n return new Date(value);\n }\n const str = String(value).trim();\n if (!str) return undefined;\n const normalized = str.includes('T') ? str : str.replace(' ', 'T');\n const withZone = /[zZ]|[+-]\\d\\d:?\\d\\d$/.test(normalized) ? normalized : `${normalized}Z`;\n return new Date(withZone);\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { StoreOperations, TABLE_CONFIGS, TABLE_SPANS, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { StorageColumn, TABLE_NAMES, CreateIndexOptions } from '@mastra/core/storage';\nimport type { Pool, PoolConnection, RowDataPacket } from 'mysql2/promise';\nimport { indexKey, loadSchemaSnapshot } from '../../db/schema-snapshot';\nimport type { SchemaSnapshot } from '../../db/schema-snapshot';\nimport {\n formatTableName,\n prepareDeleteStatement,\n prepareInsertOnlyStatement,\n prepareStatement,\n prepareUpdateStatement,\n prepareWhereClause,\n quoteIdentifier,\n transformFromSqlRow,\n transformToSqlValue,\n} from '../utils';\nimport type { SqlParam } from '../utils';\n\ntype WhereClause = {\n sql: string;\n args: SqlParam[];\n};\n\nexport class StoreOperationsMySQL extends StoreOperations {\n private pool: Pool;\n private database?: string;\n private resolvedDatabase?: string | null;\n\n /**\n * Init-scoped catalog snapshot (see db/schema-snapshot.ts). Installed by\n * MySQLStore.init() for exactly the init window and cleared in its finally;\n * null at runtime so non-init callers keep probing the live catalog.\n */\n private schemaSnapshot: SchemaSnapshot | null = null;\n\n constructor({ pool, database }: { pool: Pool; database?: string }) {\n super();\n this.pool = pool;\n this.database = database;\n this.resolvedDatabase = database ?? null;\n }\n\n /**\n * Loads and installs the init-scoped snapshot. A null load (no default\n * database) or a failed load leaves the snapshot uninstalled, so init\n * proceeds with today's per-probe behavior: correctness over optimization.\n */\n async loadInitSchemaSnapshot(): Promise<void> {\n try {\n this.schemaSnapshot = await loadSchemaSnapshot(this.pool, await this.getDatabase());\n } catch (error) {\n console.warn('Failed to load init schema snapshot, falling back to per-object probing:', error);\n this.schemaSnapshot = null;\n }\n }\n\n clearInitSchemaSnapshot(): void {\n this.schemaSnapshot = null;\n }\n\n /** Read by sibling domains (memory's raw index DDL) so snapshot state lives in exactly one place. */\n getInitSchemaSnapshot(): SchemaSnapshot | null {\n return this.schemaSnapshot;\n }\n\n getPool(): Pool {\n return this.pool;\n }\n\n async query<T = RowDataPacket>(sql: string, args: SqlParam[] = []): Promise<T[]> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, args.map(transformToSqlValue));\n return rows as unknown as T[];\n }\n\n private async getDatabase(): Promise<string | undefined> {\n if (this.resolvedDatabase !== null) {\n return this.resolvedDatabase ?? undefined;\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>('SELECT DATABASE() AS db');\n const db = rows[0]?.db as string | null;\n this.resolvedDatabase = db ?? null;\n return this.resolvedDatabase ?? undefined;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n // Consult the init-scoped snapshot instead of probing the server.\n const snapshotColumns = this.schemaSnapshot?.columns.get(table.toLowerCase());\n if (snapshotColumns) {\n return snapshotColumns.has(column.toLowerCase());\n }\n const db = await this.getDatabase();\n const params: SqlParam[] = [table, column];\n let sql =\n 'SELECT COUNT(*) as count FROM information_schema.columns WHERE table_name = ? AND (column_name = ? OR column_name = ? )';\n params.push(column.toLowerCase());\n if (db) {\n sql += ' AND table_schema = ?';\n params.push(db);\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n return Number(rows[0]?.count ?? 0) > 0;\n }\n\n protected getSqlType(type: StorageColumn['type'], opts?: { isKey?: boolean; isNullable?: boolean }): string {\n const isKey = Boolean(opts?.isKey);\n const _isNullable = opts?.isNullable ?? true;\n switch (type) {\n case 'text':\n // Keys should remain short and indexable\n if (isKey) {\n return 'VARCHAR(191)';\n }\n // For non-key text fields, prefer LONGTEXT to avoid truncation errors\n // (message content, snapshots, etc. can exceed small VARCHAR limits)\n return 'LONGTEXT';\n case 'uuid':\n return 'VARCHAR(36)';\n case 'timestamp':\n return 'DATETIME(6)';\n case 'jsonb':\n return 'JSON';\n case 'integer':\n return 'INT';\n case 'float':\n return 'DOUBLE';\n case 'bigint':\n return 'BIGINT';\n case 'boolean':\n return 'TINYINT(1)';\n default:\n return super.getSqlType(type);\n }\n }\n\n private buildColumnDefinition(tableName: TABLE_NAMES, columnName: string, column: StorageColumn): string {\n const parts: string[] = [];\n const isKeyColumn = column.primaryKey || this.isKeyColumn(tableName, columnName);\n const isNullable = column.nullable !== false;\n parts.push(\n `${quoteIdentifier(columnName, 'column name')} ${this.getSqlType(column.type, {\n isKey: Boolean(isKeyColumn),\n isNullable,\n })}`,\n );\n if (column.nullable === false) {\n parts.push('NOT NULL');\n const defaultClause = this.getDefaultClause(column.type, {\n isNullable,\n isKey: Boolean(isKeyColumn),\n });\n if (defaultClause) {\n parts.push(defaultClause);\n }\n }\n if (column.primaryKey) {\n parts.push('PRIMARY KEY');\n }\n return parts.join(' ');\n }\n\n private getDefaultClause(\n type: StorageColumn['type'],\n { isNullable, isKey }: { isNullable: boolean; isKey: boolean },\n ): string | undefined {\n switch (type) {\n case 'jsonb':\n return undefined;\n case 'timestamp':\n return \"DEFAULT '1970-01-01 00:00:00'\";\n case 'text':\n return !isNullable && isKey ? \"DEFAULT ''\" : undefined;\n case 'boolean':\n return !isNullable ? 'DEFAULT 0' : undefined;\n default:\n return super.getDefaultValue(type);\n }\n }\n\n private getCreateTableSQL(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): string {\n const columns = Object.entries(schema).map(([name, column]) => this.buildColumnDefinition(tableName, name, column));\n const tableIdent = formatTableName(tableName, this.database);\n\n const extraConstraints: string[] = [];\n // Check if this table has a composite primary key defined in TABLE_CONFIGS\n const tableConfig = TABLE_CONFIGS[tableName];\n if (tableConfig?.compositePrimaryKey) {\n const pkColumns = tableConfig.compositePrimaryKey\n .map(col => quoteIdentifier(col, 'primary key column'))\n .join(', ');\n extraConstraints.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n // Hard-coded constraints for tables that rely on upsert behavior\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n extraConstraints.push(\n `PRIMARY KEY (${quoteIdentifier('workflow_name', 'column name')}, ${quoteIdentifier('run_id', 'column name')})`,\n );\n }\n if (tableName === TABLE_SPANS) {\n extraConstraints.push(\n `PRIMARY KEY (${quoteIdentifier('traceId', 'column name')}, ${quoteIdentifier('spanId', 'column name')})`,\n );\n }\n\n return `CREATE TABLE IF NOT EXISTS ${tableIdent} (${[...columns, ...extraConstraints].filter(Boolean).join(', ')}) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`;\n }\n\n private isKeyColumn(tableName: TABLE_NAMES, columnName: string): boolean {\n if (columnName === 'id') {\n return true;\n }\n\n // Check if this column is part of a composite primary key\n const tableConfig = TABLE_CONFIGS[tableName];\n if (tableConfig?.compositePrimaryKey?.includes(columnName)) {\n return true;\n }\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT && (columnName === 'workflow_name' || columnName === 'run_id')) {\n return true;\n }\n\n if (tableName === TABLE_SPANS && (columnName === 'traceId' || columnName === 'spanId')) {\n return true;\n }\n\n return false;\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n // Consult the init-scoped snapshot instead of probing the server.\n const snapshot = this.schemaSnapshot;\n if (snapshot?.tables.has(tableName.toLowerCase())) {\n return;\n }\n const connection = await this.pool.getConnection();\n try {\n if (!snapshot) {\n const db = await this.getDatabase();\n const [t_rows] = await connection.query(\n 'SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?',\n [db ?? '', tableName],\n );\n const exists = Array.isArray(t_rows) && t_rows.length > 0 && (t_rows[0] as any).count > 0;\n if (exists) {\n return;\n }\n }\n const sql = this.getCreateTableSQL(tableName, schema);\n const [result] = await connection.execute(sql);\n // Maintain the snapshot so later domains in the same init see this table,\n // but only when the CREATE actually created it. warningStatus > 0 means\n // IF NOT EXISTS no-opped against a table the snapshot did not see (created\n // out of band after the catalog read); leaving it out of the snapshot\n // makes later consults fall back to probing the live catalog for it.\n const created = (result as { warningStatus?: number } | undefined)?.warningStatus === 0;\n if (snapshot && created) {\n const table = tableName.toLowerCase();\n snapshot.tables.add(table);\n snapshot.columns.set(table, new Set(Object.keys(schema).map(column => column.toLowerCase())));\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_CREATE_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.pool.execute(`DROP TABLE IF EXISTS ${formatTableName(tableName, this.database)}`);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_DROP_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async pruneBatch({\n tableName,\n column,\n cutoff,\n limit,\n }: {\n tableName: TABLE_NAMES;\n column: string;\n cutoff: Date | number;\n limit: number;\n }): Promise<number> {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(column)) {\n throw new Error(`Invalid retention identifier: ${tableName}.${column}`);\n }\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(`Retention batch limit must be a positive safe integer; received ${limit}`);\n }\n const [result] = await this.pool.execute(\n `DELETE FROM ${formatTableName(tableName, this.database)} WHERE ${quoteIdentifier(column, 'column name')} < ? ORDER BY ${quoteIdentifier(column, 'column name')} LIMIT ${limit}`,\n [cutoff],\n );\n return Number((result as { affectedRows?: number }).affectedRows ?? 0);\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n await this.pool.execute(`DELETE FROM ${formatTableName(tableName, this.database)}`);\n } catch (error) {\n // Ignore table not exists errors\n if ((error as any)?.code === 'ER_NO_SUCH_TABLE') {\n return;\n }\n throw new MastraError(\n {\n id: 'MYSQL_STORE_CLEAR_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async withTransaction<T>(fn: (connection: PoolConnection) => Promise<T>): Promise<T> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n const result = await fn(connection);\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback();\n throw error;\n } finally {\n connection.release();\n }\n }\n\n async createIndex(options: CreateIndexOptions): Promise<void> {\n const { name, table, columns, unique = false } = options;\n const tableName = formatTableName(table as TABLE_NAMES, this.database);\n const indexName = quoteIdentifier(name, 'index name');\n\n try {\n // Consult the init-scoped snapshot instead of probing the server.\n const snapshot = this.schemaSnapshot;\n if (snapshot) {\n if (snapshot.indexes.has(indexKey(table, name))) {\n return; // Index already exists\n }\n } else {\n // Check if index already exists\n const db = (await this.getDatabase()) ?? '';\n const [existing] = await this.pool.execute<RowDataPacket[]>(\n `SELECT 1 FROM information_schema.STATISTICS \n WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND INDEX_NAME = ?\n LIMIT 1`,\n [db, table, name],\n );\n\n if (existing.length > 0) {\n return; // Index already exists\n }\n }\n\n // Look up column data types so we can add prefix lengths for TEXT/BLOB\n // columns, which MySQL cannot index without an explicit key length.\n // (Cold path only: this runs when an index is actually being created.)\n const [columnMeta] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COLUMN_NAME, DATA_TYPE FROM information_schema.COLUMNS\n WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?`,\n [(await this.getDatabase()) ?? '', table],\n );\n const dataTypeByColumn = new Map<string, string>(\n columnMeta.map(row => [String(row.COLUMN_NAME).toLowerCase(), String(row.DATA_TYPE).toLowerCase()]),\n );\n const PREFIX_TYPES = new Set([\n 'tinytext',\n 'text',\n 'mediumtext',\n 'longtext',\n 'blob',\n 'tinyblob',\n 'mediumblob',\n 'longblob',\n ]);\n const indexColumn = (colName: string): string => {\n const quoted = quoteIdentifier(colName, 'column name');\n const dataType = dataTypeByColumn.get(colName.toLowerCase());\n return dataType && PREFIX_TYPES.has(dataType) ? `${quoted}(191)` : quoted;\n };\n\n // Build column list\n const columnsStr = columns\n .map(col => {\n // Handle DESC/ASC modifiers\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n return `${indexColumn(colName!)} ${modifiers.join(' ')}`;\n }\n return indexColumn(col);\n })\n .join(', ');\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const sql = `CREATE ${uniqueStr}INDEX ${indexName} ON ${tableName} (${columnsStr})`;\n\n await this.pool.execute(sql);\n // Maintain the snapshot so later domains in the same init see this index.\n this.schemaSnapshot?.indexes.add(indexKey(table, name));\n } catch (error) {\n // Log but don't throw - indexes are performance optimizations\n console.warn(`Failed to create index ${name}:`, error);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const statement = prepareStatement({ tableName, record, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async insertOnly({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const statement = prepareInsertOnlyStatement({ tableName, record, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n try {\n await this.withTransaction(async connection => {\n for (const record of records) {\n const statement = prepareStatement({ tableName, record, database: this.database });\n await connection.execute(statement.sql, statement.args);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_BATCH_INSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: records.length },\n },\n error,\n );\n }\n }\n\n async update({\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 try {\n const statement = prepareUpdateStatement({ tableName, updates: data, keys, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n items,\n }: {\n tableName: TABLE_NAMES;\n items: { keys: Record<string, any>; data: Record<string, any> }[];\n }): Promise<void> {\n if (items.length === 0) return;\n try {\n await this.withTransaction(async connection => {\n for (const item of items) {\n const statement = prepareUpdateStatement({\n tableName,\n updates: item.data,\n keys: item.keys,\n database: this.database,\n });\n await connection.execute(statement.sql, statement.args);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_BATCH_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: items.length },\n },\n error,\n );\n }\n }\n\n async batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any>[] }): Promise<void> {\n if (keys.length === 0) return;\n try {\n await this.withTransaction(async connection => {\n for (const key of keys) {\n const statement = prepareDeleteStatement({ tableName, keys: key, database: this.database });\n await connection.execute(statement.sql, statement.args);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_BATCH_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: keys.length },\n },\n error,\n );\n }\n }\n\n async delete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<void> {\n try {\n const statement = prepareDeleteStatement({ tableName, keys, database: this.database });\n await this.pool.execute(statement.sql, statement.args);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null> {\n try {\n const whereClause = prepareWhereClause(keys);\n const sql = `SELECT * FROM ${formatTableName(tableName, this.database)}${whereClause.sql} ORDER BY createdAt DESC LIMIT 1`;\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, whereClause.args.map(transformToSqlValue));\n if (!rows.length) {\n return null;\n }\n let record = transformFromSqlRow<R>({ tableName, sqlRow: rows[0] as any });\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshotRecord: any = record;\n if (typeof snapshotRecord.snapshot === 'string') {\n try {\n snapshotRecord.snapshot = JSON.parse(snapshotRecord.snapshot);\n } catch {}\n }\n record = snapshotRecord;\n }\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_LOAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async loadMany<R>({\n tableName,\n whereClause,\n orderBy,\n offset,\n limit,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: WhereClause;\n orderBy?: string;\n offset?: number;\n limit?: number;\n }): Promise<R[]> {\n try {\n let sql = `SELECT * FROM ${formatTableName(tableName, this.database)}`;\n const args: SqlParam[] = [];\n\n if (whereClause?.sql) {\n sql += whereClause.sql;\n args.push(...whereClause.args.map(transformToSqlValue));\n }\n\n if (orderBy) {\n sql += ` ORDER BY ${sanitizeOrderBy(orderBy)}`;\n }\n\n if (typeof limit === 'number') {\n const safeLimit = Math.max(0, Number(limit));\n sql += ` LIMIT ${safeLimit}`;\n if (typeof offset === 'number') {\n const safeOffset = Math.max(0, Number(offset));\n sql += ` OFFSET ${safeOffset}`;\n }\n } else if (typeof offset === 'number') {\n const safeOffset = Math.max(0, Number(offset));\n sql += ` LIMIT 18446744073709551615 OFFSET ${safeOffset}`;\n }\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, args);\n return rows.map((row: RowDataPacket) => transformFromSqlRow<R>({ tableName, sqlRow: row as any }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_LOAD_MANY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async loadTotalCount({\n tableName,\n whereClause,\n }: {\n tableName: TABLE_NAMES;\n whereClause?: WhereClause;\n }): Promise<number> {\n try {\n let sql = `SELECT COUNT(*) as count FROM ${formatTableName(tableName, this.database)}`;\n const args: SqlParam[] = [];\n if (whereClause?.sql) {\n sql += whereClause.sql;\n args.push(...whereClause.args.map(transformToSqlValue));\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, args);\n return Number(rows[0]?.count ?? 0);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_LOAD_TOTAL_COUNT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n if (!ifNotExists.length) return;\n\n // Consult the init-scoped snapshot instead of the two server probes. A\n // table the snapshot has no columns for is treated as unknown, not absent:\n // it may exist on the server without the snapshot having seen it (created\n // out of band after the catalog read), so those fall through to probing.\n const snapshotColumns = this.schemaSnapshot?.columns.get(tableName.toLowerCase());\n let existing: Set<string>;\n if (snapshotColumns) {\n existing = snapshotColumns;\n } else {\n // Check if table exists first\n const db = await this.getDatabase();\n const tableExistsSql =\n 'SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = ? AND table_name = ?';\n const [tableRows] = await this.pool.execute<RowDataPacket[]>(tableExistsSql, [db ?? '', tableName]);\n const tableExists = Array.isArray(tableRows) && tableRows.length > 0 && (tableRows[0] as any).count > 0;\n\n if (!tableExists) {\n return; // Silently return if table doesn't exist\n }\n\n const params: SqlParam[] = [tableName];\n let sql = 'SELECT column_name FROM information_schema.columns WHERE table_name = ?';\n if (db) {\n sql += ' AND table_schema = ?';\n params.push(db);\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n // MySQL returns information_schema fields with uppercase keys through mysql2, but the\n // casing can vary with server settings, so read whichever key shape is present.\n existing = new Set(\n (rows || []).map((row: RowDataPacket) => String(row.column_name ?? row.COLUMN_NAME).toLowerCase()),\n );\n }\n\n for (const columnName of ifNotExists) {\n if (existing.has(columnName.toLowerCase())) {\n continue;\n }\n const column = schema[columnName];\n if (!column) continue;\n\n const isNullable = column.nullable !== false;\n const isKeyColumn = Boolean(column.primaryKey) || this.isKeyColumn(tableName, columnName);\n const parts: string[] = [\n quoteIdentifier(columnName, 'column name'),\n this.getSqlType(column.type, { isKey: isKeyColumn, isNullable }),\n ];\n if (column.nullable === false) {\n parts.push('NOT NULL');\n const defaultClause = this.getDefaultClause(column.type, { isNullable, isKey: isKeyColumn });\n if (defaultClause) {\n parts.push(defaultClause);\n }\n }\n\n const alterSql = `ALTER TABLE ${formatTableName(tableName, this.database)} ADD COLUMN ${parts.join(' ')}`;\n try {\n await this.pool.execute(alterSql);\n // `existing` is the snapshot's own set when one is installed, so this maintains it.\n existing.add(columnName.toLowerCase());\n } catch (error) {\n if ((error as any)?.code === 'ER_DUP_FIELDNAME') {\n continue;\n }\n throw new MastraError(\n {\n id: 'MYSQL_STORE_ALTER_TABLE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, columnName },\n },\n error,\n );\n }\n }\n }\n}\n\nconst ORDER_BY_PATTERN = /^`[A-Za-z0-9_]+`(?:\\s+(ASC|DESC))?$/i;\n\nfunction sanitizeOrderBy(orderBy: string): string {\n const clauses = orderBy\n .split(',')\n .map(clause => clause.trim())\n .filter(Boolean);\n\n if (!clauses.length) {\n throw new Error('ORDER BY clause cannot be empty.');\n }\n\n clauses.forEach(clause => {\n if (!ORDER_BY_PATTERN.test(clause)) {\n throw new Error(`Invalid ORDER BY clause: ${clause}`);\n }\n });\n\n return clauses.join(', ');\n}\n\n/**\n * Generates MySQL CREATE TABLE SQL for export.\n * @param tableName - Table name\n * @param schema - Column definitions\n * @param compositePrimaryKey - Optional composite primary key columns\n */\nexport function generateTableSQL({\n tableName,\n schema,\n compositePrimaryKey,\n}: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n compositePrimaryKey?: string[];\n}): string {\n const tableIdent = formatTableName(tableName);\n const columns = Object.entries(schema).map(([name, def]) => {\n const colName = quoteIdentifier(name, 'column name');\n const constraints: string[] = [];\n if (def.primaryKey && !compositePrimaryKey?.includes(name)) constraints.push('PRIMARY KEY');\n if (!def.nullable) constraints.push('NOT NULL');\n const sqlType = mapToMySqlType(def.type, Boolean(def.primaryKey || compositePrimaryKey?.includes(name)));\n return `${colName} ${sqlType} ${constraints.join(' ')}`;\n });\n\n const tableConstraints: string[] = [];\n if (compositePrimaryKey) {\n const pkCols = compositePrimaryKey.map(c => quoteIdentifier(c, 'primary key column')).join(', ');\n tableConstraints.push(`PRIMARY KEY (${pkCols})`);\n }\n\n return `CREATE TABLE IF NOT EXISTS ${tableIdent} (\\n${[...columns, ...tableConstraints].join(',\\n')}\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`;\n}\n\n/**\n * Generates MySQL CREATE INDEX SQL for export.\n */\nexport function generateIndexSQL(options: CreateIndexOptions): string {\n const { name, table, columns, unique = false } = options;\n const tableName = formatTableName(table as TABLE_NAMES);\n const indexName = quoteIdentifier(name, 'index name');\n const uniqueStr = unique ? 'UNIQUE ' : '';\n\n const columnsStr = columns\n .map(col => {\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n return `${quoteIdentifier(colName!, 'column name')} ${modifiers.join(' ')}`;\n }\n return quoteIdentifier(col, 'column name');\n })\n .join(', ');\n\n return `CREATE ${uniqueStr}INDEX ${indexName} ON ${tableName} (${columnsStr});`;\n}\n\nfunction mapToMySqlType(type: StorageColumn['type'], isKey = false): string {\n switch (type) {\n case 'text':\n return isKey ? 'VARCHAR(191)' : 'TEXT';\n case 'timestamp':\n return 'DATETIME(3)';\n case 'bigint':\n return 'BIGINT';\n case 'integer':\n return 'INT';\n case 'float':\n return 'FLOAT';\n case 'boolean':\n return 'BOOLEAN';\n case 'uuid':\n return 'VARCHAR(36)';\n case 'jsonb':\n return 'JSON';\n default:\n return 'TEXT';\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n TABLE_FAVORITES,\n TABLE_SCHEMAS,\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 CreateIndexOptions,\n AgentVersion,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class AgentsMySQL extends AgentsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the agents domain tables.\n * Currently no default indexes are defined for agents.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] }),\n generateTableSQL({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (AgentsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the agents domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return AgentsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for agents.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for agents domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_AGENTS,\n schema: AGENTS_SCHEMA,\n ifNotExists: ['status', 'authorId', 'visibility', 'favoriteCount'],\n });\n await this.operations.alterTable({\n tableName: TABLE_AGENT_VERSIONS,\n schema: AGENT_VERSIONS_SCHEMA,\n ifNotExists: ['mcpClients', 'requestContextSchema', 'workspace', 'skills', 'skillsFormat', 'durable'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_AGENT_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_AGENTS });\n }\n\n private safeParseJSON<T = unknown>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n return value as T;\n }\n }\n return value as T;\n }\n\n private parseRow(row: Record<string, unknown>): StorageAgentType {\n return {\n id: row.id as string,\n status: (row.status as 'draft' | 'published' | 'archived') ?? 'draft',\n activeVersionId: (row.activeVersionId as string) ?? undefined,\n authorId: (row.authorId as string) ?? undefined,\n visibility: (row.visibility as 'private' | 'public') ?? undefined,\n metadata: this.safeParseJSON(row.metadata),\n favoriteCount: row.favoriteCount === null || row.favoriteCount === undefined ? 0 : Number(row.favoriteCount),\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_AGENTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agent.id,\n status: 'draft',\n activeVersionId: null,\n authorId: agent.authorId ?? null,\n visibility: agent.visibility ?? null,\n metadata: agent.metadata ?? null,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n const versionId = crypto.randomUUID();\n try {\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 } catch (versionError) {\n try {\n await this.operations.delete({ tableName: TABLE_AGENTS, keys: { id: agent.id } });\n } catch (rollbackError) {\n // Log rollback failure but preserve original error\n console.error('Failed to rollback agent creation:', rollbackError);\n }\n throw versionError;\n }\n\n const created = await this.getById(agent.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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 const updateData: Record<string, unknown> = {\n updatedAt: new Date(),\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.operations.update({\n tableName: TABLE_AGENTS,\n keys: { id },\n data: updateData,\n });\n\n const updatedAgent = await this.getById(id);\n if (!updatedAgent) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.deleteVersionsByParentId(id);\n await this.operations.delete({ tableName: TABLE_AGENTS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n metadata,\n status,\n visibility,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 // Empty entityIds is short-circuit: no rows possible\n if (entityIds && entityIds.length === 0) {\n return { agents: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const agentsTable = formatTableName(TABLE_AGENTS);\n const favoritesTable = formatTableName(TABLE_FAVORITES);\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n\n // Determine if we need a JOIN\n const joinUserId = pinFavoritedFor;\n const useJoin = Boolean(joinUserId);\n\n if (status) {\n conditions.push(`a.${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n }\n\n if (authorId !== undefined) {\n conditions.push(`a.${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\n }\n\n if (visibility !== undefined) {\n conditions.push(`a.${quoteIdentifier('visibility', 'column name')} = ?`);\n queryParams.push(visibility);\n }\n\n if (entityIds && entityIds.length > 0) {\n const placeholders = entityIds.map(() => '?').join(', ');\n conditions.push(`a.${quoteIdentifier('id', 'column name')} IN (${placeholders})`);\n queryParams.push(...entityIds);\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('MYSQL', '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 if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(a.${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(a.${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n // Handle favoritedOnly\n if (useJoin && favoritedOnly) {\n conditions.push(`sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL`);\n } else if (favoritedOnly) {\n // Defensive: favoritedOnly with no userId can never match a real row\n conditions.push('1=0');\n }\n\n const joinClause = useJoin\n ? `LEFT JOIN ${favoritesTable} sr ON sr.${quoteIdentifier('entityType', 'column name')} = 'agent' AND sr.${quoteIdentifier('entityId', 'column name')} = a.${quoteIdentifier('id', 'column name')} AND sr.${quoteIdentifier('userId', 'column name')} = ?`\n : '';\n\n const joinParams: any[] = useJoin && joinUserId ? [joinUserId] : [];\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const [countRows] = await this.pool.query<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${agentsTable} a ${joinClause} ${whereClause}`,\n [...joinParams, ...queryParams],\n );\n const total = parseInt(countRows[0]?.count ?? '0', 10);\n\n if (total === 0) {\n return {\n agents: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const hasMore = perPageInput === false ? false : offset + perPage < total;\n\n // Build ORDER BY\n let orderByClause: string;\n if (useJoin) {\n // Pin favorited agents first\n orderByClause = `CASE WHEN sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL THEN 0 ELSE 1 END ASC, a.${quoteIdentifier(field, 'column name')} ${direction}`;\n } else {\n orderByClause = `a.${quoteIdentifier(field, 'column name')} ${direction}`;\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>(\n `SELECT a.* FROM ${agentsTable} a ${joinClause} ${whereClause} ORDER BY ${orderByClause} LIMIT ? OFFSET ?`,\n [...joinParams, ...queryParams, limitValue, offset],\n );\n\n const agents = rows.map(row => this.parseRow(row));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.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 durable: input.durable ?? 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('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_AGENT_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [agentId, versionNumber],\n },\n limit: 1,\n });\n\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n args: [agentId],\n },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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 const whereClause = {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n args: [agentId],\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_AGENT_VERSIONS, whereClause });\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\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('MYSQL', '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.operations.delete({ tableName: TABLE_AGENT_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_AGENT_VERSIONS)} WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_AGENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('agentId', 'column name')} = ?`,\n args: [agentId],\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: Record<string, unknown>): AgentVersion {\n return {\n id: row.id as string,\n agentId: row.agentId as string,\n versionNumber: Number(row.versionNumber),\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n instructions: this.deserializeInstructions(row.instructions as string),\n model: this.safeParseJSON(row.model) as AgentVersion['model'],\n tools: this.safeParseJSON(row.tools) as AgentVersion['tools'],\n defaultOptions: this.safeParseJSON(row.defaultOptions) as AgentVersion['defaultOptions'],\n workflows: this.safeParseJSON(row.workflows) as AgentVersion['workflows'],\n agents: this.safeParseJSON(row.agents) as AgentVersion['agents'],\n integrationTools: this.safeParseJSON(row.integrationTools) as AgentVersion['integrationTools'],\n inputProcessors: this.safeParseJSON(row.inputProcessors) as AgentVersion['inputProcessors'],\n outputProcessors: this.safeParseJSON(row.outputProcessors) as AgentVersion['outputProcessors'],\n memory: this.safeParseJSON(row.memory) as AgentVersion['memory'],\n scorers: this.safeParseJSON(row.scorers) as AgentVersion['scorers'],\n mcpClients: this.safeParseJSON(row.mcpClients) as AgentVersion['mcpClients'],\n requestContextSchema: this.safeParseJSON(row.requestContextSchema) as AgentVersion['requestContextSchema'],\n workspace: this.safeParseJSON(row.workspace) as AgentVersion['workspace'],\n skills: this.safeParseJSON(row.skills) as AgentVersion['skills'],\n skillsFormat: row.skillsFormat as 'xml' | 'json' | 'markdown' | undefined,\n durable: this.safeParseJSON(row.durable) as AgentVersion['durable'],\n changedFields: this.safeParseJSON(row.changedFields) as AgentVersion['changedFields'],\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n}\n","import type {\n BackgroundTask,\n BackgroundTaskStatus,\n TaskFilter,\n TaskListResult,\n UpdateBackgroundTask,\n UpdateBackgroundTaskOptions,\n} from '@mastra/core/background-tasks';\nimport { BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS } from '@mastra/core/storage';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport type { Pool, ResultSetHeader, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier, transformToSqlValue } from '../utils';\n\nfunction serializeJson(v: unknown): any {\n if (typeof v === 'object' && v != null) return JSON.stringify(v);\n return v ?? null;\n}\n\nfunction parseJson(val: unknown): any {\n if (val == null) 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\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n return {\n id: String(row.id),\n status: String(row.status) as BackgroundTaskStatus,\n toolName: String(row.tool_name),\n toolCallId: String(row.tool_call_id),\n args: parseJson(row.args) ?? {},\n agentId: String(row.agent_id),\n threadId: row.thread_id != null ? String(row.thread_id) : undefined,\n resourceId: row.resource_id != null ? String(row.resource_id) : undefined,\n runId: String(row.run_id),\n result: parseJson(row.result),\n error: parseJson(row.error),\n suspendPayload: parseJson(row.suspend_payload),\n retryCount: Number(row.retry_count),\n maxRetries: Number(row.max_retries),\n timeoutMs: Number(row.timeout_ms),\n createdAt: parseDateTime(row.createdAt)!,\n startedAt: parseDateTime(row.startedAt),\n suspendedAt: parseDateTime(row.suspendedAt),\n completedAt: parseDateTime(row.completedAt),\n ownerId: row.ownerId != null ? String(row.ownerId) : undefined,\n leaseExpiresAt: parseDateTime(row.leaseExpiresAt),\n };\n}\n\nexport class BackgroundTasksMySQL extends BackgroundTasksStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_BACKGROUND_TASKS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (BackgroundTasksMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n });\n // Backfill columns added after the initial schema shipped.\n await this.operations.alterTable({\n tableName: TABLE_BACKGROUND_TASKS as any,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n ifNotExists: ['suspend_payload', 'suspendedAt', 'ownerId', 'leaseExpiresAt'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_bg_tasks_status_created_at_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['status', 'createdAt'],\n },\n {\n name: `${prefix}mastra_bg_tasks_agent_status_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['agent_id', 'status'],\n },\n {\n name: `${prefix}mastra_bg_tasks_thread_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['thread_id', 'createdAt'],\n },\n {\n name: `${prefix}mastra_bg_tasks_tool_call_idx`,\n table: TABLE_BACKGROUND_TASKS,\n columns: ['tool_call_id'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n }),\n );\n\n for (const idx of BackgroundTasksMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return BackgroundTasksMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_BACKGROUND_TASKS)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('tool_call_id', 'column name')}, ${quoteIdentifier('tool_name', 'column name')}, ${quoteIdentifier('agent_id', 'column name')}, ${quoteIdentifier('thread_id', 'column name')}, ${quoteIdentifier('resource_id', 'column name')}, ${quoteIdentifier('run_id', 'column name')}, ${quoteIdentifier('status', 'column name')}, ${quoteIdentifier('args', 'column name')}, ${quoteIdentifier('result', 'column name')}, ${quoteIdentifier('error', 'column name')}, ${quoteIdentifier('suspend_payload', 'column name')}, ${quoteIdentifier('retry_count', 'column name')}, ${quoteIdentifier('max_retries', 'column name')}, ${quoteIdentifier('timeout_ms', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('startedAt', 'column name')}, ${quoteIdentifier('suspendedAt', 'column name')}, ${quoteIdentifier('completedAt', 'column name')}, ${quoteIdentifier('ownerId', 'column name')}, ${quoteIdentifier('leaseExpiresAt', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n task.id,\n task.toolCallId,\n task.toolName,\n task.agentId,\n task.threadId ?? null,\n task.resourceId ?? null,\n task.runId,\n task.status,\n JSON.stringify(task.args),\n task.result ? JSON.stringify(task.result) : null,\n task.error ? JSON.stringify(task.error) : null,\n task.suspendPayload ? JSON.stringify(task.suspendPayload) : null,\n task.retryCount,\n task.maxRetries,\n task.timeoutMs,\n transformToSqlValue(task.createdAt),\n transformToSqlValue(task.startedAt),\n transformToSqlValue(task.suspendedAt),\n transformToSqlValue(task.completedAt),\n task.ownerId ?? null,\n transformToSqlValue(task.leaseExpiresAt),\n ],\n );\n }\n\n async updateTask(\n taskId: string,\n update: UpdateBackgroundTask,\n options?: UpdateBackgroundTaskOptions,\n ): Promise<boolean> {\n const setClauses: string[] = [];\n const params: (string | number | null)[] = [];\n\n if ('status' in update) {\n setClauses.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(update.status as string);\n }\n if ('result' in update) {\n setClauses.push(`${quoteIdentifier('result', 'column name')} = ?`);\n params.push(serializeJson(update.result));\n }\n if ('error' in update) {\n setClauses.push(`${quoteIdentifier('error', 'column name')} = ?`);\n params.push(serializeJson(update.error));\n }\n if ('suspendPayload' in update) {\n setClauses.push(`${quoteIdentifier('suspend_payload', 'column name')} = ?`);\n params.push(serializeJson(update.suspendPayload));\n }\n if ('retryCount' in update) {\n setClauses.push(`${quoteIdentifier('retry_count', 'column name')} = ?`);\n params.push(update.retryCount as number);\n }\n if ('startedAt' in update) {\n setClauses.push(`${quoteIdentifier('startedAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.startedAt));\n }\n if ('suspendedAt' in update) {\n setClauses.push(`${quoteIdentifier('suspendedAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.suspendedAt));\n }\n if ('completedAt' in update) {\n setClauses.push(`${quoteIdentifier('completedAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.completedAt));\n }\n if ('ownerId' in update) {\n setClauses.push(`${quoteIdentifier('ownerId', 'column name')} = ?`);\n params.push(update.ownerId ?? null);\n }\n if ('leaseExpiresAt' in update) {\n setClauses.push(`${quoteIdentifier('leaseExpiresAt', 'column name')} = ?`);\n params.push(transformToSqlValue(update.leaseExpiresAt));\n }\n\n if (setClauses.length === 0) return false;\n\n params.push(taskId);\n const predicates: string[] = [];\n if (options?.expectedStatus) {\n predicates.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(options.expectedStatus);\n }\n if (options?.expectedOwnerId !== undefined) {\n if (options.expectedOwnerId === null) {\n predicates.push(`${quoteIdentifier('ownerId', 'column name')} IS NULL`);\n } else {\n predicates.push(`${quoteIdentifier('ownerId', 'column name')} = ?`);\n params.push(options.expectedOwnerId);\n }\n }\n if (options?.expectedLeaseExpiresAt !== undefined) {\n if (options.expectedLeaseExpiresAt === null) {\n predicates.push(`${quoteIdentifier('leaseExpiresAt', 'column name')} IS NULL`);\n } else {\n predicates.push(`${quoteIdentifier('leaseExpiresAt', 'column name')} = ?`);\n params.push(transformToSqlValue(options.expectedLeaseExpiresAt));\n }\n }\n const predicateSql = predicates.length > 0 ? ` AND ${predicates.join(' AND ')}` : '';\n const [result] = await this.pool.execute<ResultSetHeader>(\n `UPDATE ${formatTableName(TABLE_BACKGROUND_TASKS)} SET ${setClauses.join(', ')} WHERE ${quoteIdentifier('id', 'column name')} = ?${predicateSql}`,\n params,\n );\n return result.affectedRows > 0;\n }\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [taskId],\n );\n const row = rows[0];\n return row ? rowToTask(row as Record<string, any>) : null;\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n const placeholders = statuses.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier('status', 'column name')} IN (${placeholders})`);\n params.push(...statuses);\n }\n if (filter.agentId) {\n conditions.push(`${quoteIdentifier('agent_id', 'column name')} = ?`);\n params.push(filter.agentId);\n }\n if (filter.threadId) {\n conditions.push(`${quoteIdentifier('thread_id', 'column name')} = ?`);\n params.push(filter.threadId);\n }\n if (filter.runId) {\n conditions.push(`${quoteIdentifier('run_id', 'column name')} = ?`);\n params.push(filter.runId);\n }\n if (filter.resourceId) {\n conditions.push(`${quoteIdentifier('resource_id', 'column name')} = ?`);\n params.push(filter.resourceId);\n }\n if (filter.toolName) {\n conditions.push(`${quoteIdentifier('tool_name', 'column name')} = ?`);\n params.push(filter.toolName);\n }\n if (filter.toolCallId) {\n conditions.push(`${quoteIdentifier('tool_call_id', 'column name')} = ?`);\n params.push(filter.toolCallId);\n }\n // Date range filtering\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdentifier('startedAt', 'column name')\n : filter.dateFilterBy === 'suspendedAt'\n ? quoteIdentifier('suspendedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdentifier('completedAt', 'column name')\n : quoteIdentifier('createdAt', 'column name');\n if (filter.fromDate) {\n conditions.push(`${dateCol} >= ?`);\n params.push(transformToSqlValue(filter.fromDate));\n }\n if (filter.toDate) {\n conditions.push(`${dateCol} < ?`);\n params.push(transformToSqlValue(filter.toDate));\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Count total matching rows (before pagination)\n const [countRows] = await this.pool.query<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} ${where}`,\n [...params],\n );\n const total = Number(countRows[0]?.count ?? 0);\n\n const orderCol =\n filter.orderBy === 'startedAt'\n ? quoteIdentifier('startedAt', 'column name')\n : filter.orderBy === 'suspendedAt'\n ? quoteIdentifier('suspendedAt', 'column name')\n : filter.orderBy === 'completedAt'\n ? quoteIdentifier('completedAt', 'column name')\n : quoteIdentifier('createdAt', 'column name');\n const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n\n let sql = `SELECT * FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} ${where} ORDER BY ${orderCol} ${direction}`;\n\n if (filter.perPage != null) {\n sql += ' LIMIT ?';\n params.push(filter.perPage);\n if (filter.page != null) {\n sql += ' OFFSET ?';\n params.push(filter.page * filter.perPage);\n }\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>(sql, params);\n return { tasks: rows.map(row => rowToTask(row as Record<string, any>)), total };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [taskId],\n );\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n\n if (filter.status) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n const placeholders = statuses.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier('status', 'column name')} IN (${placeholders})`);\n params.push(...statuses);\n }\n // Date range filtering\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdentifier('startedAt', 'column name')\n : filter.dateFilterBy === 'suspendedAt'\n ? quoteIdentifier('suspendedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdentifier('completedAt', 'column name')\n : quoteIdentifier('createdAt', 'column name');\n if (filter.fromDate) {\n conditions.push(`${dateCol} >= ?`);\n params.push(transformToSqlValue(filter.fromDate));\n }\n if (filter.toDate) {\n conditions.push(`${dateCol} < ?`);\n params.push(transformToSqlValue(filter.toDate));\n }\n if (filter.agentId) {\n conditions.push(`${quoteIdentifier('agent_id', 'column name')} = ?`);\n params.push(filter.agentId);\n }\n if (filter.runId) {\n conditions.push(`${quoteIdentifier('run_id', 'column name')} = ?`);\n params.push(filter.runId);\n }\n\n if (conditions.length === 0) return; // Safety: don't delete everything\n\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${conditions.join(' AND ')}`,\n params,\n );\n }\n\n async getRunningCount(): Promise<number> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('status', 'column name')} = ?`,\n ['running'],\n );\n return Number(rows[0]?.count ?? 0);\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${formatTableName(TABLE_BACKGROUND_TASKS)} WHERE ${quoteIdentifier('status', 'column name')} = ? AND ${quoteIdentifier('agent_id', 'column name')} = ?`,\n ['running', agentId],\n );\n return Number(rows[0]?.count ?? 0);\n }\n}\n","import { BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA } from '@mastra/core/storage';\nimport type { StorageBlobEntry } from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformToSqlValue } from '../utils';\n\nconst INSERT_IGNORE_SQL = `INSERT IGNORE INTO ${formatTableName(TABLE_SKILL_BLOBS)} (${['hash', 'content', 'size', 'mimeType', 'createdAt'].map(column => quoteIdentifier(column, 'column name')).join(', ')}) VALUES (?, ?, ?, ?, ?)`;\n\nexport class BlobsMySQL extends BlobStore {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n\n constructor({ pool, operations }: { pool: Pool; operations: StoreOperationsMySQL }) {\n super();\n this.pool = pool;\n this.operations = operations;\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SKILL_BLOBS, schema: SKILL_BLOBS_SCHEMA });\n }\n\n async put(entry: StorageBlobEntry): Promise<void> {\n await this.pool.execute(INSERT_IGNORE_SQL, this.#insertArgs(entry));\n }\n\n #insertArgs(entry: StorageBlobEntry) {\n return [\n entry.hash,\n entry.content,\n entry.size,\n entry.mimeType ?? null,\n transformToSqlValue(entry.createdAt ?? new Date()),\n ];\n }\n\n async get(hash: string): Promise<StorageBlobEntry | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} = ?`,\n [hash],\n );\n if (!rows.length) return null;\n return this.#parseRow(rows[0]!);\n }\n\n async has(hash: string): Promise<boolean> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT 1 FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} = ? LIMIT 1`,\n [hash],\n );\n return rows.length > 0;\n }\n\n async delete(hash: string): Promise<boolean> {\n const [result] = await this.pool.execute<any>(\n `DELETE FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} = ?`,\n [hash],\n );\n return result.affectedRows > 0;\n }\n\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n await this.operations.withTransaction(async connection => {\n for (const entry of entries) {\n await connection.execute(INSERT_IGNORE_SQL, this.#insertArgs(entry));\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 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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILL_BLOBS)} WHERE ${quoteIdentifier('hash', 'column name')} IN (${placeholders})`,\n batch,\n );\n for (const row of 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.operations.clearTable({ 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: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n}\n","import {\n ChannelsStorage,\n TABLE_CHANNEL_INSTALLATIONS,\n TABLE_CHANNEL_CONFIG,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { ChannelInstallation, ChannelConfig, CreateIndexOptions } from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformToSqlValue, parseDateTime } from '../utils';\n\nexport class ChannelsMySQL extends ChannelsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ChannelsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_CHANNEL_INSTALLATIONS,\n schema: TABLE_SCHEMAS[TABLE_CHANNEL_INSTALLATIONS],\n });\n await this.operations.createTable({\n tableName: TABLE_CHANNEL_CONFIG,\n schema: TABLE_SCHEMAS[TABLE_CHANNEL_CONFIG],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_channel_installations_webhook`,\n table: TABLE_CHANNEL_INSTALLATIONS,\n columns: ['webhookId'],\n unique: true,\n },\n {\n name: `${prefix}idx_channel_installations_platform_agent`,\n table: TABLE_CHANNEL_INSTALLATIONS,\n columns: ['platform', 'agentId'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of ChannelsMySQL.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n\n for (const idx of ChannelsMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ChannelsMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_CHANNEL_INSTALLATIONS });\n await this.operations.clearTable({ tableName: TABLE_CHANNEL_CONFIG });\n }\n\n async saveInstallation(installation: ChannelInstallation): Promise<void> {\n const now = new Date();\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('platform', 'column name')}, ${quoteIdentifier('agentId', 'column name')}, ${quoteIdentifier('status', 'column name')}, ${quoteIdentifier('webhookId', 'column name')}, ${quoteIdentifier('data', 'column name')}, ${quoteIdentifier('configHash', 'column name')}, ${quoteIdentifier('error', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE ${quoteIdentifier('platform', 'column name')} = VALUES(${quoteIdentifier('platform', 'column name')}), ${quoteIdentifier('agentId', 'column name')} = VALUES(${quoteIdentifier('agentId', 'column name')}), ${quoteIdentifier('status', 'column name')} = VALUES(${quoteIdentifier('status', 'column name')}), ${quoteIdentifier('webhookId', 'column name')} = VALUES(${quoteIdentifier('webhookId', 'column name')}), ${quoteIdentifier('data', 'column name')} = VALUES(${quoteIdentifier('data', 'column name')}), ${quoteIdentifier('configHash', 'column name')} = VALUES(${quoteIdentifier('configHash', 'column name')}), ${quoteIdentifier('error', 'column name')} = VALUES(${quoteIdentifier('error', 'column name')}), ${quoteIdentifier('updatedAt', 'column name')} = VALUES(${quoteIdentifier('updatedAt', 'column name')})`,\n [\n installation.id,\n installation.platform,\n installation.agentId,\n installation.status,\n installation.webhookId ?? null,\n JSON.stringify(installation.data),\n installation.configHash ?? null,\n installation.error ?? null,\n transformToSqlValue(installation.createdAt ?? now),\n transformToSqlValue(now),\n ],\n );\n }\n\n async getInstallation(id: string): Promise<ChannelInstallation | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n const row = rows[0];\n return row ? this.parseInstallationRow(row) : null;\n }\n\n async getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('platform', 'column name')} = ? AND ${quoteIdentifier('agentId', 'column name')} = ? ORDER BY CASE ${quoteIdentifier('status', 'column name')} WHEN 'active' THEN 0 WHEN 'pending' THEN 1 ELSE 2 END, ${quoteIdentifier('updatedAt', 'column name')} DESC LIMIT 1`,\n [platform, agentId],\n );\n const row = rows[0];\n return row ? this.parseInstallationRow(row) : null;\n }\n\n async getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('webhookId', 'column name')} = ?`,\n [webhookId],\n );\n const row = rows[0];\n return row ? this.parseInstallationRow(row) : null;\n }\n\n async listInstallations(platform: string): Promise<ChannelInstallation[]> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('platform', 'column name')} = ? ORDER BY ${quoteIdentifier('createdAt', 'column name')} DESC`,\n [platform],\n );\n return rows.map(row => this.parseInstallationRow(row));\n }\n\n async deleteInstallation(id: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_CHANNEL_INSTALLATIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n }\n\n async saveConfig(config: ChannelConfig): Promise<void> {\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_CHANNEL_CONFIG)} (${quoteIdentifier('platform', 'column name')}, ${quoteIdentifier('data', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')}) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE ${quoteIdentifier('data', 'column name')} = VALUES(${quoteIdentifier('data', 'column name')}), ${quoteIdentifier('updatedAt', 'column name')} = VALUES(${quoteIdentifier('updatedAt', 'column name')})`,\n [config.platform, JSON.stringify(config.data), transformToSqlValue(config.updatedAt)],\n );\n }\n\n async getConfig(platform: string): Promise<ChannelConfig | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_CHANNEL_CONFIG)} WHERE ${quoteIdentifier('platform', 'column name')} = ?`,\n [platform],\n );\n const row = rows[0];\n if (!row) return null;\n return {\n platform: row.platform as string,\n data: typeof row.data === 'string' ? JSON.parse(row.data || '{}') : row.data,\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n async deleteConfig(platform: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_CHANNEL_CONFIG)} WHERE ${quoteIdentifier('platform', 'column name')} = ?`,\n [platform],\n );\n }\n\n private parseInstallationRow(row: Record<string, unknown>): ChannelInstallation {\n return {\n id: row.id as string,\n platform: row.platform as string,\n agentId: row.agentId as string,\n status: row.status as 'pending' | 'active' | 'error',\n webhookId: (row.webhookId as string) || undefined,\n data: typeof row.data === 'string' ? JSON.parse(row.data || '{}') : row.data,\n configHash: (row.configHash as string) || undefined,\n error: (row.error as string) || undefined,\n createdAt: parseDateTime(row.createdAt as string | number | Date | null | undefined) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt as string | number | Date | null | undefined) ?? new Date(),\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n DATASETS_SCHEMA,\n DATASET_ITEMS_SCHEMA,\n DATASET_VERSIONS_SCHEMA,\n DatasetsStorage,\n calculatePagination,\n normalizePerPage,\n resolveListOrderBy,\n hasErrorCode,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n DeleteDatasetItemInput,\n PurgeDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n DatasetTenancyFilters,\n TargetType,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier, transformToSqlValue } from '../utils';\n\nfunction parseJSON<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as T;\n } catch {\n // mysql2 auto-parses JSON columns, so a non-JSON string here means the\n // stored payload was a JSON string scalar (e.g. input: 'foo' was stored\n // as `\"foo\"` and the driver already unwrapped it). Return it as-is.\n return value as unknown as T;\n }\n }\n if (typeof value === 'object') return value as T;\n return value as T;\n}\n\nfunction parseOptionalJSON<T>(value: unknown, emptyValue: null | undefined): T | null | undefined {\n return value === null || value === undefined ? emptyValue : parseJSON<T>(value);\n}\n\nfunction jsonArg(value: unknown): string | null {\n return value === undefined || value === null ? null : JSON.stringify(value);\n}\n\nfunction jsonDataArg(value: unknown): string | null {\n return value === undefined ? null : JSON.stringify(value);\n}\n\n// Read authored JSON as text so the driver cannot collapse JSON null into SQL NULL\n// or leave a JSON-looking string indistinguishable from serialized JSON.\nconst ITEM_SELECT_COLUMNS = Object.keys(DATASET_ITEMS_SCHEMA)\n .map(column => {\n const name = quoteIdentifier(column, 'column name');\n return ['input', 'groundTruth', 'expectedTrajectory'].includes(column)\n ? `CAST(${name} AS CHAR CHARACTER SET utf8mb4) AS ${name}`\n : name;\n })\n .join(', ');\n\nexport class DatasetsMySQL extends DatasetsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS] as const;\n\n /**\n * Item-level tool mocks are not persisted by the MySQL adapter. Reject writes\n * that carry them so the feature fails loudly here instead of silently dropping\n * the mocks and then running tools live during experiments.\n */\n #rejectToolMocks(toolMocks: unknown): void {\n if (Array.isArray(toolMocks) && toolMocks.length > 0) {\n throw new MastraError({\n id: 'MYSQL_DATASET_TOOL_MOCKS_UNSUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Tool mocks are not supported on the MySQL storage adapter. Use a supported adapter (LibSQL, PostgreSQL, MongoDB, or Spanner) to persist dataset item tool mocks.',\n });\n }\n }\n\n /**\n * Returns default index definitions for the datasets domain tables.\n * Currently no default indexes are defined for datasets.\n */\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_dataset_items_dataset_externalid_version`,\n table: TABLE_DATASET_ITEMS,\n columns: ['datasetId', 'externalId', 'datasetVersion'],\n },\n ];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_DATASETS, schema: TABLE_SCHEMAS[TABLE_DATASETS] }),\n generateTableSQL({\n tableName: TABLE_DATASET_ITEMS,\n schema: TABLE_SCHEMAS[TABLE_DATASET_ITEMS],\n compositePrimaryKey: ['id', 'datasetVersion'],\n }),\n generateTableSQL({ tableName: TABLE_DATASET_VERSIONS, schema: TABLE_SCHEMAS[TABLE_DATASET_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (DatasetsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the datasets domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return DatasetsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for datasets.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_DATASETS, schema: DATASETS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_DATASET_ITEMS as any, schema: DATASET_ITEMS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: DATASET_VERSIONS_SCHEMA });\n // Backfill tenancy + candidate identity columns on pre-existing tables so\n // older deployments keep working when they upgrade in place.\n await this.operations.alterTable({\n tableName: TABLE_DATASETS,\n schema: DATASETS_SCHEMA,\n ifNotExists: [\n 'organizationId',\n 'projectId',\n 'candidateKey',\n 'candidateId',\n 'requestContextSchema',\n 'tags',\n 'targetType',\n 'targetIds',\n 'scorerIds',\n ],\n });\n await this.operations.alterTable({\n tableName: TABLE_DATASET_ITEMS as any,\n schema: DATASET_ITEMS_SCHEMA,\n ifNotExists: [\n 'organizationId',\n 'projectId',\n 'requestContext',\n 'source',\n 'expectedTrajectory',\n 'toolMocks',\n 'unmockedToolPolicy',\n 'scorerIds',\n 'externalId',\n ],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASET_VERSIONS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASET_ITEMS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)}`);\n }\n\n private async experimentTablesExist(): Promise<boolean> {\n const [rows] = await this.pool.execute<any[]>(\n `SELECT COUNT(*) AS c FROM information_schema.tables\n WHERE table_schema = DATABASE() AND table_name IN (?, ?)`,\n [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS],\n );\n const row = Array.isArray(rows) ? (rows[0] as { c?: number | string } | undefined) : undefined;\n return Number(row?.c ?? 0) === 2;\n }\n\n // --- Row transformers ---\n\n private mapDataset(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 | null) ?? undefined,\n metadata: parseJSON<Record<string, unknown>>(row.metadata),\n inputSchema: parseJSON<Record<string, unknown>>(row.inputSchema),\n groundTruthSchema: parseJSON<Record<string, unknown>>(row.groundTruthSchema),\n requestContextSchema: parseJSON<Record<string, unknown>>(row.requestContextSchema),\n tags: parseJSON<string[]>(row.tags),\n targetType: (row.targetType as TargetType | null | undefined) ?? undefined,\n targetIds: parseJSON<string[]>(row.targetIds),\n scorerIds: parseJSON<string[]>(row.scorerIds),\n version: row.version as number,\n organizationId: (row.organizationId as string | null | undefined) ?? null,\n projectId: (row.projectId as string | null | undefined) ?? null,\n candidateKey: (row.candidateKey as string | null | undefined) ?? null,\n candidateId: (row.candidateId as string | null | undefined) ?? null,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapItem(row: Record<string, any>): DatasetItem {\n const metadata = row.metadata ? parseJSON<Record<string, unknown>>(row.metadata) : undefined;\n const emptyValue = metadata?.__purged === true ? null : undefined;\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n externalId: (row.externalId as string | null | undefined) ?? null,\n organizationId: (row.organizationId as string | null | undefined) ?? null,\n projectId: (row.projectId as string | null | undefined) ?? null,\n input: row.input === null ? null : parseJSON<Record<string, unknown>>(row.input),\n groundTruth: parseOptionalJSON<Record<string, unknown>>(row.groundTruth, emptyValue),\n expectedTrajectory: parseOptionalJSON<DatasetItem['expectedTrajectory']>(row.expectedTrajectory, emptyValue),\n toolMocks: parseOptionalJSON<DatasetItem['toolMocks']>(row.toolMocks, emptyValue),\n unmockedToolPolicy: row.unmockedToolPolicy ?? emptyValue,\n scorerIds: parseOptionalJSON<string[]>(row.scorerIds, emptyValue),\n requestContext: parseOptionalJSON<Record<string, unknown>>(row.requestContext, emptyValue),\n metadata,\n source: parseOptionalJSON<DatasetItem['source']>(row.source, emptyValue),\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapItemFull(row: Record<string, any>): DatasetItemRow {\n const metadata = row.metadata ? parseJSON<Record<string, unknown>>(row.metadata) : undefined;\n const emptyValue = metadata?.__purged === true ? null : undefined;\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n externalId: (row.externalId as string | null | undefined) ?? null,\n organizationId: (row.organizationId as string | null | undefined) ?? null,\n projectId: (row.projectId as string | null | undefined) ?? null,\n validTo: row.validTo as number | null,\n isDeleted: Boolean(row.isDeleted),\n input: row.input === null ? null : parseJSON<Record<string, unknown>>(row.input),\n groundTruth: parseOptionalJSON<Record<string, unknown>>(row.groundTruth, emptyValue),\n expectedTrajectory: parseOptionalJSON<DatasetItem['expectedTrajectory']>(row.expectedTrajectory, emptyValue),\n toolMocks: parseOptionalJSON<DatasetItem['toolMocks']>(row.toolMocks, emptyValue),\n unmockedToolPolicy: row.unmockedToolPolicy ?? emptyValue,\n scorerIds: parseOptionalJSON<string[]>(row.scorerIds, emptyValue),\n requestContext: parseOptionalJSON<Record<string, unknown>>(row.requestContext, emptyValue),\n metadata,\n source: parseOptionalJSON<DatasetItem['source']>(row.source, emptyValue),\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapVersion(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: parseDateTime(row.createdAt) ?? new Date(),\n };\n }\n\n // --- Dataset CRUD ---\n\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n try {\n const id = input.id ?? globalThis.crypto.randomUUID();\n if (input.id !== undefined) this.validateCallerDefinedDatasetId(input.id);\n const now = new Date();\n\n const insert =\n input.id === undefined\n ? this.operations.insert.bind(this.operations)\n : this.operations.insertOnly.bind(this.operations);\n await insert({\n tableName: TABLE_DATASETS,\n record: {\n id,\n name: input.name,\n description: input.description ?? null,\n metadata: jsonArg(input.metadata),\n inputSchema: jsonArg(input.inputSchema),\n groundTruthSchema: jsonArg(input.groundTruthSchema),\n requestContextSchema: jsonArg(input.requestContextSchema),\n targetType: input.targetType ?? null,\n targetIds: jsonArg(input.targetIds),\n scorerIds: jsonArg(input.scorerIds),\n version: 0,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n candidateKey: input.candidateKey ?? null,\n candidateId: input.candidateId ?? null,\n createdAt: now,\n updatedAt: now,\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 requestContextSchema: input.requestContextSchema ?? undefined,\n targetType: input.targetType ?? undefined,\n targetIds: input.targetIds ?? undefined,\n scorerIds: input.scorerIds ?? undefined,\n version: 0,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n candidateKey: input.candidateKey ?? null,\n candidateId: input.candidateId ?? null,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (input.id !== undefined && hasErrorCode(error, new Set([1062, 'ER_DUP_ENTRY']))) {\n const existing = await this.getDatasetById({ id: input.id });\n if (existing) return this.resolveExistingDataset(existing, { ...input, id: input.id });\n }\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_CREATE_DATASET_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getDatasetById({\n id,\n filters,\n }: {\n id: string;\n filters?: DatasetTenancyFilters;\n }): Promise<DatasetRecord | null> {\n try {\n // prepareWhereClause ignores undefined values, so this scopes the SELECT only\n // when the caller passed tenancy filters.\n const row = await this.operations.load<Record<string, any>>({\n tableName: TABLE_DATASETS,\n keys: {\n id,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n },\n });\n return row ? this.mapDataset(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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, filters: args.filters });\n if (!existing) {\n throw new MastraError({\n id: 'MYSQL_UPDATE_DATASET_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.id },\n });\n }\n\n const data: Record<string, any> = { updatedAt: new Date() };\n\n if (args.name !== undefined) data.name = args.name;\n if (args.description !== undefined) data.description = args.description;\n if (args.metadata !== undefined) data.metadata = JSON.stringify(args.metadata);\n if (args.inputSchema !== undefined)\n data.inputSchema = args.inputSchema === null ? null : JSON.stringify(args.inputSchema);\n if (args.groundTruthSchema !== undefined)\n data.groundTruthSchema = args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema);\n if (args.requestContextSchema !== undefined)\n data.requestContextSchema =\n args.requestContextSchema === null ? null : JSON.stringify(args.requestContextSchema);\n if (args.tags !== undefined) data.tags = args.tags === null ? null : JSON.stringify(args.tags);\n if (args.targetType !== undefined) data.targetType = args.targetType;\n if (args.targetIds !== undefined)\n data.targetIds = args.targetIds === null ? null : JSON.stringify(args.targetIds);\n if (args.scorerIds !== undefined)\n data.scorerIds = args.scorerIds === null ? null : JSON.stringify(args.scorerIds);\n\n await this.operations.update({\n tableName: TABLE_DATASETS,\n keys: { id: args.id },\n data,\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 requestContextSchema:\n (args.requestContextSchema !== undefined ? args.requestContextSchema : existing.requestContextSchema) ??\n undefined,\n tags: (args.tags !== undefined ? args.tags : existing.tags) ?? undefined,\n targetType: (args.targetType !== undefined ? args.targetType : existing.targetType) ?? undefined,\n targetIds: (args.targetIds !== undefined ? args.targetIds : existing.targetIds) ?? undefined,\n scorerIds: (args.scorerIds !== undefined ? args.scorerIds : existing.scorerIds) ?? undefined,\n updatedAt: data.updatedAt,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPDATE_DATASET_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteDataset({ id, filters }: { id: string; filters?: DatasetTenancyFilters }): Promise<void> {\n // Atomic gate + cascade under SELECT ... FOR UPDATE, so a concurrent\n // delete/recreate under a different tenant cannot let a scoped delete hit\n // another tenant's row. Silent no-op on tenancy mismatch.\n const filterCols: string[] = [];\n const filterVals: any[] = [];\n if (filters?.organizationId !== undefined) {\n filterCols.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n filterVals.push(filters.organizationId);\n }\n if (filters?.projectId !== undefined) {\n filterCols.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n filterVals.push(filters.projectId);\n }\n const scopedWhere = ['id = ?', ...filterCols].join(' AND ');\n\n // Probe for experiment tables via information_schema outside the transaction\n // rather than running DMLs and swallowing \"table missing\" errors. Even though\n // ER_NO_SUCH_TABLE (1146) does not abort an InnoDB transaction, resolving\n // existence up front keeps the transaction focused on real writes.\n const experimentTablesExist = await this.experimentTablesExist();\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const [rows] = await connection.execute<any[]>(\n `SELECT id FROM ${formatTableName(TABLE_DATASETS)} WHERE ${scopedWhere} FOR UPDATE`,\n [id, ...filterVals],\n );\n if (!Array.isArray(rows) || rows.length === 0) {\n await connection.commit();\n return;\n }\n\n if (experimentTablesExist) {\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?)`,\n [id],\n );\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_EXPERIMENTS)} SET ${quoteIdentifier('datasetId', 'column name')} = NULL, ${quoteIdentifier('datasetVersion', 'column name')} = NULL WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [id],\n );\n }\n\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_DATASET_VERSIONS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [id],\n );\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_DATASET_ITEMS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [id],\n );\n await connection.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)} WHERE ${scopedWhere}`, [\n id,\n ...filterVals,\n ]);\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_DATASET_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n try {\n const orderBy = resolveListOrderBy(args.orderBy, ['createdAt', 'updatedAt', 'name'], {\n field: 'createdAt',\n direction: 'DESC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n\n const filterParts: string[] = [];\n const filterArgs: any[] = [];\n if (args.filters?.datasetIds !== undefined) {\n // An empty list matches no datasets; `IN ()` is invalid SQL.\n filterParts.push(\n args.filters.datasetIds.length > 0\n ? `\\`id\\` IN (${args.filters.datasetIds.map(() => '?').join(',')})`\n : '1 = 0',\n );\n filterArgs.push(...args.filters.datasetIds);\n }\n if (args.filters?.organizationId !== undefined) {\n filterParts.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n filterArgs.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n filterParts.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n filterArgs.push(args.filters.projectId);\n }\n if (args.filters?.candidateKey !== undefined) {\n filterParts.push(`${quoteIdentifier('candidateKey', 'column name')} = ?`);\n filterArgs.push(args.filters.candidateKey);\n }\n if (args.filters?.candidateId !== undefined) {\n filterParts.push(`${quoteIdentifier('candidateId', 'column name')} = ?`);\n filterArgs.push(args.filters.candidateId);\n }\n if (args.filters?.targetType !== undefined) {\n filterParts.push(`${quoteIdentifier('targetType', 'column name')} = ?`);\n filterArgs.push(args.filters.targetType);\n }\n if (args.filters?.targetIds !== undefined && args.filters.targetIds.length > 0) {\n // JSON_OVERLAPS returns true if any value in JSON_ARRAY(?,?,...) is present in `targetIds`.\n const placeholders = args.filters.targetIds.map(() => '?').join(',');\n filterParts.push(`JSON_OVERLAPS(${quoteIdentifier('targetIds', 'column name')}, JSON_ARRAY(${placeholders}))`);\n filterArgs.push(...args.filters.targetIds);\n }\n if (args.filters?.name !== undefined && args.filters.name.length > 0) {\n filterParts.push(`LOWER(${quoteIdentifier('name', 'column name')}) LIKE LOWER(?)`);\n filterArgs.push(`%${args.filters.name}%`);\n }\n const whereClause = {\n sql: filterParts.length > 0 ? `WHERE ${filterParts.join(' AND ')}` : '',\n args: filterArgs,\n };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_DATASETS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, any>>({\n tableName: TABLE_DATASETS,\n whereClause,\n orderBy: `${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC`,\n offset,\n limit: limitValue,\n });\n\n return {\n datasets: rows.map(row => this.mapDataset(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 this.#rejectToolMocks(args.toolMocks);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const id = globalThis.crypto.randomUUID();\n const versionId = globalThis.crypto.randomUUID();\n const now = new Date();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n // Bump version\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n args.datasetId,\n ]);\n\n // Get new version + parent tenancy\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [args.datasetId],\n );\n const parentRow = (datasetRows as any[])[0];\n const newVersion = parentRow?.version as number;\n const parentOrganizationId = (parentRow?.organizationId as string | null | undefined) ?? null;\n const parentProjectId = (parentRow?.projectId as string | null | undefined) ?? null;\n\n // Insert item (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`metadata\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,NULL,0,?,?,?,?,?,?,?)`,\n [\n id,\n args.datasetId,\n newVersion,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(args.input),\n jsonDataArg(args.groundTruth),\n args.unmockedToolPolicy ?? null,\n jsonArg(args.scorerIds),\n jsonArg(args.metadata),\n transformToSqlValue(now),\n transformToSqlValue(now),\n ],\n );\n\n // Insert dataset version record\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, args.datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n\n return {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n organizationId: parentOrganizationId,\n projectId: parentProjectId,\n input: args.input,\n groundTruth: args.groundTruth,\n unmockedToolPolicy: args.unmockedToolPolicy,\n scorerIds: args.scorerIds,\n metadata: args.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_ADD_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n this.#rejectToolMocks(args.toolMocks);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const versionId = globalThis.crypto.randomUUID();\n const now = new Date();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n await connection.execute(`SELECT id FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`, [args.datasetId]);\n const [itemRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n [args.id],\n );\n const itemRow = (itemRows as any[])[0];\n const existing = itemRow ? this.mapItem(itemRow) : null;\n if (!existing) {\n throw new MastraError({\n id: 'MYSQL_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: 'MYSQL_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 if (existing.metadata?.__purged === true) {\n throw new MastraError({\n id: 'DATASET_ITEM_PURGED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.datasetId, itemId: args.id },\n text: `Purged dataset item cannot be updated: ${args.id}`,\n });\n }\n\n const mergedInput = args.input !== undefined ? args.input : existing.input;\n const mergedGroundTruth = args.groundTruth !== undefined ? args.groundTruth : existing.groundTruth;\n const mergedExpectedTrajectory =\n args.expectedTrajectory !== undefined ? args.expectedTrajectory : existing.expectedTrajectory;\n const mergedToolMocks = args.toolMocks ?? existing.toolMocks;\n const mergedUnmockedToolPolicy = args.unmockedToolPolicy ?? existing.unmockedToolPolicy;\n const mergedScorerIds = args.scorerIds !== undefined ? (args.scorerIds ?? undefined) : existing.scorerIds;\n const mergedRequestContext = args.requestContext ?? existing.requestContext;\n const mergedMetadata = args.metadata ?? existing.metadata;\n const mergedSource = args.source ?? existing.source;\n\n // Bump version\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n args.datasetId,\n ]);\n\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [args.datasetId],\n );\n const parentRow = (datasetRows as any[])[0];\n const newVersion = parentRow?.version as number;\n const parentOrganizationId = (parentRow?.organizationId as string | null | undefined) ?? null;\n const parentProjectId = (parentRow?.projectId as string | null | undefined) ?? null;\n\n // Close old row\n await connection.execute(\n `UPDATE ${tableItemsName} SET \\`validTo\\` = ? WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [newVersion, args.id],\n );\n\n // Insert new row (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,0,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n args.id,\n args.datasetId,\n newVersion,\n existing.externalId ?? null,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(mergedInput),\n jsonDataArg(mergedGroundTruth),\n jsonDataArg(mergedExpectedTrajectory),\n jsonArg(mergedToolMocks),\n mergedUnmockedToolPolicy ?? null,\n jsonArg(mergedScorerIds),\n jsonArg(mergedRequestContext),\n jsonArg(mergedMetadata),\n jsonArg(mergedSource),\n transformToSqlValue(existing.createdAt),\n transformToSqlValue(now),\n ],\n );\n\n // Insert dataset version record\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, args.datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n\n return {\n ...existing,\n datasetVersion: newVersion,\n organizationId: parentOrganizationId,\n projectId: parentProjectId,\n input: mergedInput,\n groundTruth: mergedGroundTruth,\n expectedTrajectory: mergedExpectedTrajectory,\n toolMocks: mergedToolMocks,\n unmockedToolPolicy: mergedUnmockedToolPolicy,\n scorerIds: mergedScorerIds,\n requestContext: mergedRequestContext,\n metadata: mergedMetadata,\n source: mergedSource,\n updatedAt: now,\n };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPDATE_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doDeleteItem({ id, datasetId }: DeleteDatasetItemInput): Promise<void> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const versionId = globalThis.crypto.randomUUID();\n const now = new Date();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n await connection.execute(`SELECT id FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`, [datasetId]);\n const [itemRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n [id],\n );\n const itemRow = (itemRows as any[])[0];\n const existing = itemRow ? this.mapItem(itemRow) : null;\n if (!existing) {\n await connection.commit();\n return;\n }\n if (existing.datasetId !== datasetId) {\n throw new MastraError({\n id: 'MYSQL_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 // Bump version\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n datasetId,\n ]);\n\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [datasetId],\n );\n const parentRow = (datasetRows as any[])[0];\n const newVersion = parentRow?.version as number;\n const parentOrganizationId = (parentRow?.organizationId as string | null | undefined) ?? null;\n const parentProjectId = (parentRow?.projectId as string | null | undefined) ?? null;\n\n // Close old row\n await connection.execute(\n `UPDATE ${tableItemsName} SET \\`validTo\\` = ? WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [newVersion, id],\n );\n\n // Insert tombstone (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,1,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n id,\n datasetId,\n newVersion,\n existing.externalId ?? null,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(existing.input),\n jsonDataArg(existing.groundTruth),\n jsonDataArg(existing.expectedTrajectory),\n jsonArg(existing.toolMocks),\n existing.unmockedToolPolicy ?? null,\n jsonArg(existing.scorerIds),\n jsonArg(existing.requestContext),\n jsonArg(existing.metadata),\n jsonArg(existing.source),\n transformToSqlValue(existing.createdAt),\n transformToSqlValue(now),\n ],\n );\n\n // Insert dataset version record\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doPurgeItem({ id, datasetId }: PurgeDatasetItemInput): Promise<void> {\n const experimentTablesExist = await this.experimentTablesExist();\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n await connection.execute(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${formatTableName(TABLE_DATASETS)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [datasetId],\n );\n const itemsTable = formatTableName(TABLE_DATASET_ITEMS);\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${itemsTable} WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('datasetId', 'column name')} = ? LIMIT 1 FOR UPDATE`,\n [id, datasetId],\n );\n if (rows.length === 0) {\n await connection.commit();\n return;\n }\n\n const purgedAt = new Date().toISOString();\n const purgedMetadata = JSON.stringify({ __purged: true, purgedAt });\n await connection.execute(\n `UPDATE ${itemsTable} SET ${quoteIdentifier('input', 'column name')} = ?, ${quoteIdentifier('groundTruth', 'column name')} = NULL, ${quoteIdentifier('expectedTrajectory', 'column name')} = NULL, ${quoteIdentifier('toolMocks', 'column name')} = NULL, ${quoteIdentifier('unmockedToolPolicy', 'column name')} = NULL, ${quoteIdentifier('scorerIds', 'column name')} = NULL, ${quoteIdentifier('requestContext', 'column name')} = NULL, ${quoteIdentifier('metadata', 'column name')} = ?, ${quoteIdentifier('source', 'column name')} = NULL WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('datasetId', 'column name')} = ?`,\n ['null', purgedMetadata, id, datasetId],\n );\n\n if (experimentTablesExist) {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_EXPERIMENT_RESULTS)} SET ${quoteIdentifier('input', 'column name')} = ?, ${quoteIdentifier('output', 'column name')} = NULL, ${quoteIdentifier('groundTruth', 'column name')} = NULL, ${quoteIdentifier('error', 'column name')} = NULL, ${quoteIdentifier('toolMockReport', 'column name')} = NULL, ${quoteIdentifier('tags', 'column name')} = NULL, ${quoteIdentifier('comment', 'column name')} = NULL, ${quoteIdentifier('metadata', 'column name')} = ? WHERE ${quoteIdentifier('itemId', 'column name')} = ? AND ${quoteIdentifier('experimentId', 'column name')} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier('datasetId', 'column name')} = ?)`,\n ['null', purgedMetadata, id, datasetId],\n );\n }\n await connection.commit();\n } catch (error) {\n let transactionError = error;\n try {\n await connection.rollback();\n } catch (rollbackError) {\n transactionError = new AggregateError([error, rollbackError], 'Transaction and rollback both failed');\n }\n if (transactionError instanceof MastraError) throw transactionError;\n throw new MastraError(\n {\n id: 'MYSQL_PURGE_ITEM_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n transactionError,\n );\n } finally {\n connection.release();\n }\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n try {\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n let rows: RowDataPacket[];\n\n if (args.datasetVersion !== undefined) {\n [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`id\\` = ? AND \\`datasetVersion\\` <= ? AND (\\`validTo\\` IS NULL OR \\`validTo\\` > ?) AND \\`isDeleted\\` = 0 ORDER BY \\`datasetVersion\\` DESC LIMIT 1`,\n [args.id, args.datasetVersion, args.datasetVersion],\n );\n } else {\n [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [args.id],\n );\n }\n\n return rows.length > 0 ? this.mapItem(rows[0]!) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`datasetId\\` = ? AND \\`datasetVersion\\` <= ? AND (\\`validTo\\` IS NULL OR \\`validTo\\` > ?) AND \\`isDeleted\\` = 0 ORDER BY \\`createdAt\\` DESC, \\`id\\` ASC`,\n [datasetId, version, version],\n );\n\n return (rows as any[]).map(row => this.mapItem(row));\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`id\\` = ? ORDER BY \\`datasetVersion\\` DESC`,\n [itemId],\n );\n\n return (rows as any[]).map(row => this.mapItemFull(row));\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 orderBy = resolveListOrderBy(args.orderBy, ['createdAt', 'updatedAt'], {\n field: 'createdAt',\n direction: 'DESC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n\n const conditions: string[] = [`\\`datasetId\\` = ?`];\n const params: any[] = [args.datasetId];\n\n if (args.version !== undefined) {\n // SCD-2 time-travel query\n conditions.push(`\\`datasetVersion\\` <= ?`);\n conditions.push(`(\\`validTo\\` IS NULL OR \\`validTo\\` > ?)`);\n conditions.push(`\\`isDeleted\\` = 0`);\n params.push(args.version, args.version);\n } else {\n // Current items only\n conditions.push(`\\`validTo\\` IS NULL`);\n conditions.push(`\\`isDeleted\\` = 0`);\n }\n\n if (args.filters?.organizationId !== undefined) {\n conditions.push(`\\`organizationId\\` = ?`);\n params.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n conditions.push(`\\`projectId\\` = ?`);\n params.push(args.filters.projectId);\n }\n\n if (args.search) {\n conditions.push(`(LOWER(\\`input\\`) LIKE ? OR LOWER(COALESCE(\\`groundTruth\\`, '')) LIKE ?)`);\n const searchPattern = `%${args.search.toLowerCase()}%`;\n params.push(searchPattern, searchPattern);\n }\n\n const whereSql = ` WHERE ${conditions.join(' AND ')}`;\n\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableItemsName}${whereSql}`,\n params,\n );\n const total = Number((countRows as any[])[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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName}${whereSql} ORDER BY ${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC LIMIT ${limitValue} OFFSET ${offset}`,\n params,\n );\n\n return {\n items: (rows as any[]).map(row => this.mapItem(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 = globalThis.crypto.randomUUID();\n const now = new Date();\n\n await this.operations.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: {\n id,\n datasetId,\n version,\n createdAt: now,\n },\n });\n\n return { id, datasetId, version, createdAt: now };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 whereClause = {\n sql: ` WHERE ${quoteIdentifier('datasetId', 'column name')} = ?`,\n args: [input.datasetId] as any[],\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_DATASET_VERSIONS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, any>>({\n tableName: TABLE_DATASET_VERSIONS,\n whereClause,\n orderBy: `\\`version\\` DESC`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.mapVersion(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 for (const item of input.items) {\n this.#rejectToolMocks(item.toolMocks);\n }\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n const [datasetRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\`, \\`organizationId\\`, \\`projectId\\` FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`,\n [input.datasetId],\n );\n const dataset = datasetRows[0];\n if (!dataset) {\n throw new MastraError({\n id: 'MYSQL_BULK_ADD_ITEMS_DATASET_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const externalIds = [...new Set(input.items.flatMap(item => (item.externalId ? [item.externalId] : [])))];\n let historyRows: DatasetItemRow[] = [];\n if (externalIds.length > 0) {\n const placeholders = externalIds.map(() => '?').join(', ');\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE \\`datasetId\\` = ? AND \\`externalId\\` IN (${placeholders}) ORDER BY \\`datasetVersion\\` ASC`,\n [input.datasetId, ...externalIds],\n );\n historyRows = rows.map(row => this.mapItemFull(row));\n }\n\n const plan = this.planDatasetItemBatch(input.items, historyRows, () => globalThis.crypto.randomUUID());\n const existingItems = new Map<string, DatasetItem>(\n [...plan.existingCurrentItems].map(([id, row]) => [id, this.datasetItemFromRow(row)]),\n );\n if (plan.inserts.length === 0) {\n await connection.commit();\n return plan.resolvedIds.map(id => existingItems.get(id)!);\n }\n\n const now = new Date();\n const newVersion = Number(dataset.version) + 1;\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = ? WHERE id = ?`, [\n newVersion,\n input.datasetId,\n ]);\n\n const inserted = new Map<string, DatasetItem>();\n for (const { id, item } of plan.inserts) {\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,0,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n id,\n input.datasetId,\n newVersion,\n item.externalId ?? null,\n dataset.organizationId ?? null,\n dataset.projectId ?? null,\n jsonDataArg(item.input),\n jsonDataArg(item.groundTruth),\n jsonDataArg(item.expectedTrajectory),\n jsonArg(item.toolMocks),\n item.unmockedToolPolicy ?? null,\n jsonArg(item.scorerIds),\n jsonArg(item.requestContext),\n jsonArg(item.metadata),\n jsonArg(item.source),\n transformToSqlValue(now),\n transformToSqlValue(now),\n ],\n );\n inserted.set(id, {\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n externalId: item.externalId ?? null,\n organizationId: dataset.organizationId ?? null,\n projectId: dataset.projectId ?? null,\n ...item,\n createdAt: now,\n updatedAt: now,\n });\n }\n\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [globalThis.crypto.randomUUID(), input.datasetId, newVersion, transformToSqlValue(now)],\n );\n await connection.commit();\n\n return plan.resolvedIds.map(id => inserted.get(id) ?? existingItems.get(id)!);\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_BULK_ADD_ITEMS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: 'MYSQL_BULK_DELETE_ITEMS_DATASET_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n const now = new Date();\n const versionId = globalThis.crypto.randomUUID();\n const tableDatasetsName = formatTableName(TABLE_DATASETS);\n const tableItemsName = formatTableName(TABLE_DATASET_ITEMS);\n const tableVersionsName = formatTableName(TABLE_DATASET_VERSIONS);\n\n await connection.execute(`SELECT id FROM ${tableDatasetsName} WHERE id = ? FOR UPDATE`, [input.datasetId]);\n const currentItems: DatasetItem[] = [];\n for (const itemId of input.itemIds) {\n const [itemRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${ITEM_SELECT_COLUMNS} FROM ${tableItemsName} WHERE id = ? AND validTo IS NULL AND isDeleted = 0`,\n [itemId],\n );\n const row = (itemRows as any[])[0];\n const item = row ? this.mapItem(row) : null;\n if (item && item.datasetId === input.datasetId) currentItems.push(item);\n }\n if (currentItems.length === 0) {\n await connection.commit();\n return;\n }\n\n // Single version increment\n await connection.execute(`UPDATE ${tableDatasetsName} SET \\`version\\` = \\`version\\` + 1 WHERE id = ?`, [\n input.datasetId,\n ]);\n\n const [versionRows] = await connection.execute<RowDataPacket[]>(\n `SELECT \\`version\\` FROM ${tableDatasetsName} WHERE id = ?`,\n [input.datasetId],\n );\n const newVersion = (versionRows as any[])[0]?.version as number;\n\n const parentOrganizationId = dataset.organizationId ?? null;\n const parentProjectId = dataset.projectId ?? null;\n\n for (const item of currentItems) {\n // Close old row\n await connection.execute(\n `UPDATE ${tableItemsName} SET \\`validTo\\` = ? WHERE \\`id\\` = ? AND \\`validTo\\` IS NULL AND \\`isDeleted\\` = 0`,\n [newVersion, item.id],\n );\n\n // Insert tombstone (tenancy inherited from parent dataset)\n await connection.execute(\n `INSERT INTO ${tableItemsName} (\\`id\\`,\\`datasetId\\`,\\`datasetVersion\\`,\\`externalId\\`,\\`organizationId\\`,\\`projectId\\`,\\`validTo\\`,\\`isDeleted\\`,\\`input\\`,\\`groundTruth\\`,\\`expectedTrajectory\\`,\\`toolMocks\\`,\\`unmockedToolPolicy\\`,\\`scorerIds\\`,\\`requestContext\\`,\\`metadata\\`,\\`source\\`,\\`createdAt\\`,\\`updatedAt\\`) VALUES (?,?,?,?,?,?,NULL,1,?,?,?,?,?,?,?,?,?,?,?)`,\n [\n item.id,\n input.datasetId,\n newVersion,\n item.externalId ?? null,\n parentOrganizationId,\n parentProjectId,\n jsonDataArg(item.input),\n jsonDataArg(item.groundTruth),\n jsonDataArg(item.expectedTrajectory),\n jsonArg(item.toolMocks),\n item.unmockedToolPolicy ?? null,\n jsonArg(item.scorerIds),\n jsonArg(item.requestContext),\n jsonArg(item.metadata),\n jsonArg(item.source),\n transformToSqlValue(item.createdAt),\n transformToSqlValue(now),\n ],\n );\n }\n\n // Single dataset_version\n await connection.execute(\n `INSERT INTO ${tableVersionsName} (\\`id\\`, \\`datasetId\\`, \\`version\\`, \\`createdAt\\`) VALUES (?, ?, ?, ?)`,\n [versionId, input.datasetId, newVersion, transformToSqlValue(now)],\n );\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_BULK_DELETE_ITEMS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n EXPERIMENTS_SCHEMA,\n EXPERIMENT_RESULTS_SCHEMA,\n ExperimentsStorage,\n calculatePagination,\n hasErrorCode,\n normalizePerPage,\n resolveListOrderBy,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n ExperimentResultStatus,\n ExperimentTenancyFilters,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n UpdateExperimentResultInput,\n UpsertExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n} from '@mastra/core/storage';\nimport type { Pool, PoolConnection } from 'mysql2/promise';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier } from '../utils';\n\nfunction parseJSON<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n }\n if (typeof value === 'object') return value as T;\n return undefined;\n}\n\ninterface ExperimentRow {\n id: string;\n datasetId: string | null;\n datasetVersion: number | null;\n agentVersion: string | null;\n organizationId: string | null;\n projectId: string | null;\n targetType: string | null;\n targetId: string | null;\n scorerIds: string | null;\n name: string | null;\n description: string | null;\n metadata: string | null;\n provenance: string | null;\n runnerAttestation: string | null;\n experimentSetId: string | null;\n comparisonId: string | null;\n variantId: string | null;\n trialIndex: number | null;\n status: string;\n totalItems: number;\n succeededCount: number;\n failedCount: number;\n skippedCount: number;\n startedAt: Date | string | null;\n completedAt: Date | string | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\ninterface ExperimentResultRow {\n id: string;\n experimentId: string;\n itemId: string;\n itemDatasetVersion: number | null;\n organizationId: string | null;\n projectId: string | null;\n input: string | null;\n output: string | null;\n groundTruth: string | null;\n metadata: string | null;\n error: string | null;\n startedAt: Date | string;\n completedAt: Date | string;\n retryCount: number;\n attempt?: number | null;\n traceId: string | null;\n status: string | null;\n tags: string | null;\n comment: string | null;\n createdAt: Date | string;\n}\n\nexport class ExperimentsMySQL extends ExperimentsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS] as const;\n\n /**\n * Returns default index definitions for the experiments domain tables.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [\n // Tenancy: leading-tenant indexes for multi-tenant scans (parity with\n // pg/libsql/spanner/mongodb experiments adapters).\n {\n name: 'idx_experiments_grouping',\n table: TABLE_EXPERIMENTS,\n columns: ['experimentSetId', 'comparisonId', 'variantId', 'trialIndex'],\n },\n {\n name: 'idx_experiments_org_project',\n table: TABLE_EXPERIMENTS,\n columns: ['organizationId', 'projectId'],\n },\n {\n name: 'idx_experiment_results_org_project',\n table: TABLE_EXPERIMENT_RESULTS,\n columns: ['organizationId', 'projectId'],\n },\n ];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_EXPERIMENTS, schema: TABLE_SCHEMAS[TABLE_EXPERIMENTS] }),\n generateTableSQL({ tableName: TABLE_EXPERIMENT_RESULTS, schema: TABLE_SCHEMAS[TABLE_EXPERIMENT_RESULTS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ExperimentsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async #withPurgeBarrier<T>(\n experimentId: string,\n itemId: string,\n fn: (connection: PoolConnection, purgeMetadata: Record<string, unknown> | null) => Promise<T>,\n ): Promise<T> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n const [experimentRows] = await connection.execute(\n `SELECT ${quoteIdentifier('datasetId', 'column name')} FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [experimentId],\n );\n const datasetId = Array.isArray(experimentRows)\n ? ((experimentRows[0] as { datasetId?: string | null } | undefined)?.datasetId ?? null)\n : null;\n let purgeMetadata: Record<string, unknown> | null = null;\n if (datasetId) {\n await connection.execute(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${formatTableName(TABLE_DATASETS)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [datasetId],\n );\n const [itemRows] = await connection.execute(\n `SELECT ${quoteIdentifier('metadata', 'column name')} FROM ${formatTableName(TABLE_DATASET_ITEMS)} WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('datasetId', 'column name')} = ?`,\n [itemId, datasetId],\n );\n if (Array.isArray(itemRows)) {\n const purgedRow = (itemRows as Array<{ metadata?: unknown }>).find(\n row => parseJSON<Record<string, unknown>>(row.metadata)?.__purged === true,\n );\n purgeMetadata = purgedRow ? (parseJSON<Record<string, unknown>>(purgedRow.metadata) ?? null) : null;\n }\n }\n const result = await fn(connection, purgeMetadata);\n await connection.commit();\n return result;\n } catch (error) {\n let transactionError = error;\n try {\n await connection.rollback();\n } catch (rollbackError) {\n transactionError = new AggregateError([error, rollbackError], 'Transaction and rollback both failed');\n }\n throw transactionError;\n } finally {\n connection.release();\n }\n }\n\n async #ensureExperimentResultNaturalKey(): Promise<void> {\n const tableName = formatTableName(TABLE_EXPERIMENT_RESULTS);\n const indexName = 'idx_experiment_results_exp_item_attempt';\n\n const [indexRows] = await this.pool.execute(\n `SELECT 1 FROM information_schema.STATISTICS\n WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ?\n LIMIT 1`,\n [TABLE_EXPERIMENT_RESULTS, indexName],\n );\n if (Array.isArray(indexRows) && indexRows.length > 0) return;\n\n try {\n await this.pool.execute(\n `CREATE UNIQUE INDEX ${quoteIdentifier(indexName, 'index name')} ON ${tableName} (${quoteIdentifier('experimentId', 'column name')}(191), ${quoteIdentifier('itemId', 'column name')}(191), ((COALESCE(${quoteIdentifier('attempt', 'column name')}, 0))))`,\n );\n } catch (error) {\n if (hasErrorCode(error, new Set([1061, 'ER_DUP_KEYNAME']))) return;\n if (!hasErrorCode(error, new Set([1062, 'ER_DUP_ENTRY']))) throw error;\n\n throw new MastraError(\n {\n id: 'MYSQL_EXPERIMENT_RESULT_NATURAL_KEY_MIGRATION_REQUIRED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Could not enforce experiment-result uniqueness. Resolve duplicate experiment, item, and attempt combinations before restarting the MySQL store.',\n },\n error,\n );\n }\n }\n\n /**\n * Returns default index definitions for the experiments domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ExperimentsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_EXPERIMENTS, schema: EXPERIMENTS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_EXPERIMENT_RESULTS, schema: EXPERIMENT_RESULTS_SCHEMA });\n // Backfill tenancy columns on pre-existing tables so older deployments\n // keep working when they upgrade in place.\n await this.operations.alterTable({\n tableName: TABLE_EXPERIMENTS,\n schema: EXPERIMENTS_SCHEMA,\n ifNotExists: [\n 'agentVersion',\n 'organizationId',\n 'projectId',\n 'provenance',\n 'runnerAttestation',\n 'experimentSetId',\n 'comparisonId',\n 'variantId',\n 'trialIndex',\n 'scorerIds',\n ],\n });\n await this.operations.alterTable({\n tableName: TABLE_EXPERIMENT_RESULTS,\n schema: EXPERIMENT_RESULTS_SCHEMA,\n ifNotExists: ['comment', 'metadata', 'organizationId', 'projectId', 'attempt'],\n });\n await this.#ensureExperimentResultNaturalKey();\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_EXPERIMENTS)}`);\n }\n\n private mapExperiment(row: ExperimentRow): Experiment {\n return {\n id: row.id,\n datasetId: row.datasetId ?? null,\n datasetVersion: row.datasetVersion ?? null,\n agentVersion: row.agentVersion ?? null,\n organizationId: row.organizationId ?? null,\n projectId: row.projectId ?? null,\n targetType: (row.targetType as Experiment['targetType']) ?? null,\n targetId: row.targetId ?? null,\n scorerIds: parseJSON<string[]>(row.scorerIds) ?? null,\n name: row.name ?? undefined,\n description: row.description ?? undefined,\n metadata: parseJSON<Record<string, unknown>>(row.metadata),\n provenance: parseJSON<Experiment['provenance']>(row.provenance) ?? null,\n runnerAttestation: parseJSON<Experiment['runnerAttestation']>(row.runnerAttestation) ?? null,\n experimentSetId: row.experimentSetId ?? null,\n comparisonId: row.comparisonId ?? null,\n variantId: row.variantId ?? null,\n trialIndex: row.trialIndex ?? null,\n status: row.status as Experiment['status'],\n totalItems: row.totalItems,\n succeededCount: row.succeededCount,\n failedCount: row.failedCount,\n skippedCount: row.skippedCount ?? 0,\n startedAt: row.startedAt ? (parseDateTime(row.startedAt) ?? null) : null,\n completedAt: row.completedAt ? (parseDateTime(row.completedAt) ?? null) : null,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n }\n\n private mapExperimentResult(row: ExperimentResultRow): ExperimentResult {\n return {\n id: row.id,\n experimentId: row.experimentId,\n itemId: row.itemId,\n itemDatasetVersion: row.itemDatasetVersion ?? null,\n organizationId: row.organizationId ?? null,\n projectId: row.projectId ?? null,\n input: row.input === null ? null : parseJSON<Record<string, unknown>>(row.input),\n output: row.output ? parseJSON<Record<string, unknown>>(row.output) : null,\n groundTruth: row.groundTruth ? parseJSON<Record<string, unknown>>(row.groundTruth) : null,\n metadata: row.metadata ? (parseJSON<Record<string, unknown>>(row.metadata) ?? null) : null,\n error: row.error ? (parseJSON<{ message: string; stack?: string; code?: string }>(row.error) ?? null) : null,\n startedAt: parseDateTime(row.startedAt) ?? new Date(),\n completedAt: parseDateTime(row.completedAt) ?? new Date(),\n retryCount: row.retryCount,\n attempt: row.attempt != null ? Number(row.attempt) : 0,\n traceId: row.traceId ?? null,\n status: (row.status as ExperimentResultStatus | null) ?? null,\n tags: row.tags ? (parseJSON<string[]>(row.tags) ?? null) : null,\n comment: row.comment ?? null,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n };\n }\n\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n try {\n const id = input.id ?? globalThis.crypto.randomUUID();\n const now = new Date();\n\n await this.operations.insert({\n tableName: TABLE_EXPERIMENTS,\n record: {\n id,\n datasetId: input.datasetId ?? null,\n datasetVersion: input.datasetVersion ?? null,\n agentVersion: input.agentVersion ?? null,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n targetType: input.targetType ?? null,\n targetId: input.targetId ?? null,\n scorerIds: input.scorerIds ? JSON.stringify(input.scorerIds) : null,\n name: input.name ?? null,\n description: input.description ?? null,\n metadata: input.metadata ? JSON.stringify(input.metadata) : null,\n provenance: input.provenance ? JSON.stringify(input.provenance) : null,\n runnerAttestation: input.runnerAttestation ? JSON.stringify(input.runnerAttestation) : null,\n experimentSetId: input.experimentSetId ?? null,\n comparisonId: input.comparisonId ?? null,\n variantId: input.variantId ?? null,\n trialIndex: input.trialIndex ?? 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: now,\n updatedAt: now,\n },\n });\n\n return {\n id,\n datasetId: input.datasetId,\n datasetVersion: input.datasetVersion,\n agentVersion: input.agentVersion ?? null,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n targetType: input.targetType ?? null,\n targetId: input.targetId ?? null,\n scorerIds: input.scorerIds ?? null,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n provenance: input.provenance ?? null,\n runnerAttestation: input.runnerAttestation ?? null,\n experimentSetId: input.experimentSetId ?? null,\n comparisonId: input.comparisonId ?? null,\n variantId: input.variantId ?? null,\n trialIndex: input.trialIndex ?? 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: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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: 'MYSQL_UPDATE_EXPERIMENT_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { experimentId: input.id },\n });\n }\n\n const data: Record<string, any> = { updatedAt: new Date() };\n\n if (input.status !== undefined) data.status = input.status;\n if (input.succeededCount !== undefined) data.succeededCount = input.succeededCount;\n if (input.failedCount !== undefined) data.failedCount = input.failedCount;\n if (input.skippedCount !== undefined) data.skippedCount = input.skippedCount;\n if (input.totalItems !== undefined) data.totalItems = input.totalItems;\n if (input.startedAt !== undefined) data.startedAt = input.startedAt ?? null;\n if (input.completedAt !== undefined) data.completedAt = input.completedAt ?? null;\n if (input.name !== undefined) data.name = input.name;\n if (input.description !== undefined) data.description = input.description;\n if (input.metadata !== undefined) data.metadata = JSON.stringify(input.metadata);\n\n await this.operations.update({\n tableName: TABLE_EXPERIMENTS,\n keys: { id: input.id },\n data,\n });\n\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: 'MYSQL_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; filters?: ExperimentTenancyFilters }): Promise<Experiment | null> {\n try {\n // prepareWhereClause ignores undefined values, so this scopes the SELECT only\n // when the caller passed tenancy filters.\n const row = await this.operations.load<ExperimentRow>({\n tableName: TABLE_EXPERIMENTS,\n keys: {\n id: args.id,\n organizationId: args.filters?.organizationId,\n projectId: args.filters?.projectId,\n },\n });\n return row ? this.mapExperiment(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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 orderBy = resolveListOrderBy(args.orderBy, ['createdAt', 'status'], {\n field: 'createdAt',\n direction: 'DESC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (args.datasetId) {\n conditions.push(`${quoteIdentifier('datasetId', 'column name')} = ?`);\n params.push(args.datasetId);\n }\n if (args.targetType) {\n conditions.push(`${quoteIdentifier('targetType', 'column name')} = ?`);\n params.push(args.targetType);\n }\n if (args.targetId) {\n conditions.push(`${quoteIdentifier('targetId', 'column name')} = ?`);\n params.push(args.targetId);\n }\n if (args.agentVersion) {\n conditions.push(`${quoteIdentifier('agentVersion', 'column name')} = ?`);\n params.push(args.agentVersion);\n }\n if (args.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(args.status);\n }\n if (args.experimentSetId !== undefined) {\n conditions.push(`${quoteIdentifier('experimentSetId', 'column name')} = ?`);\n params.push(args.experimentSetId);\n }\n if (args.comparisonId !== undefined) {\n conditions.push(`${quoteIdentifier('comparisonId', 'column name')} = ?`);\n params.push(args.comparisonId);\n }\n if (args.variantId !== undefined) {\n conditions.push(`${quoteIdentifier('variantId', 'column name')} = ?`);\n params.push(args.variantId);\n }\n if (args.trialIndex !== undefined) {\n conditions.push(`${quoteIdentifier('trialIndex', 'column name')} = ?`);\n params.push(args.trialIndex);\n }\n if (args.filters) {\n const { organizationId, projectId } = args.filters;\n if (organizationId !== undefined) {\n conditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n params.push(organizationId);\n }\n if (projectId !== undefined) {\n conditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n params.push(projectId);\n }\n }\n\n const whereClause = {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args: params,\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_EXPERIMENTS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<ExperimentRow>({\n tableName: TABLE_EXPERIMENTS,\n whereClause,\n orderBy: `${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC`,\n offset,\n limit: limitValue,\n });\n\n return {\n experiments: rows.map(row => this.mapExperiment(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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; filters?: ExperimentTenancyFilters }): Promise<void> {\n try {\n // Atomic gate + cascade under SELECT ... FOR UPDATE. Silent no-op on\n // tenancy mismatch.\n const tenancyConditions: string[] = [];\n const tenancyParams: any[] = [];\n if (args.filters?.organizationId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n tenancyParams.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n tenancyParams.push(args.filters.projectId);\n }\n const gateWhere = ['id = ?', ...tenancyConditions].join(' AND ');\n\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n const [gateRows] = await connection.execute(\n `SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${gateWhere} FOR UPDATE`,\n [args.id, ...tenancyParams],\n );\n if (!Array.isArray(gateRows) || gateRows.length === 0) {\n await connection.commit();\n return;\n }\n await connection.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} = ?`,\n [args.id],\n );\n await connection.execute(`DELETE FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE id = ?`, [args.id]);\n await connection.commit();\n } catch (error) {\n try {\n await connection.rollback();\n } catch (rollbackError) {\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_EXPERIMENT_ROLLBACK_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { experimentId: args.id },\n },\n rollbackError,\n );\n }\n throw error;\n } finally {\n connection.release();\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_EXPERIMENT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n // Tool mock reports are produced only when an experiment used item-level tool\n // mocks — which the MySQL adapter rejects on write. Guard here too so a report\n // is never silently dropped.\n if (input.toolMockReport) {\n throw new MastraError({\n id: 'MYSQL_EXPERIMENT_TOOL_MOCK_REPORT_UNSUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Tool mock reports are not supported on the MySQL storage adapter. Use a supported adapter (LibSQL, PostgreSQL, MongoDB, or Spanner) to persist experiment tool mock reports.',\n });\n }\n try {\n const id = input.id ?? globalThis.crypto.randomUUID();\n const now = new Date();\n const purgeMetadata = await this.#withPurgeBarrier(\n input.experimentId,\n input.itemId,\n async (connection, marker) => {\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_EXPERIMENT_RESULTS)} (\n ${[\n 'id',\n 'experimentId',\n 'itemId',\n 'itemDatasetVersion',\n 'organizationId',\n 'projectId',\n 'input',\n 'output',\n 'groundTruth',\n 'metadata',\n 'error',\n 'startedAt',\n 'completedAt',\n 'retryCount',\n 'attempt',\n 'traceId',\n 'status',\n 'tags',\n 'createdAt',\n ]\n .map(column => quoteIdentifier(column, 'column name'))\n .join(', ')}\n ) VALUES (${Array.from({ length: 19 }, () => '?').join(', ')})`,\n [\n id,\n input.experimentId,\n input.itemId,\n input.itemDatasetVersion ?? null,\n input.organizationId ?? null,\n input.projectId ?? null,\n JSON.stringify(marker ? null : input.input),\n marker || input.output == null ? null : JSON.stringify(input.output),\n marker || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n JSON.stringify(marker ?? input.metadata ?? null),\n marker || input.error == null ? null : JSON.stringify(input.error),\n input.startedAt,\n input.completedAt,\n input.retryCount,\n input.attempt ?? 0,\n input.traceId ?? null,\n input.status ?? null,\n marker || input.tags == null ? null : JSON.stringify(input.tags),\n now,\n ],\n );\n return marker;\n },\n );\n\n return {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion,\n organizationId: input.organizationId ?? null,\n projectId: input.projectId ?? null,\n input: purgeMetadata ? null : input.input,\n output: purgeMetadata ? null : input.output,\n groundTruth: purgeMetadata ? null : input.groundTruth,\n metadata: purgeMetadata ?? input.metadata ?? null,\n error: purgeMetadata ? null : input.error,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n attempt: input.attempt ?? 0,\n traceId: input.traceId ?? null,\n status: input.status ?? null,\n tags: purgeMetadata ? null : (input.tags ?? null),\n createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_ADD_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentResultById(args: {\n id: string;\n filters?: ExperimentTenancyFilters;\n }): Promise<ExperimentResult | null> {\n try {\n // prepareWhereClause ignores undefined values, so this scopes the SELECT only\n // when the caller passed tenancy filters.\n const row = await this.operations.load<ExperimentResultRow>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n keys: {\n id: args.id,\n organizationId: args.filters?.organizationId,\n projectId: args.filters?.projectId,\n },\n });\n return row ? this.mapExperimentResult(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_GET_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async upsertExperimentResult(input: UpsertExperimentResultInput): Promise<ExperimentResult> {\n // Mirror the addExperimentResult guard: this adapter never persists tool mock reports.\n if (input.toolMockReport) {\n throw new MastraError({\n id: 'MYSQL_EXPERIMENT_TOOL_MOCK_REPORT_UNSUPPORTED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Tool mock reports are not supported on the MySQL storage adapter. Use a supported adapter (LibSQL, PostgreSQL, MongoDB, or Spanner) to persist experiment tool mock reports.',\n });\n }\n try {\n const attempt = input.attempt ?? 0;\n return await this.#withPurgeBarrier(input.experimentId, input.itemId, async (connection, marker) => {\n const tableName = formatTableName(TABLE_EXPERIMENT_RESULTS);\n const updateColumns = [\n 'itemDatasetVersion',\n 'organizationId',\n 'projectId',\n 'input',\n 'output',\n 'groundTruth',\n 'metadata',\n 'error',\n 'startedAt',\n 'completedAt',\n 'retryCount',\n 'attempt',\n 'traceId',\n 'status',\n 'tags',\n ];\n const updateValues = [\n input.itemDatasetVersion ?? null,\n input.organizationId ?? null,\n input.projectId ?? null,\n JSON.stringify(marker ? null : input.input),\n marker || input.output == null ? null : JSON.stringify(input.output),\n marker || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),\n JSON.stringify(marker ?? input.metadata ?? null),\n marker || input.error == null ? null : JSON.stringify(input.error),\n input.startedAt,\n input.completedAt,\n input.retryCount,\n attempt,\n input.traceId ?? null,\n input.status ?? null,\n marker || input.tags == null ? null : JSON.stringify(input.tags),\n ];\n const columns = ['id', 'experimentId', 'itemId', ...updateColumns, 'createdAt'];\n\n await connection.execute(\n `INSERT INTO ${tableName} (${columns.map(column => quoteIdentifier(column, 'column name')).join(', ')})\n VALUES (${Array.from({ length: columns.length }, () => '?').join(', ')})\n ON DUPLICATE KEY UPDATE ${updateColumns\n .map(\n column =>\n `${quoteIdentifier(column, 'column name')} = VALUES(${quoteIdentifier(column, 'column name')})`,\n )\n .join(', ')}`,\n [globalThis.crypto.randomUUID(), input.experimentId, input.itemId, ...updateValues, new Date()],\n );\n\n const [rows] = await connection.execute(\n `SELECT * FROM ${tableName} WHERE ${quoteIdentifier('experimentId', 'column name')} = ? AND ${quoteIdentifier('itemId', 'column name')} = ? AND ${quoteIdentifier('attempt', 'column name')} = ?`,\n [input.experimentId, input.itemId, attempt],\n );\n const row = Array.isArray(rows) ? (rows[0] as ExperimentResultRow | undefined) : undefined;\n if (!row) {\n throw new MastraError({\n id: 'MYSQL_UPSERT_EXPERIMENT_RESULT_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment result not found after upsert`,\n details: { experimentId: input.experimentId, itemId: input.itemId, attempt },\n });\n }\n return this.mapExperimentResult(row);\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPSERT_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n try {\n const existing = await this.operations.load<ExperimentResultRow>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n keys: { id: input.id },\n });\n if (!existing) {\n throw new Error(`Experiment result not found: ${input.id}`);\n }\n if (input.experimentId && existing.experimentId !== input.experimentId) {\n throw new Error(`Experiment result ${input.id} does not belong to experiment ${input.experimentId}`);\n }\n\n return await this.#withPurgeBarrier(existing.experimentId, existing.itemId, async (connection, marker) => {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_EXPERIMENT_RESULTS)}\n SET ${quoteIdentifier('status', 'column name')} = CASE WHEN ? THEN ? ELSE ${quoteIdentifier('status', 'column name')} END,\n ${quoteIdentifier('tags', 'column name')} = CASE WHEN ? THEN NULL WHEN ? THEN ? ELSE ${quoteIdentifier('tags', 'column name')} END,\n ${quoteIdentifier('comment', 'column name')} = CASE WHEN ? THEN NULL WHEN ? THEN ? ELSE ${quoteIdentifier('comment', 'column name')} END\n WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [\n input.status !== undefined,\n input.status ?? null,\n Boolean(marker),\n input.tags !== undefined,\n input.tags === undefined ? null : JSON.stringify(input.tags),\n Boolean(marker),\n input.comment !== undefined,\n input.comment ?? null,\n input.id,\n ],\n );\n const [rows] = await connection.execute(\n `SELECT * FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [input.id],\n );\n const row = Array.isArray(rows) ? (rows[0] as ExperimentResultRow | undefined) : undefined;\n if (!row) throw new Error(`Experiment result ${input.id} not found after update`);\n return this.mapExperimentResult(row);\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_UPDATE_EXPERIMENT_RESULT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n try {\n const rows = await this.operations.query<{\n experimentId: string;\n status: string | null;\n count: number;\n }>(\n `SELECT ${quoteIdentifier('experimentId', 'column name')}, ${quoteIdentifier('status', 'column name')}, COUNT(*) as count FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} GROUP BY ${quoteIdentifier('experimentId', 'column name')}, ${quoteIdentifier('status', 'column name')}`,\n );\n\n const counts = new Map<string, ExperimentReviewCounts>();\n for (const row of rows) {\n let entry = counts.get(row.experimentId);\n if (!entry) {\n entry = { experimentId: row.experimentId, total: 0, needsReview: 0, reviewed: 0, complete: 0 };\n counts.set(row.experimentId, entry);\n }\n const count = Number(row.count);\n entry.total += count;\n if (row.status === 'needs-review') entry.needsReview += count;\n else if (row.status === 'reviewed') entry.reviewed += count;\n else if (row.status === 'complete') entry.complete += count;\n }\n\n return Array.from(counts.values());\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_GET_REVIEW_SUMMARY_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 orderBy = resolveListOrderBy(args.orderBy, ['startedAt', 'createdAt'], {\n field: 'startedAt',\n direction: 'ASC',\n });\n const { page, perPage: perPageInput } = args.pagination;\n\n const conditions: string[] = [`${quoteIdentifier('experimentId', 'column name')} = ?`];\n const params: any[] = [args.experimentId];\n if (args.traceId) {\n conditions.push(`${quoteIdentifier('traceId', 'column name')} = ?`);\n params.push(args.traceId);\n }\n if (args.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(args.status);\n }\n // All requested tags must be present (AND semantics)\n for (const tag of args.tags ?? []) {\n conditions.push(`JSON_CONTAINS(${quoteIdentifier('tags', 'column name')}, ?, '$')`);\n params.push(JSON.stringify(tag));\n }\n if (args.filters) {\n const { organizationId, projectId } = args.filters;\n if (organizationId !== undefined) {\n conditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n params.push(organizationId);\n }\n if (projectId !== undefined) {\n conditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n params.push(projectId);\n }\n }\n\n const whereClause = {\n sql: ` WHERE ${conditions.join(' AND ')}`,\n args: params,\n };\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_EXPERIMENT_RESULTS, whereClause });\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, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<ExperimentResultRow>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n whereClause,\n orderBy: `${quoteIdentifier(orderBy.field, 'column name')} ${orderBy.direction}, \\`id\\` ASC`,\n offset,\n limit: limitValue,\n });\n\n return {\n results: rows.map(row => this.mapExperimentResult(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_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; filters?: ExperimentTenancyFilters }): Promise<void> {\n try {\n // Tenancy predicate folded into the DELETE via a scoped parent subquery.\n // Silent no-op on mismatch.\n if (args.filters?.organizationId !== undefined || args.filters?.projectId !== undefined) {\n const tenancyConditions: string[] = [];\n const tenancyParams: any[] = [];\n if (args.filters?.organizationId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n tenancyParams.push(args.filters.organizationId);\n }\n if (args.filters?.projectId !== undefined) {\n tenancyConditions.push(`${quoteIdentifier('projectId', 'column name')} = ?`);\n tenancyParams.push(args.filters.projectId);\n }\n const parentWhere = ['id = ?', ...tenancyConditions].join(' AND ');\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${parentWhere})`,\n [args.experimentId, ...tenancyParams],\n );\n return;\n }\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier('experimentId', 'column name')} = ?`,\n [args.experimentId],\n );\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_DELETE_EXPERIMENT_RESULTS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n FavoritesStorage,\n createStorageErrorId,\n TABLE_AGENTS,\n TABLE_SKILLS,\n TABLE_FAVORITES,\n TABLE_SCHEMAS,\n FAVORITES_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageDeleteFavoritesForEntityInput,\n StorageIsFavoritedBatchInput,\n StorageListFavoritesInput,\n StorageFavoriteEntityType,\n StorageFavoriteKey,\n} from '@mastra/core/storage';\nimport type { FavoriteToggleResult } from '@mastra/core/storage/domains/favorites';\nimport type { Pool, RowDataPacket, ResultSetHeader } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\n/**\n * Maps a favorite entity type to its parent entity table.\n */\nconst ENTITY_TABLE: Record<StorageFavoriteEntityType, typeof TABLE_AGENTS | typeof TABLE_SKILLS> = {\n agent: TABLE_AGENTS,\n skill: TABLE_SKILLS,\n};\n\nexport class FavoritesMySQL extends FavoritesStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_FAVORITES] as const;\n\n /**\n * Returns default index definitions for the favorites domain tables.\n * Currently no default indexes are defined for favorites.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_FAVORITES,\n schema: TABLE_SCHEMAS[TABLE_FAVORITES],\n compositePrimaryKey: ['userId', 'entityType', 'entityId'],\n }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (FavoritesMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the favorites domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return FavoritesMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for favorites.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for favorites domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_FAVORITES,\n schema: FAVORITES_SCHEMA,\n });\n\n // The composite PRIMARY KEY (userId, entityType, entityId) created by createTable\n // already enforces uniqueness for INSERT IGNORE idempotency. No extra unique index needed.\n\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.withTransaction(async connection => {\n await connection.execute(`DELETE FROM ${formatTableName(TABLE_FAVORITES)}`);\n // Reset denormalized counters on parent entities\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_AGENTS)} SET ${quoteIdentifier('favoriteCount', 'column name')} = 0 WHERE ${quoteIdentifier('favoriteCount', 'column name')} > 0`,\n );\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_SKILLS)} SET ${quoteIdentifier('favoriteCount', 'column name')} = 0 WHERE ${quoteIdentifier('favoriteCount', 'column name')} > 0`,\n );\n });\n }\n\n async favorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n const { userId, entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n\n try {\n return await this.operations.withTransaction(async connection => {\n // Verify entity exists\n const [entityRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n if (!entityRows[0]) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'FAVORITE', 'ENTITY_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `${entityType} ${entityId} not found`,\n details: { entityType, entityId },\n });\n }\n\n // Idempotent insert using INSERT IGNORE\n const [insertResult] = await connection.execute<ResultSetHeader>(\n `INSERT IGNORE INTO ${formatTableName(TABLE_FAVORITES)} (${quoteIdentifier('userId', 'column name')}, ${quoteIdentifier('entityType', 'column name')}, ${quoteIdentifier('entityId', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}) VALUES (?, ?, ?, ?)`,\n [userId, entityType, entityId, new Date().toISOString()],\n );\n\n // Only bump counter when we actually inserted a new row\n if (insertResult.affectedRows > 0) {\n await connection.execute(\n `UPDATE ${formatTableName(entityTable)} SET ${quoteIdentifier('favoriteCount', 'column name')} = COALESCE(${quoteIdentifier('favoriteCount', 'column name')}, 0) + 1 WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n }\n\n const [afterRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n const favoriteCount = Number(afterRows[0]?.favoriteCount ?? 0);\n\n return { favorited: true, favoriteCount };\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'FAVORITE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async unfavorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n const { userId, entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n\n try {\n return await this.operations.withTransaction(async connection => {\n const [entityRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n if (!entityRows[0]) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UNFAVORITE', 'ENTITY_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `${entityType} ${entityId} not found`,\n details: { entityType, entityId },\n });\n }\n\n const [deleteResult] = await connection.execute<ResultSetHeader>(\n `DELETE FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} = ?`,\n [userId, entityType, entityId],\n );\n\n // Only decrement when we actually removed a row, clamp at 0\n if (deleteResult.affectedRows > 0) {\n await connection.execute(\n `UPDATE ${formatTableName(entityTable)} SET ${quoteIdentifier('favoriteCount', 'column name')} = GREATEST(COALESCE(${quoteIdentifier('favoriteCount', 'column name')}, 0) - 1, 0) WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n }\n\n const [afterRows] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('favoriteCount', 'column name')} FROM ${formatTableName(entityTable)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [entityId],\n );\n const favoriteCount = Number(afterRows[0]?.favoriteCount ?? 0);\n\n return { favorited: false, favoriteCount };\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'UNFAVORITE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async isFavorited(input: StorageFavoriteKey): Promise<boolean> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT 1 FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} = ? LIMIT 1`,\n [input.userId, input.entityType, input.entityId],\n );\n return rows.length > 0;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'IS_FAVORITED', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async isFavoritedBatch(input: StorageIsFavoritedBatchInput): Promise<Set<string>> {\n const { userId, entityType, entityIds } = input;\n if (entityIds.length === 0) {\n return new Set();\n }\n\n try {\n const placeholders = entityIds.map(() => '?').join(', ');\n const args = [userId, entityType, ...entityIds];\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('entityId', 'column name')} FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} IN (${placeholders})`,\n args,\n );\n const set = new Set<string>();\n for (const row of rows) {\n set.add(row.entityId as string);\n }\n return set;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'IS_FAVORITED_BATCH', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listFavoritedIds(input: StorageListFavoritesInput): Promise<string[]> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('entityId', 'column name')} FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('userId', 'column name')} = ? AND ${quoteIdentifier('entityType', 'column name')} = ? ORDER BY ${quoteIdentifier('createdAt', 'column name')} DESC, ${quoteIdentifier('entityId', 'column name')} ASC`,\n [input.userId, input.entityType],\n );\n return rows.map(row => row.entityId as string);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'LIST_FAVORITED_IDS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteFavoritesForEntity(input: StorageDeleteFavoritesForEntityInput): Promise<number> {\n const entityTable = ENTITY_TABLE[input.entityType];\n try {\n return await this.operations.withTransaction(async connection => {\n const [result] = await connection.execute<ResultSetHeader>(\n `DELETE FROM ${formatTableName(TABLE_FAVORITES)} WHERE ${quoteIdentifier('entityType', 'column name')} = ? AND ${quoteIdentifier('entityId', 'column name')} = ?`,\n [input.entityType, input.entityId],\n );\n // Reset the parent entity's favoriteCount\n await connection.execute(\n `UPDATE ${formatTableName(entityTable)} SET ${quoteIdentifier('favoriteCount', 'column name')} = 0 WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [input.entityId],\n );\n return result.affectedRows;\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'DELETE_FAVORITES_FOR_ENTITY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType: input.entityType, entityId: input.entityId },\n },\n error,\n );\n }\n }\n}\n","import {\n canonicalizeKnowledgeScope,\n createKnowledgeUlid,\n isKnowledgeScopeVisible,\n KNOWLEDGE_ACTIVITY_SCHEMA,\n KNOWLEDGE_RECORDS_SCHEMA,\n KNOWLEDGE_MENTIONS_SCHEMA,\n KNOWLEDGE_NODES_SCHEMA,\n KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n knowledgeScopeKey,\n knowledgeSemanticDocumentId,\n knowledgeSemanticIdempotencyKey,\n KnowledgeConflictError,\n KnowledgeNotFoundError,\n KnowledgeStorage,\n parseKnowledgeNodeCursor,\n parseKnowledgeWikilinks,\n TABLE_KNOWLEDGE_ACTIVITY,\n TABLE_KNOWLEDGE_RECORDS,\n TABLE_KNOWLEDGE_MENTIONS,\n TABLE_KNOWLEDGE_NODES,\n TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n} from '@mastra/core/storage';\nimport type {\n AppendKnowledgeInput,\n ClaimKnowledgeSemanticOutboxInput,\n CreateKnowledgeNodeInput,\n KnowledgeActivityAction,\n KnowledgeActivityEvent,\n KnowledgeCurationCursor,\n KnowledgeNode,\n KnowledgeRecord,\n KnowledgeScope,\n KnowledgeSemanticDocumentType,\n KnowledgeSemanticOperation,\n KnowledgeSemanticOutboxEntry,\n ListKnowledgeNodesInput,\n QueryKnowledgeBySourceInput,\n QueryKnowledgeInput,\n QueryKnowledgeOutput,\n SearchKnowledgeInput,\n SearchKnowledgeResult,\n UpdateKnowledgeNodeInput,\n} from '@mastra/core/storage';\nimport type { Pool, PoolConnection, ResultSetHeader, RowDataPacket } from 'mysql2/promise';\n\nimport { generateTableSQL } from '../operations';\nimport type { StoreOperationsMySQL } from '../operations';\n\n// #21830 shipped this helper in core 1.63.1; resolve it lazily so an older\n// installed core fails feature-detection instead of breaking module load.\nlet assertDescriptionWithinBound: ((description: string | undefined) => void) | undefined;\nasync function assertKnowledgeDescriptionWithinBoundCompat(description: string | undefined): Promise<void> {\n let assertWithinBound = assertDescriptionWithinBound;\n if (!assertWithinBound) {\n const mod: Partial<typeof import('@mastra/core/storage')> = await import('@mastra/core/storage');\n const resolvedAssert: (description: string | undefined) => void =\n mod.assertKnowledgeDescriptionWithinBound ??\n (value => {\n if (value !== undefined && value.length > 400) {\n throw new Error('Knowledge node description exceeds the 400 UTF-16 code unit limit');\n }\n });\n assertDescriptionWithinBound = resolvedAssert;\n assertWithinBound = resolvedAssert;\n }\n assertWithinBound(description);\n}\n\nlet assertRecordTextWithinBound: ((text: string) => void) | undefined;\nasync function assertKnowledgeRecordTextWithinBoundCompat(text: string): Promise<void> {\n if (!assertRecordTextWithinBound) {\n const mod: Partial<typeof import('@mastra/core/storage')> = await import('@mastra/core/storage');\n assertRecordTextWithinBound =\n mod.assertKnowledgeRecordTextWithinBound ??\n (value => {\n if (value.length > 1000) {\n throw new Error(\n 'Knowledge record text exceeds the 1000 UTF-16 code unit limit; split it into separate facts or summarize it',\n );\n }\n });\n }\n assertRecordTextWithinBound(text);\n}\n\ninterface QueryResult {\n rows: Record<string, unknown>[];\n rowsAffected: number;\n}\n\ninterface Executor {\n execute(statement: string | { sql: string; args?: unknown[] }): Promise<QueryResult>;\n}\n\nfunction mysqlSql(sql: string): string {\n return sql\n .replaceAll('jsonb(?)', 'CAST(? AS JSON)')\n .replaceAll('INSERT OR IGNORE', 'INSERT IGNORE')\n .replaceAll('\"', '`');\n}\n\nfunction createExecutor(client: Pick<Pool, 'query'> | Pick<PoolConnection, 'query'>): Executor {\n return {\n async execute(statement) {\n const sql = typeof statement === 'string' ? statement : statement.sql;\n const args = (typeof statement === 'string' ? [] : (statement.args ?? [])).map(value =>\n typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(value)\n ? value.replace('T', ' ').replace('Z', '')\n : value,\n );\n const [result] = await client.query(mysqlSql(sql), args);\n if (Array.isArray(result)) return { rows: result as RowDataPacket[], rowsAffected: 0 };\n return { rows: [], rowsAffected: (result as ResultSetHeader).affectedRows };\n },\n };\n}\n\n/**\n * Scope keys visible to a caller holding `scope`: a row is visible when its scope is a subset of the\n * caller's (companion entries such as `resource:x:uncurated` make this more than a prefix match).\n * Matching rows by `scopeKey` keeps visibility filters on an index; a caller scope has only a few\n * entries, so the list stays small.\n */\nfunction visibleScopeKeys(scope: KnowledgeScope): string[] {\n const canonical = canonicalizeKnowledgeScope(scope);\n const keys = new Set<string>();\n for (let mask = 1; mask < 1 << canonical.length; mask++) {\n try {\n keys.add(knowledgeScopeKey(canonical.filter((_, index) => mask & (1 << index))));\n } catch {\n // Not a valid scope, so no stored row can carry it.\n }\n }\n return [...keys];\n}\n\nconst visibleSql = (keys: string[], scopeKeyColumn = 'scopeKey') =>\n `${scopeKeyColumn} IN (${keys.map(() => '?').join(',')})`;\n\nfunction parseJson<T>(value: unknown): T {\n if (typeof value === 'string') return JSON.parse(value) as T;\n if (value instanceof Uint8Array) return JSON.parse(new TextDecoder().decode(value)) as T;\n if (value instanceof ArrayBuffer) return JSON.parse(new TextDecoder().decode(value)) as T;\n return value as T;\n}\n\nfunction toDate(value: unknown): Date {\n return value instanceof Date ? new Date(value) : new Date(String(value));\n}\n\nfunction optionalDate(value: unknown): Date | undefined {\n return value == null ? undefined : toDate(value);\n}\n\nfunction databaseTimestamp(value: Date): string {\n const pad = (part: number, width = 2) => String(part).padStart(width, '0');\n return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())} ${pad(value.getHours())}:${pad(value.getMinutes())}:${pad(value.getSeconds())}.${pad(value.getMilliseconds(), 3)}`;\n}\n\nfunction canonicalName(name: string): string {\n return name.trim().toLocaleLowerCase();\n}\n\nfunction nodeReferenceId(node: KnowledgeNode | string): string {\n return typeof node === 'string' ? node : node.id;\n}\n\nfunction escapeLikePattern(value: string): string {\n return value.replaceAll('=', '==').replaceAll('%', '=%').replaceAll('_', '=_');\n}\n\nfunction parseNode(row: Record<string, unknown>): KnowledgeNode {\n return {\n id: String(row.id),\n type: 'node',\n name: String(row.name),\n kind: String(row.kind),\n content: row.content == null ? undefined : String(row.content),\n description: row.description == null ? undefined : String(row.description),\n scope: parseJson(row.scopeJson ?? row.scope),\n version: Number(row.version),\n mergedInto: row.mergedInto == null ? undefined : String(row.mergedInto),\n createdAt: toDate(row.createdAt),\n updatedAt: toDate(row.updatedAt),\n };\n}\n\nfunction parseKnowledge(row: Record<string, unknown>): KnowledgeRecord {\n return {\n id: String(row.id),\n node: String(row.node),\n text: String(row.text),\n scope: parseJson(row.scopeJson ?? row.scope),\n sourceThreadId: String(row.sourceThreadId),\n capturedAt: toDate(row.capturedAt),\n when: optionalDate(row.when),\n metadata: row.metadata == null ? undefined : parseJson<Record<string, unknown>>(row.metadata),\n deletedAt: optionalDate(row.deletedAt),\n deletedBy: row.deletedBy == null ? undefined : String(row.deletedBy),\n };\n}\n\nfunction parseOutbox(row: Record<string, unknown>): KnowledgeSemanticOutboxEntry {\n return {\n id: String(row.id),\n idempotencyKey: String(row.idempotencyKey),\n documentId: String(row.documentId),\n documentType: String(row.documentType) as KnowledgeSemanticDocumentType,\n operation: String(row.operation) as KnowledgeSemanticOperation,\n scope: parseJson(row.scopeJson ?? row.scope),\n status: String(row.status) as KnowledgeSemanticOutboxEntry['status'],\n attempts: Number(row.attempts),\n availableAt: toDate(row.availableAt),\n claimedAt: optionalDate(row.claimedAt),\n claimedBy: row.claimedBy == null ? undefined : String(row.claimedBy),\n createdAt: toDate(row.createdAt),\n completedAt: optionalDate(row.completedAt),\n };\n}\n\nconst KNOWLEDGE_INDEX_DDL = [\n `CREATE UNIQUE INDEX idx_knowledge_nodes_identity ON \"${TABLE_KNOWLEDGE_NODES}\" (type(32), scopeKey(255), canonicalName(255))`,\n `CREATE INDEX idx_knowledge_nodes_scope ON \"${TABLE_KNOWLEDGE_NODES}\" (scopeKey(255), type(32))`,\n `CREATE INDEX idx_knowledge_nodes_name ON \"${TABLE_KNOWLEDGE_NODES}\" (type(32), canonicalName(255))`,\n `CREATE INDEX idx_knowledge_records_node_latest ON \"${TABLE_KNOWLEDGE_RECORDS}\" (node(191), id(26) DESC)`,\n `CREATE INDEX idx_knowledge_records_thread_latest ON \"${TABLE_KNOWLEDGE_RECORDS}\" (sourceThreadId(191), id(26) DESC)`,\n `CREATE INDEX idx_knowledge_mentions_record ON \"${TABLE_KNOWLEDGE_MENTIONS}\" (recordId(191), sourceType(32), sourceId(191))`,\n `CREATE INDEX idx_knowledge_activity_latest ON \"${TABLE_KNOWLEDGE_ACTIVITY}\" (id(26) DESC)`,\n `CREATE INDEX idx_knowledge_records_scope ON \"${TABLE_KNOWLEDGE_RECORDS}\" (scopeKey(255), id(26))`,\n `CREATE INDEX idx_knowledge_activity_scope ON \"${TABLE_KNOWLEDGE_ACTIVITY}\" (scopeKey(255), id(26) DESC)`,\n `CREATE UNIQUE INDEX idx_knowledge_outbox_idempotency ON \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (idempotencyKey(255))`,\n `CREATE INDEX idx_knowledge_outbox_claim ON \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (status(32), availableAt, createdAt)`,\n];\n\n// Duplicated from Core so this adapter keeps working against Core versions that predate the deprecation.\nconst KNOWLEDGE_CURATION_CURSOR_REMOVED_MESSAGE =\n 'Knowledge curation cursors were removed: observation-time curate is the only Knowledge writer and needs no cursor.';\n\nexport class KnowledgeMySQL extends KnowledgeStorage {\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_NODES, schema: KNOWLEDGE_NODES_SCHEMA }),\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_RECORDS, schema: KNOWLEDGE_RECORDS_SCHEMA }),\n generateTableSQL({\n tableName: TABLE_KNOWLEDGE_MENTIONS,\n schema: KNOWLEDGE_MENTIONS_SCHEMA,\n compositePrimaryKey: ['sourceType', 'sourceId', 'recordId'],\n }),\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_ACTIVITY, schema: KNOWLEDGE_ACTIVITY_SCHEMA }),\n generateTableSQL({ tableName: TABLE_KNOWLEDGE_SEMANTIC_OUTBOX, schema: KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA }),\n ...KNOWLEDGE_INDEX_DDL.map(mysqlSql),\n ];\n }\n\n readonly #pool: Pool;\n readonly #client: Executor;\n readonly #operations: StoreOperationsMySQL;\n\n constructor({ pool, operations }: { pool: Pool; operations: StoreOperationsMySQL }) {\n super();\n this.#pool = pool;\n this.#client = createExecutor(pool);\n this.#operations = operations;\n }\n\n async init(): Promise<void> {\n await this.#operations.createTable({ tableName: TABLE_KNOWLEDGE_NODES, schema: KNOWLEDGE_NODES_SCHEMA });\n // Add description column for backwards compatibility with existing databases\n await this.#operations.alterTable({\n tableName: TABLE_KNOWLEDGE_NODES,\n schema: KNOWLEDGE_NODES_SCHEMA,\n ifNotExists: ['description'],\n });\n await this.#operations.createTable({ tableName: TABLE_KNOWLEDGE_RECORDS, schema: KNOWLEDGE_RECORDS_SCHEMA });\n await this.#operations.createTable({\n tableName: TABLE_KNOWLEDGE_MENTIONS,\n schema: KNOWLEDGE_MENTIONS_SCHEMA,\n });\n await this.#operations.createTable({ tableName: TABLE_KNOWLEDGE_ACTIVITY, schema: KNOWLEDGE_ACTIVITY_SCHEMA });\n await this.#operations.createTable({\n tableName: TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n schema: KNOWLEDGE_SEMANTIC_OUTBOX_SCHEMA,\n });\n for (const sql of KNOWLEDGE_INDEX_DDL) {\n try {\n await this.#client.execute(sql);\n } catch (error) {\n if ((error as { code?: string }).code !== 'ER_DUP_KEYNAME') throw error;\n }\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#transaction(async tx => {\n for (const table of [\n TABLE_KNOWLEDGE_MENTIONS,\n TABLE_KNOWLEDGE_RECORDS,\n TABLE_KNOWLEDGE_NODES,\n TABLE_KNOWLEDGE_ACTIVITY,\n TABLE_KNOWLEDGE_SEMANTIC_OUTBOX,\n ]) {\n await tx.execute(`DELETE FROM \"${table}\"`);\n }\n });\n }\n\n async createNode(input: CreateKnowledgeNodeInput): Promise<KnowledgeNode> {\n await assertKnowledgeDescriptionWithinBoundCompat(input.description);\n if (input.scopeAddresses?.length) {\n // Peer-floor safe: mirrors KnowledgeUnsupportedCapabilityError without importing it.\n const error = new Error('This Knowledge storage adapter does not expose structural scope placement.');\n error.name = 'KnowledgeUnsupportedCapabilityError';\n throw error;\n }\n const scope = canonicalizeKnowledgeScope(input.scope);\n return this.#transaction(async tx => {\n const existing = await this.#getNodeByName(tx, input.name, scope);\n if (existing) {\n const terminal = (await this.#resolveTerminalNode(tx, existing.id))!;\n if (!isKnowledgeScopeVisible(terminal.scope, scope)) {\n throw new Error(`Merged knowledge node is not visible from scope: ${input.name}`);\n }\n return terminal;\n }\n const now = new Date();\n const node: KnowledgeNode = {\n id: input.id ?? crypto.randomUUID(),\n type: 'node',\n name: input.name.trim(),\n kind: input.kind,\n content: input.content,\n description: input.description,\n scope,\n version: 1,\n createdAt: now,\n updatedAt: now,\n };\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_NODES}\" (id,type,name,canonicalName,kind,content,description,scope,scopeKey,version,mergedInto,createdAt,updatedAt) VALUES (?,?,?,?,?,?,?,jsonb(?),?,?,NULL,?,?)`,\n args: [\n node.id,\n 'node',\n node.name,\n canonicalName(node.name),\n node.kind,\n node.content ?? null,\n node.description ?? null,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n node.version,\n now.toISOString(),\n now.toISOString(),\n ],\n });\n await this.#replaceMentions(tx, 'node', node.id, node.content ?? '', input.resolutionScope ?? scope, scope);\n await this.#activity(tx, 'node-created', 'node', node.id, scope);\n await this.#outbox(tx, 'node', node.id, 'upsert', node.version, scope);\n return node;\n });\n }\n\n async getNode(id: string): Promise<KnowledgeNode | null> {\n return this.#getNode(this.#client, id);\n }\n\n async getNodeByName(input: { name: string; scope: KnowledgeScope }): Promise<KnowledgeNode | null> {\n return this.#getNodeByName(this.#client, input.name, canonicalizeKnowledgeScope(input.scope));\n }\n\n async resolveNode(input: { name: string; scope: KnowledgeScope }): Promise<KnowledgeNode | null> {\n return this.#resolveNode(this.#client, input.name, canonicalizeKnowledgeScope(input.scope));\n }\n\n async listNodes(input: ListKnowledgeNodesInput): Promise<KnowledgeNode[]> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const clauses = [`type = 'node'`, 'mergedInto IS NULL', visibleSql(keys)];\n const args: unknown[] = [...keys];\n if (input.namePrefix) {\n clauses.push(\"canonicalName LIKE ? ESCAPE '='\");\n args.push(`${escapeLikePattern(canonicalName(input.namePrefix))}%`);\n }\n if (input.kind) {\n clauses.push('kind = ?');\n args.push(input.kind);\n }\n if (input.hasContent !== undefined)\n clauses.push(input.hasContent ? \"content IS NOT NULL AND content <> ''\" : \"(content IS NULL OR content = '')\");\n if (input.cursor) {\n const cursor = parseKnowledgeNodeCursor(input.cursor, {\n namePrefix: input.namePrefix,\n kind: input.kind,\n hasContent: input.hasContent,\n });\n const updatedAt = databaseTimestamp(cursor.updatedAt);\n clauses.push('(updatedAt < ? OR (updatedAt = ? AND (name > ? OR (name = ? AND id > ?))))');\n args.push(updatedAt, updatedAt, cursor.name, cursor.name, cursor.id);\n }\n args.push(input.limit ?? 100);\n const result = await this.#client.execute({\n sql: `SELECT *, scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE ${clauses.join(' AND ')} ORDER BY updatedAt DESC, name ASC, id ASC LIMIT ?`,\n args,\n });\n return result.rows.map(parseNode);\n }\n\n async updateNode(input: UpdateKnowledgeNodeInput): Promise<KnowledgeNode> {\n await assertKnowledgeDescriptionWithinBoundCompat(input.description);\n return this.#transaction(async tx => {\n const existing = await this.#getNode(tx, input.id);\n if (!existing) throw new KnowledgeNotFoundError('node', input.id);\n if (existing.mergedInto) throw new Error(`Cannot update merged knowledge node: ${input.id}`);\n const scope = canonicalizeKnowledgeScope(input.scope ?? existing.scope);\n const name = (input.name ?? existing.name).trim();\n const content = input.content ?? existing.content;\n const description = input.description ?? existing.description;\n const now = new Date();\n const result = await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET name=?,canonicalName=?,kind=?,content=?,description=?,scope=jsonb(?),scopeKey=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=?`,\n args: [\n name,\n canonicalName(name),\n input.kind ?? existing.kind,\n content ?? null,\n description ?? null,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n now.toISOString(),\n input.id,\n input.version,\n ],\n });\n if (result.rowsAffected === 0) throw new KnowledgeConflictError(input.id);\n if (input.content !== undefined || input.name !== undefined || input.scope !== undefined) {\n await this.#replaceMentions(tx, 'node', input.id, content ?? '', input.resolutionScope ?? scope, scope);\n }\n await this.#activity(tx, 'node-updated', 'node', input.id, scope);\n if (knowledgeScopeKey(existing.scope) !== knowledgeScopeKey(scope)) {\n await this.#outbox(tx, 'node', input.id, 'delete', createKnowledgeUlid(), existing.scope);\n const records = await tx.execute({\n sql: `SELECT id,scope AS scopeJson,deletedAt FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE node=?`,\n args: [input.id],\n });\n for (const row of records.rows) {\n const factScope = parseJson<KnowledgeScope>(row.scopeJson);\n await this.#outbox(tx, 'record', String(row.id), 'delete', createKnowledgeUlid(), factScope);\n if (row.deletedAt == null) {\n await this.#outbox(tx, 'record', String(row.id), 'upsert', createKnowledgeUlid(), factScope);\n }\n }\n }\n await this.#outbox(tx, 'node', input.id, 'upsert', input.version + 1, scope);\n return {\n ...existing,\n name,\n kind: input.kind ?? existing.kind,\n content,\n description,\n scope,\n version: input.version + 1,\n updatedAt: now,\n };\n });\n }\n\n async mergeNodes(input: { sourceId: string; targetId: string; sourceVersion: number }): Promise<KnowledgeNode> {\n if (input.sourceId === input.targetId) throw new Error('Cannot merge a knowledge node into itself');\n return this.#transaction(async tx => {\n const source = await this.#getNode(tx, input.sourceId);\n if (!source) throw new KnowledgeNotFoundError('node', input.sourceId);\n const target = await this.#resolveTerminalNode(tx, input.targetId);\n if (!target) throw new KnowledgeNotFoundError('node', input.targetId);\n if (target.id === source.id) throw new Error('Cannot create a knowledge merge cycle');\n if (!isKnowledgeScopeVisible(target.scope, source.scope)) {\n throw new Error('Cannot merge a knowledge node into a target that is narrower than its source scope');\n }\n const affected = await tx.execute({\n sql: `SELECT DISTINCT m.sourceType,m.sourceId,COALESCE(f.scope,r.scope) AS scopeJson,CASE WHEN f.deletedAt IS NULL THEN 0 ELSE 1 END AS deleted FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" m LEFT JOIN \"${TABLE_KNOWLEDGE_RECORDS}\" f ON m.sourceType='record' AND f.id=m.sourceId LEFT JOIN \"${TABLE_KNOWLEDGE_NODES}\" r ON m.sourceType='node' AND r.id=m.sourceId WHERE m.recordId=?`,\n args: [source.id],\n });\n const movedFacts = await tx.execute({\n sql: `SELECT id,scope AS scopeJson,deletedAt FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE node=?`,\n args: [source.id],\n });\n const updated = await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET mergedInto=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=? AND mergedInto IS NULL`,\n args: [target.id, new Date().toISOString(), source.id, input.sourceVersion],\n });\n if (updated.rowsAffected === 0) throw new KnowledgeConflictError(source.id);\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET node=? WHERE node=?`,\n args: [target.id, source.id],\n });\n await tx.execute({\n sql: `DELETE source FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" source JOIN \"${TABLE_KNOWLEDGE_MENTIONS}\" target ON target.sourceType=source.sourceType AND target.sourceId=source.sourceId WHERE source.recordId=? AND target.recordId=?`,\n args: [source.id, target.id],\n });\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_MENTIONS}\" SET recordId=? WHERE recordId=?`,\n args: [target.id, source.id],\n });\n for (const row of movedFacts.rows)\n await this.#outbox(\n tx,\n 'record',\n String(row.id),\n row.deletedAt == null ? 'upsert' : 'delete',\n createKnowledgeUlid(),\n parseJson(row.scopeJson),\n );\n for (const row of affected.rows)\n await this.#outbox(\n tx,\n String(row.sourceType) as 'record' | 'node',\n String(row.sourceId),\n Number(row.deleted) ? 'delete' : 'upsert',\n createKnowledgeUlid(),\n parseJson<KnowledgeScope>(row.scopeJson),\n );\n // Merge matrix: a target that NEVER had a description (undefined — '' is an explicit curator\n // clear and wins) adopts the source's; otherwise the target's state is preserved.\n let mergedTarget = target;\n if (target.description === undefined && source.description) {\n const adoptedAt = new Date();\n // Adoption is conditional on the target state this merge observed: a concurrent write (a new\n // description, or an intentional '' clear) bumps the version and loses the predicate, so the\n // merge leaves that newer value alone instead of clobbering it with the source's synopsis.\n const adopted = await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_NODES}\" SET description=?,version=version+1,updatedAt=? WHERE id=? AND type='node' AND version=? AND description IS NULL`,\n args: [source.description, adoptedAt.toISOString(), target.id, target.version],\n });\n if (adopted.rowsAffected > 0) {\n mergedTarget = {\n ...target,\n description: source.description,\n version: target.version + 1,\n updatedAt: adoptedAt,\n };\n await this.#activity(tx, 'node-updated', 'node', target.id, target.scope);\n }\n }\n await this.#activity(tx, 'node-merged', 'node', source.id, source.scope);\n await this.#outbox(tx, 'node', source.id, 'delete', input.sourceVersion + 1, source.scope);\n await this.#outbox(tx, 'node', target.id, 'upsert', createKnowledgeUlid(), mergedTarget.scope);\n return mergedTarget;\n });\n }\n\n async appendKnowledge(input: AppendKnowledgeInput): Promise<KnowledgeRecord> {\n await assertKnowledgeRecordTextWithinBoundCompat(input.text);\n const scope = canonicalizeKnowledgeScope(input.scope);\n const resolutionScope = canonicalizeKnowledgeScope(input.resolutionScope);\n const defaultScope = canonicalizeKnowledgeScope(input.defaultScope);\n return this.#transaction(async tx => {\n const parent = await this.#resolveTerminalNode(tx, nodeReferenceId(input.node));\n if (!parent) throw new KnowledgeNotFoundError('node', nodeReferenceId(input.node));\n const record: KnowledgeRecord = {\n id: input.id ?? createKnowledgeUlid(),\n node: parent.id,\n text: input.text,\n scope,\n sourceThreadId: input.sourceThreadId,\n capturedAt: new Date(),\n when: input.when ? new Date(input.when) : undefined,\n metadata: input.metadata,\n };\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_RECORDS}\" (id,node,text,scope,scopeKey,sourceThreadId,capturedAt,\"when\",metadata,deletedAt,deletedBy) VALUES (?,?,?,jsonb(?),?,?,?,?,jsonb(?),NULL,NULL)`,\n args: [\n record.id,\n record.node,\n record.text,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n record.sourceThreadId,\n record.capturedAt.toISOString(),\n record.when?.toISOString() ?? null,\n record.metadata ? JSON.stringify(record.metadata) : null,\n ],\n });\n await this.#replaceMentions(tx, 'record', record.id, record.text, resolutionScope, defaultScope);\n await this.#activity(tx, 'record-created', 'record', record.id, scope, record.sourceThreadId);\n await this.#outbox(tx, 'record', record.id, 'upsert', record.id, scope);\n return record;\n });\n }\n\n async getKnowledge(input: { id: string; includeDeleted?: boolean }): Promise<KnowledgeRecord | null> {\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE id=?${input.includeDeleted ? '' : ' AND deletedAt IS NULL'}`,\n args: [input.id],\n });\n return result.rows[0] ? parseKnowledge(result.rows[0]) : null;\n }\n\n async listKnowledgeAbout(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n return this.#queryKnowledge(input, 'about');\n }\n async listKnowledgeMentioning(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n return this.#queryKnowledge(input, 'mentioning');\n }\n\n async listKnowledgeRelatedTo(input: QueryKnowledgeInput): Promise<QueryKnowledgeOutput> {\n return this.#queryKnowledge(input, 'related');\n }\n\n async knowledgeBySource(input: QueryKnowledgeBySourceInput): Promise<QueryKnowledgeOutput> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const args: unknown[] = [input.sourceThreadId, ...keys];\n if (input.after) args.push(input.after);\n const limit = input.limit ?? 100;\n args.push(limit + 1);\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE sourceThreadId=? AND ${visibleSql(keys)}${input.includeDeleted ? '' : ' AND deletedAt IS NULL'}${input.after ? ' AND id > ?' : ''} ORDER BY id ASC LIMIT ?`,\n args,\n });\n const records = result.rows.map(parseKnowledge);\n return {\n records: records.slice(0, limit),\n nextCursor: records.length > limit ? records[limit - 1]?.id : undefined,\n };\n }\n\n async removeKnowledge(input: { id: string; deletedBy: string }): Promise<KnowledgeRecord> {\n return this.#transaction(async tx => {\n const record = await this.#getKnowledge(tx, input.id, true);\n if (!record) throw new KnowledgeNotFoundError('record', input.id);\n if (record.deletedAt) return record;\n const deletedAt = new Date();\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET deletedAt=?,deletedBy=? WHERE id=? AND deletedAt IS NULL`,\n args: [deletedAt.toISOString(), input.deletedBy, input.id],\n });\n await this.#activity(tx, 'record-deleted', 'record', input.id, record.scope, record.sourceThreadId);\n await this.#outbox(tx, 'record', input.id, 'delete', deletedAt.toISOString(), record.scope);\n return { ...record, deletedAt, deletedBy: input.deletedBy };\n });\n }\n\n async restoreKnowledge(input: { id: string }): Promise<KnowledgeRecord> {\n return this.#transaction(async tx => {\n const record = await this.#getKnowledge(tx, input.id, true);\n if (!record) throw new KnowledgeNotFoundError('record', input.id);\n if (!record.deletedAt) return record;\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET deletedAt=NULL,deletedBy=NULL WHERE id=?`,\n args: [input.id],\n });\n await this.#activity(tx, 'record-restored', 'record', input.id, record.scope, record.sourceThreadId);\n await this.#outbox(tx, 'record', input.id, 'upsert', createKnowledgeUlid(), record.scope);\n return { ...record, deletedAt: undefined, deletedBy: undefined };\n });\n }\n\n async rescopeKnowledge(input: { id: string; scope: KnowledgeScope }): Promise<KnowledgeRecord> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n return this.#transaction(async tx => {\n const record = await this.#getKnowledge(tx, input.id, true);\n if (!record) throw new KnowledgeNotFoundError('record', input.id);\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_RECORDS}\" SET scope=jsonb(?),scopeKey=? WHERE id=?`,\n args: [JSON.stringify(scope), knowledgeScopeKey(scope), input.id],\n });\n await this.#activity(tx, 'record-rescoped', 'record', input.id, scope, record.sourceThreadId);\n if (knowledgeScopeKey(record.scope) !== knowledgeScopeKey(scope))\n await this.#outbox(tx, 'record', input.id, 'delete', createKnowledgeUlid(), record.scope);\n if (!record.deletedAt) await this.#outbox(tx, 'record', input.id, 'upsert', createKnowledgeUlid(), scope);\n return { ...record, scope };\n });\n }\n\n async search(input: SearchKnowledgeInput): Promise<SearchKnowledgeResult[]> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const normalizedQuery = input.query.trim().toLocaleLowerCase();\n if (!normalizedQuery) return [];\n const query = `%${escapeLikePattern(normalizedQuery)}%`;\n const records = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE mergedInto IS NULL AND ${visibleSql(keys)} AND (canonicalName LIKE ? ESCAPE '=' OR lower(COALESCE(kind,'')) LIKE ? ESCAPE '=' OR lower(COALESCE(content,'')) LIKE ? ESCAPE '=' OR lower(COALESCE(description,'')) LIKE ? ESCAPE '=') ORDER BY updatedAt DESC LIMIT ?`,\n args: [...keys, query, query, query, query, input.limit ?? 20],\n });\n const results: SearchKnowledgeResult[] = records.rows.map(row => ({\n type: String(row.type) as 'node',\n id: String(row.id),\n recordId: String(row.id),\n name: String(row.name),\n // Description joins the snippet only when present so description-less results stay byte-identical.\n text: [\n String(row.name),\n ...(row.description ? [String(row.description)] : []),\n ...(row.content ? [String(row.content)] : []),\n ].join('\\n'),\n scope: parseJson<KnowledgeScope>(row.scopeJson),\n }));\n if (results.length < (input.limit ?? 20)) {\n const records = await this.#client.execute({\n sql: `SELECT f.*,f.scope AS scopeJson,r.name,r.scope AS parentScopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" f JOIN \"${TABLE_KNOWLEDGE_NODES}\" r ON r.id=f.node AND r.type='node' AND r.mergedInto IS NULL WHERE f.deletedAt IS NULL AND ${visibleSql(keys, 'f.scopeKey')} AND lower(f.text) LIKE ? ESCAPE '=' ORDER BY f.id DESC LIMIT ?`,\n args: [...keys, query, (input.limit ?? 20) - results.length],\n });\n results.push(\n ...records.rows.map(row => {\n const parentVisible = isKnowledgeScopeVisible(parseJson<KnowledgeScope>(row.parentScopeJson), scope);\n return {\n type: 'record' as const,\n id: String(row.id),\n recordId: parentVisible ? String(row.node) : String(row.id),\n name: parentVisible ? String(row.name) : '(private node)',\n text: String(row.text),\n scope: parseJson<KnowledgeScope>(row.scopeJson),\n };\n }),\n );\n }\n return results;\n }\n\n /**\n * @deprecated Curation cursors were removed. Observation-time curate is the only Knowledge writer and needs no\n * cursor. Always throws.\n */\n async getCurationCursor(_input: { sourceThreadId: string; agent: string }): Promise<KnowledgeCurationCursor | null> {\n throw new Error(KNOWLEDGE_CURATION_CURSOR_REMOVED_MESSAGE);\n }\n\n /**\n * @deprecated Curation cursors were removed. Observation-time curate is the only Knowledge writer and needs no\n * cursor. Always throws.\n */\n async advanceCurationCursor(_input: {\n sourceThreadId: string;\n agent: string;\n lastKnowledgeId: string;\n }): Promise<KnowledgeCurationCursor> {\n throw new Error(KNOWLEDGE_CURATION_CURSOR_REMOVED_MESSAGE);\n }\n\n async listActivity(input: {\n scope: KnowledgeScope;\n after?: string;\n limit?: number;\n }): Promise<KnowledgeActivityEvent[]> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const keys = visibleScopeKeys(scope);\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_ACTIVITY}\" WHERE ${visibleSql(keys)}${input.after ? ' AND id < ?' : ''} ORDER BY id DESC LIMIT ?`,\n args: [...keys, ...(input.after ? [input.after] : []), input.limit ?? 100],\n });\n return result.rows.map(row => ({\n id: String(row.id),\n action: String(row.action) as KnowledgeActivityAction,\n recordType: String(row.recordType) as KnowledgeSemanticDocumentType,\n recordId: String(row.recordId),\n scope: parseJson<KnowledgeScope>(row.scopeJson),\n sourceThreadId: row.sourceThreadId == null ? undefined : String(row.sourceThreadId),\n createdAt: toDate(row.createdAt),\n }));\n }\n\n async listSemanticOutbox(\n input: { status?: KnowledgeSemanticOutboxEntry['status']; scope?: KnowledgeScope; limit?: number } = {},\n ): Promise<KnowledgeSemanticOutboxEntry[]> {\n const clauses: string[] = [];\n const args: unknown[] = [];\n if (input.status) {\n clauses.push('status=?');\n args.push(input.status);\n }\n if (input.scope) {\n const keys = visibleScopeKeys(input.scope);\n clauses.push(visibleSql(keys));\n args.push(...keys);\n }\n args.push(input.limit ?? 100);\n const result = await this.#client.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\"${clauses.length ? ` WHERE ${clauses.join(' AND ')}` : ''} ORDER BY createdAt ASC,id ASC LIMIT ?`,\n args,\n });\n return result.rows.map(parseOutbox);\n }\n\n async claimSemanticOutbox(input: ClaimKnowledgeSemanticOutboxInput): Promise<KnowledgeSemanticOutboxEntry[]> {\n const now = input.now ?? new Date();\n const stale = new Date(now.getTime() - (input.claimTimeoutMs ?? 60_000));\n return this.#transaction(async tx => {\n const clauses = [\n `availableAt <= ?`,\n `(status='pending' OR (status='processing' AND claimedAt <= ?))`,\n `NOT EXISTS (SELECT 1 FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" AS earlier WHERE earlier.documentId = \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".documentId AND earlier.status != 'completed' AND (earlier.createdAt < \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".createdAt OR (earlier.createdAt = \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".createdAt AND earlier.id < \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\".id)))`,\n ];\n const args: unknown[] = [now.toISOString(), stale.toISOString()];\n if (input.scope) {\n const keys = visibleScopeKeys(input.scope);\n clauses.push(visibleSql(keys));\n args.push(...keys);\n }\n args.push(input.limit ?? 100);\n const selected = await tx.execute({\n sql: `SELECT id FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" WHERE ${clauses.join(' AND ')} ORDER BY createdAt ASC,id ASC LIMIT ? FOR UPDATE SKIP LOCKED`,\n args,\n });\n const ids = selected.rows.map(row => String(row.id));\n for (const id of ids)\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='processing',attempts=attempts+1,claimedAt=?,claimedBy=? WHERE id=?`,\n args: [now.toISOString(), input.workerId, id],\n });\n if (!ids.length) return [];\n const result = await tx.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" WHERE id IN (${ids.map(() => '?').join(',')}) ORDER BY createdAt ASC,id ASC`,\n args: ids,\n });\n return result.rows.map(parseOutbox);\n });\n }\n\n async completeSemanticOutbox(input: { ids: string[]; workerId: string }): Promise<void> {\n if (!input.ids.length) return;\n const now = new Date().toISOString();\n await this.#transaction(async tx => {\n for (const id of input.ids)\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='completed',completedAt=? WHERE id=? AND status='processing' AND claimedBy=?`,\n args: [now, id, input.workerId],\n });\n });\n }\n async releaseSemanticOutbox(input: { ids: string[]; workerId: string; retryAt?: Date }): Promise<void> {\n if (!input.ids.length) return;\n await this.#transaction(async tx => {\n for (const id of input.ids)\n await tx.execute({\n sql: `UPDATE \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" SET status='pending',availableAt=?,claimedAt=NULL,claimedBy=NULL WHERE id=? AND status='processing' AND claimedBy=?`,\n args: [(input.retryAt ?? new Date()).toISOString(), id, input.workerId],\n });\n });\n }\n\n async #transaction<T>(operation: (tx: Executor) => Promise<T>): Promise<T> {\n const connection = await this.#pool.getConnection();\n try {\n await connection.beginTransaction();\n const result = await operation(createExecutor(connection));\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback();\n throw error;\n } finally {\n connection.release();\n }\n }\n async #getNode(executor: Executor, id: string): Promise<KnowledgeNode | null> {\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE id=? AND type='node'`,\n args: [id],\n });\n return result.rows[0] ? parseNode(result.rows[0]) : null;\n }\n async #getNodeByName(executor: Executor, name: string, scope: KnowledgeScope): Promise<KnowledgeNode | null> {\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE type='node' AND scopeKey=? AND canonicalName=?`,\n args: [knowledgeScopeKey(scope), canonicalName(name)],\n });\n return result.rows[0] ? parseNode(result.rows[0]) : null;\n }\n async #resolveNode(executor: Executor, name: string, scope: KnowledgeScope): Promise<KnowledgeNode | null> {\n // An unmerged node outside the caller's scope resolves to itself and can never be visible, so only\n // visible-scope rows and merged aliases (whose terminal may be visible) are candidates.\n const keys = visibleScopeKeys(scope);\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_NODES}\" WHERE type='node' AND canonicalName=? AND (scopeKey IN (${keys.map(() => '?').join(',')}) OR mergedInto IS NOT NULL)`,\n args: [canonicalName(name), ...keys],\n });\n const candidates = result.rows.map(parseNode).sort((left, right) => right.scope.length - left.scope.length);\n for (const candidate of candidates) {\n const terminal = await this.#resolveTerminalNode(executor, candidate.id);\n if (terminal && isKnowledgeScopeVisible(terminal.scope, scope)) return terminal;\n }\n return null;\n }\n async #resolveTerminalNode(executor: Executor, id: string): Promise<KnowledgeNode | null> {\n let node = await this.#getNode(executor, id);\n const seen = new Set<string>();\n while (node?.mergedInto) {\n if (seen.has(node.id)) throw new Error(`Knowledge merge cycle detected at ${node.id}`);\n seen.add(node.id);\n node = await this.#getNode(executor, node.mergedInto);\n }\n return node;\n }\n async #getKnowledge(executor: Executor, id: string, includeDeleted: boolean): Promise<KnowledgeRecord | null> {\n const result = await executor.execute({\n sql: `SELECT *,scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" WHERE id=?${includeDeleted ? '' : ' AND deletedAt IS NULL'}`,\n args: [id],\n });\n return result.rows[0] ? parseKnowledge(result.rows[0]) : null;\n }\n\n async #queryKnowledge(\n input: QueryKnowledgeInput,\n relationship: 'about' | 'mentioning' | 'related',\n ): Promise<QueryKnowledgeOutput> {\n const scope = canonicalizeKnowledgeScope(input.scope);\n const node = await this.#resolveTerminalNode(this.#client, nodeReferenceId(input.node));\n if (!node) return { records: [] };\n const keys = visibleScopeKeys(scope);\n const args: unknown[] = [node.id, ...(relationship === 'related' ? [node.id] : []), ...keys];\n if (input.after) args.push(input.after);\n args.push((input.limit ?? 100) + 1);\n const result = await this.#client.execute({\n sql: `SELECT DISTINCT f.*,f.scope AS scopeJson FROM \"${TABLE_KNOWLEDGE_RECORDS}\" f${relationship === 'about' ? '' : ` LEFT JOIN \"${TABLE_KNOWLEDGE_MENTIONS}\" m ON m.sourceType='record' AND m.sourceId=f.id`} WHERE ${relationship === 'about' ? 'f.node=?' : relationship === 'mentioning' ? 'm.recordId=?' : '(f.node=? OR m.recordId=?)'} AND ${visibleSql(keys, 'f.scopeKey')}${input.includeDeleted ? '' : ' AND f.deletedAt IS NULL'}${input.after ? ' AND f.id < ?' : ''} ORDER BY f.id DESC LIMIT ?`,\n args,\n });\n const records = result.rows.map(parseKnowledge);\n const limit = input.limit ?? 100;\n return {\n records: records.slice(0, limit),\n nextCursor: records.length > limit ? records[limit - 1]?.id : undefined,\n };\n }\n\n async #replaceMentions(\n tx: Executor,\n sourceType: 'record' | 'node',\n sourceId: string,\n text: string,\n resolutionScope: KnowledgeScope,\n defaultScope: KnowledgeScope,\n ): Promise<void> {\n await tx.execute({\n sql: `DELETE FROM \"${TABLE_KNOWLEDGE_MENTIONS}\" WHERE sourceType=? AND sourceId=?`,\n args: [sourceType, sourceId],\n });\n for (const name of parseKnowledgeWikilinks(text)) {\n let node = await this.#resolveNode(tx, name, resolutionScope);\n if (!node) {\n node = await this.#getNodeByName(tx, name, defaultScope);\n if (node) node = await this.#resolveTerminalNode(tx, node.id);\n if (!node) {\n const now = new Date();\n node = {\n id: crypto.randomUUID(),\n type: 'node',\n name,\n kind: 'node',\n scope: defaultScope,\n version: 1,\n createdAt: now,\n updatedAt: now,\n };\n await tx.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_NODES}\" (id,type,name,canonicalName,kind,content,scope,scopeKey,version,mergedInto,createdAt,updatedAt) VALUES (?,?,?,?,?,NULL,jsonb(?),?,?,NULL,?,?)`,\n args: [\n node.id,\n 'node',\n node.name,\n canonicalName(node.name),\n node.kind,\n JSON.stringify(defaultScope),\n knowledgeScopeKey(defaultScope),\n 1,\n now.toISOString(),\n ],\n });\n await this.#activity(tx, 'node-created', 'node', node.id, defaultScope);\n await this.#outbox(tx, 'node', node.id, 'upsert', 1, defaultScope);\n }\n }\n await tx.execute({\n sql: `INSERT OR IGNORE INTO \"${TABLE_KNOWLEDGE_MENTIONS}\" (sourceType,sourceId,recordId) VALUES (?,?,?)`,\n args: [sourceType, sourceId, node.id],\n });\n }\n }\n\n async #activity(\n executor: Executor,\n action: KnowledgeActivityAction,\n recordType: KnowledgeSemanticDocumentType,\n recordId: string,\n scope: KnowledgeScope,\n sourceThreadId?: string,\n ): Promise<void> {\n const now = new Date();\n await executor.execute({\n sql: `INSERT INTO \"${TABLE_KNOWLEDGE_ACTIVITY}\" (id,action,recordType,recordId,scope,scopeKey,sourceThreadId,createdAt) VALUES (?,?,?,?,jsonb(?),?,?,?)`,\n args: [\n createKnowledgeUlid(),\n action,\n recordType,\n recordId,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n sourceThreadId ?? null,\n now.toISOString(),\n ],\n });\n }\n async #outbox(\n executor: Executor,\n documentType: KnowledgeSemanticDocumentType,\n id: string,\n operation: KnowledgeSemanticOperation,\n version: number | string,\n scope: KnowledgeScope,\n ): Promise<void> {\n const documentId = knowledgeSemanticDocumentId(documentType, id);\n const idempotencyKey = knowledgeSemanticIdempotencyKey(documentId, operation, version);\n const now = new Date();\n await executor.execute({\n sql: `INSERT OR IGNORE INTO \"${TABLE_KNOWLEDGE_SEMANTIC_OUTBOX}\" (id,idempotencyKey,documentId,documentType,operation,scope,scopeKey,status,attempts,availableAt,claimedAt,claimedBy,createdAt,completedAt) VALUES (?,?,?,?,?,jsonb(?),?,'pending',0,?,NULL,NULL,?,NULL)`,\n args: [\n createKnowledgeUlid(),\n idempotencyKey,\n documentId,\n documentType,\n operation,\n JSON.stringify(scope),\n knowledgeScopeKey(scope),\n now.toISOString(),\n now.toISOString(),\n ],\n });\n }\n}\n","import { 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 TABLE_SCHEMAS,\n MCP_CLIENTS_SCHEMA,\n MCP_CLIENT_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class MCPClientsMySQL extends MCPClientsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the mcp-clients domain tables.\n * Currently no default indexes are defined for mcp-clients.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_MCP_CLIENTS, schema: TABLE_SCHEMAS[TABLE_MCP_CLIENTS] }),\n generateTableSQL({ tableName: TABLE_MCP_CLIENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_MCP_CLIENT_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MCPClientsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the mcp-clients domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return MCPClientsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for mcp-clients.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for mcp-clients domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_MCP_CLIENTS, schema: MCP_CLIENTS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_MCP_CLIENT_VERSIONS, schema: MCP_CLIENT_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_MCP_CLIENTS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseClientRow(row: Record<string, unknown>): StorageMCPClientType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): MCPClientVersion {\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: this.safeParseJSON(row.servers) as MCPClientVersion['servers'],\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_CLIENTS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseClientRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\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 try {\n await this.operations.delete({ tableName: TABLE_MCP_CLIENTS, keys: { id: mcpClient.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback MCP client creation:', rollbackError);\n }\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_MCP_CLIENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP client with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_MCP_CLIENTS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_CLIENTS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_MCP_CLIENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause = { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_CLIENTS, whereClause });\n if (total === 0) return { mcpClients: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENTS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n mcpClients: rows.map(row => this.parseClientRow(row)),\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('MYSQL', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const now = new Date();\n await this.operations.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,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_CLIENT_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [mcpClientId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`, args: [mcpClientId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`, args: [mcpClientId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_CLIENT_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_CLIENT_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_MCP_CLIENT_VERSIONS)} WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpClientId', 'column name')} = ?`, args: [mcpClientId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { 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 TABLE_SCHEMAS,\n MCP_SERVERS_SCHEMA,\n MCP_SERVER_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class MCPServersMySQL extends MCPServersStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the mcp-servers domain tables.\n * Currently no default indexes are defined for mcp-servers.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_MCP_SERVERS, schema: TABLE_SCHEMAS[TABLE_MCP_SERVERS] }),\n generateTableSQL({ tableName: TABLE_MCP_SERVER_VERSIONS, schema: TABLE_SCHEMAS[TABLE_MCP_SERVER_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MCPServersMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the mcp-servers domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return MCPServersMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for mcp-servers.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for mcp-servers domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_MCP_SERVERS, schema: MCP_SERVERS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_MCP_SERVER_VERSIONS, schema: MCP_SERVER_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_MCP_SERVER_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_MCP_SERVERS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseServerRow(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: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private 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:\n row.isLatest === null || row.isLatest === undefined\n ? undefined\n : Boolean(row.isLatest === true || row.isLatest === 1 || row.isLatest === '1'),\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: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageMCPServerType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_SERVERS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseServerRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\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 try {\n await this.operations.delete({ tableName: TABLE_MCP_SERVERS, keys: { id: mcpServer.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback MCP server creation:', rollbackError);\n }\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_MCP_SERVER', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP server with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_MCP_SERVERS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_SERVERS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_MCP_SERVERS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause = { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_SERVERS, whereClause });\n if (total === 0) return { mcpServers: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVERS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n mcpServers: rows.map(row => this.parseServerRow(row)),\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('MYSQL', 'LIST_MCP_SERVERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n try {\n const now = new Date();\n await this.operations.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,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_MCP_SERVER_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [mcpServerId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`, args: [mcpServerId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`, args: [mcpServerId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_MCP_SERVER_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_MCP_SERVER_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_MCP_SERVER_VERSIONS)} WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('mcpServerId', 'column name')} = ?`, args: [mcpServerId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","//#region src/memory/index.ts\n/**\n* Shared rules for observational memory lifecycle writes. Every storage adapter applies\n* these inside its own atomic section (lock, transaction, or conditional update), so the\n* decisions are identical across adapters.\n*/\n/**\n* Observational memory columns that lifecycle writes depend on. Storage adapters merge these\n* into the table schema they get from `@mastra/core`, so the columns exist even when the\n* installed core predates them.\n*/\nconst OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS = { supersededBy: {\n\ttype: \"text\",\n\tnullable: true\n} };\n/** `schema` plus {@link OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS}; `undefined` when `schema` is. */\nfunction withObservationalMemoryLifecycleColumns(schema) {\n\treturn schema ? {\n\t\t...schema,\n\t\t...OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS\n\t} : void 0;\n}\n/**\n* Canonical head order: `generationCount DESC, createdAt ASC, id ASC`.\n* Returns a negative number when `a` sorts before `b` (i.e. `a` is the better head candidate).\n*/\nfunction compareObservationalMemoryHeadOrder(a, b) {\n\tif (a.generationCount !== b.generationCount) return b.generationCount - a.generationCount;\n\tconst at = new Date(a.createdAt).getTime();\n\tconst bt = new Date(b.createdAt).getTime();\n\tif (at !== bt) return at - bt;\n\treturn a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n/**\n* A buffered chunk stores `lastObservedAt = max message time + 1ms`. It is wholly covered\n* (every message it observed is already at or before the cursor) iff\n* `cursor >= chunk.lastObservedAt - 1ms`.\n*/\nfunction isBufferedChunkCoveredByCursor(chunkLastObservedAt, cursor) {\n\tif (!cursor) return false;\n\treturn new Date(cursor).getTime() >= new Date(chunkLastObservedAt).getTime() - 1;\n}\n/** The later of two cursors; `undefined` only when both are absent. */\nfunction maxObservationCursor(a, b) {\n\tif (!a) return b ? new Date(b) : void 0;\n\tif (!b) return new Date(a);\n\treturn new Date(Math.max(new Date(a).getTime(), new Date(b).getTime()));\n}\n/**\n* Decide the new generation's text when a reflection built from `snapshot` commits against\n* the stored record.\n*\n* - Stored text equals the snapshot: the reflection replaces it.\n* - Stored text extends the snapshot (activation only appends): the appended tail is kept\n* after the reflection, and its tokens are added.\n* - Anything else (a non-append rewrite): `null` — the reflection must not be applied.\n*/\nfunction planReflectionGenerationText(input) {\n\tconst stored = input.storedObservations ?? \"\";\n\tconst snapshot = input.snapshotObservations ?? \"\";\n\tif (stored === snapshot) return {\n\t\tmode: \"equal\",\n\t\tobservations: input.reflection,\n\t\ttokenCount: input.tokenCount\n\t};\n\tif (!stored.startsWith(snapshot)) return null;\n\tconst tail = stored.slice(snapshot.length).trimStart();\n\tif (!tail.trim()) return {\n\t\tmode: \"equal\",\n\t\tobservations: input.reflection,\n\t\ttokenCount: input.tokenCount\n\t};\n\treturn {\n\t\tmode: \"append\",\n\t\tobservations: input.reflection ? `${input.reflection}\\n\\n${tail}` : tail,\n\t\ttokenCount: input.tokenCount + Math.max(0, (input.storedObservationTokenCount ?? 0) - (input.snapshotObservationTokenCount ?? 0))\n\t};\n}\n/**\n* Backs `updateActiveObservations` in adapters that implement `commitActiveObservations`.\n* Callers of `updateActiveObservations` (which resolves `void`) can't see a commit result, so a\n* write that was not applied throws instead of resolving as if it had committed.\n*/\nfunction assertActiveObservationsApplied(result, id) {\n\tif (result.applied) return;\n\tthrow new Error(result.reason === \"retired\" ? `Observational memory record ${id} was superseded by a newer generation; observations were not written` : `Observational memory record ${id} changed since the observations were composed; observations were not written`);\n}\n/**\n* Whether the stored text can still accept a reflection built from `snapshot`\n* (equal, or only appended to since).\n*/\nfunction isAppendOnlySince(storedObservations, snapshotObservations) {\n\tconst stored = storedObservations ?? \"\";\n\tconst snapshot = snapshotObservations ?? \"\";\n\treturn stored === snapshot || stored.startsWith(snapshot);\n}\n//#endregion\nexport { OBSERVATIONAL_MEMORY_LIFECYCLE_COLUMNS, assertActiveObservationsApplied, compareObservationalMemoryHeadOrder, isAppendOnlySince, isBufferedChunkCoveredByCursor, maxObservationCursor, planReflectionGenerationText, withObservationalMemoryLifecycleColumns };\n\n//# sourceMappingURL=index.js.map","import type { RunFence } from '@mastra/core/storage';\nimport { matchesRunFence, RunFenceConflictError } from '@mastra/core/storage';\nimport type { Connection, Pool, PoolConnection, RowDataPacket } from 'mysql2/promise';\nimport { quoteIdentifier } from '../domains/utils';\n\n/** The query method both the pool and a pooled connection offer. */\nexport type Queryable = Pick<Connection, 'execute'>;\n\n/**\n * Epoch milliseconds on the database clock. `UTC_TIMESTAMP` is the time the\n * statement started and doesn't depend on the session time zone. Every lease\n * comparison runs in a statement that already holds the run's owner row, so\n * no lock wait sits between that start time and the comparison.\n */\nexport const DB_NOW_MS = `(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(3)) DIV 1000)`;\n\nconst ER_DUP_ENTRY = 1062;\nconst ER_LOCK_DEADLOCK = 1213;\nconst MAX_CLAIM_ATTEMPTS = 5;\n\n/**\n * The check half of a fenced write; call it first inside the write's\n * transaction. The shared lock holds the claim row until commit, so a claim\n * that updates the row waits for the write to finish, and every later write\n * sees the new claim.\n */\nexport async function assertRunFence(\n q: Queryable,\n claimsTable: string,\n fence: RunFence,\n operation: string,\n): Promise<void> {\n const [rows] = await q.execute<RowDataPacket[]>(\n `SELECT generation, ${quoteIdentifier('ownerId', 'column name')} AS ownerId FROM ${claimsTable}\n WHERE ${quoteIdentifier('runId', 'column name')} = ? LOCK IN SHARE MODE`,\n [fence.runId],\n );\n const row = rows[0];\n const current = row ? { generation: Number(row.generation), ownerId: String(row.ownerId) } : null;\n if (!matchesRunFence(current, fence)) {\n throw new RunFenceConflictError(fence, operation);\n }\n}\n\n/** Runs `fn` in a transaction on its own pooled connection. */\nexport async function inTransaction<T>(pool: Pool, fn: (connection: PoolConnection) => Promise<T>): Promise<T> {\n const connection = await pool.getConnection();\n try {\n await connection.beginTransaction();\n const result = await fn(connection);\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback().catch(() => {});\n throw error;\n } finally {\n connection.release();\n }\n}\n\n/**\n * Runs `write` directly when it carries no fence, or in a transaction behind\n * the fence check when it does.\n */\nexport function withRunFence<T>(\n pool: Pool,\n claimsTable: string,\n fence: RunFence | undefined,\n operation: string,\n write: (q: Queryable) => Promise<T>,\n): Promise<T> {\n if (!fence) return write(pool);\n return inTransaction(pool, async connection => {\n await assertRunFence(connection, claimsTable, fence, operation);\n return write(connection);\n });\n}\n\n/**\n * Runs a transaction that creates or updates a run's claim row, retrying when\n * two first claims race to insert it. Under REPEATABLE READ both lock the gap\n * where the row would go and one is chosen as a deadlock victim; under READ\n * COMMITTED the later insert hits the duplicate key. On retry the row exists\n * and the claim serializes behind its row lock.\n */\nexport async function claimTransaction<T>(pool: Pool, fn: (connection: PoolConnection) => Promise<T>): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await inTransaction(pool, fn);\n } catch (error) {\n const errno = (error as { errno?: number }).errno;\n if (attempt >= MAX_CLAIM_ATTEMPTS || (errno !== ER_DUP_ENTRY && errno !== ER_LOCK_DEADLOCK)) throw error;\n }\n }\n}\n","import { createHash } from 'node:crypto';\nimport {\n assertActiveObservationsApplied,\n isAppendOnlySince,\n isBufferedChunkCoveredByCursor,\n maxObservationCursor,\n planReflectionGenerationText,\n type UpdateActiveObservationsResult,\n type UpdateBufferedObservationsResult,\n withObservationalMemoryLifecycleColumns,\n} from '@internal/core/memory';\n\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraDBMessage, MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n OBSERVATIONAL_MEMORY_TABLE_SCHEMA,\n RUN_FENCING_TABLE_SCHEMAS,\n TABLE_MEMORY_RUN_FENCES,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n calculatePagination,\n normalizePerPage,\n resolveRunFence,\n validateStorageMetadataFilter,\n createStorageErrorId,\n isRunFenceConflictError,\n executeRetentionPrune,\n resolveRetentionTargets,\n retentionCutoffMs,\n} from '@mastra/core/storage';\nimport type {\n BufferedObservationChunk,\n CreateIndexOptions,\n CreateObservationalMemoryInput,\n CreateReflectionGenerationInput,\n ObservationalMemoryHistoryOptions,\n ObservationalMemoryRecord,\n PaginationArgs,\n PaginationInfo,\n RunFence,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n StorageMetadataFilter,\n StorageResourceType,\n SwapBufferedReflectionToActiveInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n TABLE_NAMES,\n ThreadCloneMetadata,\n ThreadSortOptions,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n UpdateBufferedReflectionInput,\n PruneOptions,\n PruneResult,\n RetentionTablesDescriptor,\n TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport type { Pool, PoolConnection, RowDataPacket, ResultSetHeader } from 'mysql2/promise';\nimport { assertRunFence, claimTransaction, DB_NOW_MS, inTransaction, withRunFence } from '../../db/run-fencing';\nimport type { Queryable } from '../../db/run-fencing';\nimport { indexKey } from '../../db/schema-snapshot';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport {\n formatTableName,\n parseDateTime,\n prepareStatement,\n prepareUpdateStatement,\n quoteIdentifier,\n transformToSqlValue,\n} from '../utils';\n\nconst OM_TABLE = 'mastra_observational_memory' as const;\nconst OM_TABLE_QUOTED = quoteIdentifier(OM_TABLE, 'table name');\nconst RUN_FENCES_TABLE = formatTableName(TABLE_MEMORY_RUN_FENCES as TABLE_NAMES);\nconst RUN_ID = quoteIdentifier('runId', 'column name');\nconst OWNER_ID = quoteIdentifier('ownerId', 'column name');\nconst RETIRED_AT = quoteIdentifier('retiredAt', 'column name');\n\n/** Canonical head order: newest generation, then earliest createdAt, then lowest id. */\nconst OM_HEAD_ORDER = `${quoteIdentifier('generationCount', 'column name')} DESC, ${quoteIdentifier('createdAt', 'column name')} ASC, ${quoteIdentifier('id', 'column name')} ASC`;\n/** Max `supersededBy` hops when redirecting a write aimed at a retired record. */\nconst OM_MAX_HEAD_HOPS = 3;\n/** Attempts for an OM transaction that hits a deadlock or lock-wait timeout. */\nconst OM_MAX_TRANSACTION_ATTEMPTS = 3;\n/** How long initialization waits for the per-key `GET_LOCK` before failing. */\nconst OM_INIT_LOCK_TIMEOUT_SECONDS = 30;\n\n/** ER_LOCK_DEADLOCK (1213) or ER_LOCK_WAIT_TIMEOUT (1205): the transaction was rolled back and can be retried. */\nfunction isRetryableLockError(error: unknown): boolean {\n const errno = (error as { errno?: number } | null)?.errno;\n return errno === 1213 || errno === 1205;\n}\n\nfunction emitValidationError(message: string): MastraError {\n return new MastraError({\n id: 'MYSQL_MEMORY_VALIDATION_ERROR',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: message,\n });\n}\n\nfunction omCol(name: string): string {\n return quoteIdentifier(name, 'column name');\n}\n\nfunction rethrowOrWrapOM(error: unknown, id: string, operation: string, details?: Record<string, any>): never {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', operation, 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: details ?? { id },\n },\n error,\n );\n}\n\nfunction throwOMNotFound(id: string, operation: string, details?: Record<string, any>): never {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', operation, 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: details ?? { id },\n });\n}\n\nfunction parseMySQLBool(value: unknown): boolean {\n return value === true || value === 1 || value === '1';\n}\n\nfunction parseJSONColumn<T>(value: unknown): T | undefined {\n if (!value) return undefined;\n if (typeof value === 'string') return JSON.parse(value) as T;\n return value as T;\n}\n\nfunction parseBufferedChunks(raw: unknown): BufferedObservationChunk[] {\n if (!raw) return [];\n try {\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\ninterface ThreadRow {\n id: string;\n resourceId: string;\n title: string;\n metadata: string | Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\ninterface MessageRow {\n id: string;\n thread_id: string;\n content: string | Record<string, unknown>;\n role: MastraDBMessage['role'];\n type: string | null;\n createdAt: Date | string;\n resourceId: string | null;\n}\n\ninterface ResourceRow {\n id: string;\n workingMemory: string | null;\n metadata: string | Record<string, unknown> | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\nfunction parseJSON<T>(value: T | string | null | undefined): T | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'object') return value as T;\n if (typeof value !== 'string') return null;\n if (!value) return null;\n try {\n return JSON.parse(value) as T;\n } catch {\n return null;\n }\n}\n\nfunction addMySQLMessageMetadataFilter(\n conditions: string[],\n params: any[],\n metadataFilter: StorageMetadataFilter | undefined,\n): void {\n if (!metadataFilter) return;\n\n for (const [key, value] of Object.entries(metadataFilter)) {\n const path = `$.metadata.${key}`;\n conditions.push(`JSON_VALID(${quoteIdentifier('content', 'column name')})`);\n conditions.push(`JSON_CONTAINS_PATH(${quoteIdentifier('content', 'column name')}, 'one', ?)`);\n params.push(path);\n if (value === null) {\n conditions.push(`JSON_TYPE(JSON_EXTRACT(${quoteIdentifier('content', 'column name')}, ?)) = 'NULL'`);\n params.push(path);\n } else {\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('content', 'column name')}, ?) = CAST(? AS JSON)`);\n params.push(path, JSON.stringify(value));\n }\n }\n}\n\nexport class MemoryMySQL extends MemoryStorage {\n override readonly supportsPartialThreadUpdate = true;\n readonly supportsObservationalMemory = true;\n readonly supportsObservationalMemoryHistorySearch = true;\n\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const;\n\n /**\n * Tables `prune()` can clean up. Run fences anchor on `retiredAt` (epoch ms), which stays NULL until the\n * execution holding the fence settles, so a running execution's fence is\n * never pruned.\n */\n static override readonly retentionTables: RetentionTablesDescriptor = {\n runFences: { table: TABLE_MEMORY_RUN_FENCES, column: 'retiredAt', indexed: false, anchorType: 'epoch-ms' },\n };\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MemoryMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n override supportsRunFencing(): boolean {\n return true;\n }\n\n override async raiseRunFence(fence: RunFence): Promise<boolean> {\n try {\n return await claimTransaction(this.pool, async connection => {\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT generation, ${OWNER_ID} AS ownerId FROM ${RUN_FENCES_TABLE} WHERE ${RUN_ID} = ? FOR UPDATE`,\n [fence.runId],\n );\n const row = rows[0];\n if (!row) {\n await connection.execute(\n `INSERT INTO ${RUN_FENCES_TABLE} (${RUN_ID}, generation, ${OWNER_ID}) VALUES (?, ?, ?)`,\n [fence.runId, fence.generation, fence.ownerId],\n );\n return true;\n }\n const generation = Number(row.generation);\n const raises = generation < fence.generation;\n const reaffirms = generation === fence.generation && String(row.ownerId) === fence.ownerId;\n if (!raises && !reaffirms) return false;\n // Every write un-retires the fence.\n await connection.execute(\n `UPDATE ${RUN_FENCES_TABLE} SET generation = ?, ${OWNER_ID} = ?, ${RETIRED_AT} = NULL WHERE ${RUN_ID} = ?`,\n [fence.generation, fence.ownerId, fence.runId],\n );\n return true;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'RAISE_RUN_FENCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: fence.runId },\n },\n error,\n );\n }\n }\n\n override async retireRunFence(fence: RunFence): Promise<boolean> {\n try {\n return await inTransaction(this.pool, async connection => {\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT generation, ${OWNER_ID} AS ownerId FROM ${RUN_FENCES_TABLE} WHERE ${RUN_ID} = ? FOR UPDATE`,\n [fence.runId],\n );\n const row = rows[0];\n if (!row || Number(row.generation) !== fence.generation || String(row.ownerId) !== fence.ownerId) {\n return false;\n }\n await connection.execute(`UPDATE ${RUN_FENCES_TABLE} SET ${RETIRED_AT} = ${DB_NOW_MS} WHERE ${RUN_ID} = ?`, [\n fence.runId,\n ]);\n return true;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'RETIRE_RUN_FENCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId: fence.runId },\n },\n error,\n );\n }\n }\n\n /** Runs `write` behind its own fence, otherwise the one in scope for this store. */\n #fenced<T>(fence: RunFence | undefined, operation: string, write: (q: Queryable) => Promise<T>): Promise<T> {\n return withRunFence(this.pool, RUN_FENCES_TABLE, resolveRunFence(this, fence), operation, write);\n }\n\n /** The fence check for a write that already runs in its own transaction. */\n async #assertFence(connection: PoolConnection, fence: RunFence | undefined, operation: string): Promise<void> {\n const resolved = resolveRunFence(this, fence);\n if (resolved) await assertRunFence(connection, RUN_FENCES_TABLE, resolved, operation);\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.operations.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.operations.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n await this.operations.createTable({\n tableName: TABLE_MEMORY_RUN_FENCES as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_MEMORY_RUN_FENCES],\n });\n\n // Static import — `await import('@mastra/core/storage')` deadlocks\n // `mastra build` output: bundlers rewrite the dynamic import to point at\n // the entry chunk that statically depends on this file, so the cycle never\n // resolves when storage initializes during module evaluation (#18298). The\n // peerDependency on `@mastra/core` is already `>=1.42.1` (the version that\n // introduced `OBSERVATIONAL_MEMORY_TABLE_SCHEMA`), so the older-core compat\n // the dynamic import was guarding against can no longer occur via npm\n // resolution.\n const omSchema = withObservationalMemoryLifecycleColumns(OBSERVATIONAL_MEMORY_TABLE_SCHEMA?.[OM_TABLE]);\n\n if (omSchema) {\n await this.operations.createTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n });\n await this.operations.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 'supersededBy',\n ],\n });\n }\n\n // Add resourceId column for backwards compatibility\n await this.operations.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n\n if (omSchema) {\n // Create index on lookupKey for efficient OM queries. Consult the\n // init-scoped snapshot (held by the operations domain) first so a warm\n // boot does not re-issue DDL that is doomed to fail; the errno-1061\n // swallow below stays as the concurrent-boot safety net.\n const snapshot = this.operations.getInitSchemaSnapshot();\n if (!snapshot?.indexes.has(indexKey(OM_TABLE, 'idx_om_lookup_key'))) {\n // MySQL does not support CREATE INDEX IF NOT EXISTS, so catch ER_DUP_KEYNAME (errno 1061)\n try {\n await this.pool.execute(\n `CREATE INDEX idx_om_lookup_key ON ${OM_TABLE_QUOTED} (${quoteIdentifier('lookupKey', 'column name')}(191))`,\n );\n snapshot?.indexes.add(indexKey(OM_TABLE, 'idx_om_lookup_key'));\n } catch (err: any) {\n if (err?.errno !== 1061) {\n throw err;\n }\n }\n }\n }\n\n if (omSchema) {\n await this.backfillSupersededBy();\n }\n\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_threads_resourceid_createdat_idx`,\n table: TABLE_THREADS,\n columns: ['resourceId', 'createdAt DESC'],\n },\n {\n name: `${prefix}mastra_messages_thread_id_createdat_idx`,\n table: TABLE_MESSAGES,\n columns: ['thread_id', 'createdAt DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n statements.push(\n generateTableSQL({\n tableName: TABLE_MEMORY_RUN_FENCES as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_MEMORY_RUN_FENCES],\n }),\n );\n\n for (const idx of MemoryMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return MemoryMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n const targets = resolveRetentionTargets({\n policies,\n descriptor: MemoryMySQL.retentionTables,\n order: ['runFences'],\n });\n return executeRetentionPrune({\n domain: 'memory',\n targets,\n options,\n cutoffFor: (target, now) => retentionCutoffMs(target.policy, now),\n deleteBatch: (target, cutoff, limit) =>\n this.operations.pruneBatch({ tableName: target.table as TABLE_NAMES, column: target.column, cutoff, limit }),\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_MESSAGES)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_THREADS)}`);\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_RESOURCES)}`);\n await this.pool.execute(`DELETE FROM ${RUN_FENCES_TABLE}`);\n try {\n await this.pool.execute(`DELETE FROM ${OM_TABLE_QUOTED}`);\n } catch (err: any) {\n // errno 1146 = ER_NO_SUCH_TABLE — table may not exist yet\n if (err?.errno !== 1146) {\n throw err;\n }\n }\n }\n\n private mapThread(row: ThreadRow): StorageThreadType {\n return {\n id: row.id,\n resourceId: row.resourceId,\n title: row.title,\n metadata: parseJSON<Record<string, unknown>>(row.metadata) ?? undefined,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n } satisfies StorageThreadType;\n }\n\n private mapMessage(row: MessageRow): MastraDBMessage {\n const createdAt = parseDateTime(row.createdAt) ?? new Date();\n let content: MastraMessageContentV2;\n content = row.content as MastraMessageContentV2;\n if (typeof row.content === 'string') {\n try {\n content = JSON.parse(row.content) as MastraMessageContentV2;\n } catch {\n // Wrap legacy v1 string content into v2 shape\n content = {\n format: 2,\n parts: [{ type: 'text', text: row.content } as any],\n content: row.content,\n } as MastraMessageContentV2;\n }\n }\n\n const message: MastraDBMessage = {\n id: row.id,\n threadId: row.thread_id,\n resourceId: row.resourceId ?? undefined,\n role: row.role,\n content,\n createdAt,\n };\n\n if (row.type && row.type !== 'v2') {\n message.type = row.type;\n }\n\n return message;\n }\n\n /**\n * Loads a thread's messages in chronological order.\n *\n * @param threadId - Thread to read.\n * @param limit - Optional cap on the number of rows.\n * @param resourceId - When set, returns only the rows owned by that resource.\n */\n private async fetchMessagesForThread(threadId: string, limit?: number, resourceId?: string): Promise<MessageRow[]> {\n const resourceCondition = resourceId ? ` AND ${quoteIdentifier('resourceId', 'column name')} = ?` : '';\n let sql = `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${formatTableName(TABLE_MESSAGES)} WHERE ${quoteIdentifier('thread_id', 'column name')} = ?${resourceCondition} ORDER BY ${quoteIdentifier('createdAt', 'column name')} ASC`;\n const params: any[] = resourceId ? [threadId, resourceId] : [threadId];\n if (limit && limit > 0) {\n sql += ` LIMIT ?`;\n params.push(limit);\n }\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n return rows as unknown as MessageRow[];\n }\n\n /**\n * Fetches included messages by ID, discovering their thread automatically.\n * This handles cross-thread includes where the include item doesn't specify a threadId.\n *\n * @param include - Message ids to pin, each with an optional before/after window.\n * @param resourceId - When set, restricts both the pinned messages and their context\n * to that resource so an id from another resource returns nothing.\n */\n private async _getIncludedMessages({\n include,\n resourceId,\n }: {\n include: StorageListMessagesInput['include'];\n resourceId?: string;\n }): Promise<MessageRow[] | null> {\n if (!include || include.length === 0) return null;\n\n const tableName = formatTableName(TABLE_MESSAGES);\n const selectColumns = `id, thread_id, content, role, type, createdAt, resourceId`;\n const resourceCondition = resourceId ? ` AND m.${quoteIdentifier('resourceId', 'column name')} = ?` : '';\n\n // Phase 1: Batch-fetch metadata for all target messages\n const targetIds = include.map(inc => inc.id).filter(Boolean);\n if (targetIds.length === 0) return null;\n\n const idPlaceholders = targetIds.map(() => '?').join(', ');\n const [targetRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id, createdAt FROM ${tableName} WHERE id IN (${idPlaceholders})${\n resourceId ? ` AND ${quoteIdentifier('resourceId', 'column name')} = ?` : ''\n }`,\n resourceId ? [...targetIds, resourceId] : targetIds,\n );\n\n if (!targetRows || targetRows.length === 0) return null;\n\n const targetMap = new Map(targetRows.map(r => [r.id, { threadId: r.thread_id, createdAt: r.createdAt }]));\n\n // Phase 2: Build UNION queries for each include item\n const unionQueries: string[] = [];\n const params: any[] = [];\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const target = targetMap.get(id);\n if (!target) continue;\n\n // Validate LIMIT values are safe integers\n const prevLimit = Math.max(0, Math.floor(withPreviousMessages + 1));\n const nextLimit = Math.max(0, Math.floor(withNextMessages));\n\n // Fetch the target message plus previous messages\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = ?\n AND m.createdAt <= ?${resourceCondition}\n ORDER BY m.createdAt DESC, m.id DESC\n LIMIT ${prevLimit}\n )`);\n params.push(target.threadId, target.createdAt);\n if (resourceId) params.push(resourceId);\n\n // Fetch messages after the target (only if requested)\n if (nextLimit > 0) {\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = ?\n AND m.createdAt > ?${resourceCondition}\n ORDER BY m.createdAt ASC, m.id ASC\n LIMIT ${nextLimit}\n )`);\n params.push(target.threadId, target.createdAt);\n if (resourceId) params.push(resourceId);\n }\n }\n\n if (unionQueries.length === 0) return null;\n\n // Combine queries with UNION ALL and sort\n const finalQuery = `SELECT * FROM (${unionQueries.join(' UNION ALL ')}) AS combined ORDER BY createdAt ASC, id ASC`;\n const [rows] = await this.pool.execute<RowDataPacket[]>(finalQuery, params);\n\n return rows as unknown as MessageRow[];\n }\n\n /**\n * Resolves include items against loaded threads, adding each pinned message and its\n * before/after window.\n *\n * @param threadId - Thread used when an include item names no thread of its own.\n * @param include - Message ids to pin, each with an optional before/after window.\n * @param messagesByThread - Cache of thread snapshots, reused and filled as threads load.\n * @param resourceId - When set, restricts both the pinned messages and their context\n * to that resource so an id from another resource returns nothing.\n */\n private async collectIncludeMessages({\n threadId,\n include,\n messagesByThread,\n resourceId,\n }: {\n threadId: string;\n include?: StorageListMessagesInput['include'];\n messagesByThread: Map<string, MastraDBMessage[]>;\n resourceId?: string;\n }): Promise<MastraDBMessage[]> {\n if (!include?.length) return [];\n\n const includeMessages: MastraDBMessage[] = [];\n const seenIds = new Set<string>();\n const unresolvedIds = include.filter(inc => !inc.threadId).map(inc => inc.id);\n const resolvedThreadIds = new Map<string, string>();\n\n if (unresolvedIds.length > 0) {\n const placeholders = unresolvedIds.map(() => '?').join(', ');\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders})${\n resourceId ? ` AND ${quoteIdentifier('resourceId', 'column name')} = ?` : ''\n }`,\n resourceId ? [...unresolvedIds, resourceId] : unresolvedIds,\n );\n for (const row of rows) {\n resolvedThreadIds.set(row.id, row.thread_id);\n }\n }\n\n for (const inc of include) {\n const targetThreadId = inc.threadId ?? resolvedThreadIds.get(inc.id) ?? threadId;\n\n let threadMessages = messagesByThread.get(targetThreadId);\n if (!threadMessages) {\n const rows = await this.fetchMessagesForThread(targetThreadId, undefined, resourceId);\n threadMessages = rows.map(row => this.mapMessage(row));\n messagesByThread.set(targetThreadId, threadMessages);\n }\n\n // If the current cached set might be partial (e.g., paginated main thread), reload full thread\n const needsContext =\n !threadMessages.some(message => message.id === inc.id) ||\n (inc.withPreviousMessages ?? 0) > 0 ||\n (inc.withNextMessages ?? 0) > 0 ||\n threadMessages.length < (inc.withNextMessages ?? 0) + (inc.withPreviousMessages ?? 0) + 1;\n if (needsContext) {\n const rows = await this.fetchMessagesForThread(targetThreadId, undefined, resourceId);\n threadMessages = rows.map(row => this.mapMessage(row));\n messagesByThread.set(targetThreadId, threadMessages);\n }\n\n const targetIndex = threadMessages.findIndex(msg => msg.id === inc.id);\n if (targetIndex === -1) continue;\n\n // Add the target message itself if not already included\n if (!seenIds.has(inc.id)) {\n seenIds.add(inc.id);\n includeMessages.push(threadMessages[targetIndex]!);\n }\n\n // Add previous messages\n if (inc.withPreviousMessages) {\n const start = Math.max(0, targetIndex - inc.withPreviousMessages);\n for (let i = start; i < targetIndex; i++) {\n const message = threadMessages[i]!;\n if (!seenIds.has(message.id)) {\n seenIds.add(message.id);\n includeMessages.push(message);\n }\n }\n }\n\n // Add next messages\n if (inc.withNextMessages) {\n const end = Math.min(threadMessages.length, targetIndex + inc.withNextMessages + 1);\n for (let i = targetIndex + 1; i < end; i++) {\n const message = threadMessages[i]!;\n if (!seenIds.has(message.id)) {\n seenIds.add(message.id);\n includeMessages.push(message);\n }\n }\n }\n }\n\n return includeMessages;\n }\n\n private async upsertThread(q: Queryable, thread: StorageThreadType): Promise<void> {\n const statement = prepareStatement({\n tableName: TABLE_THREADS,\n record: {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: thread.metadata ? JSON.stringify(thread.metadata) : null,\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n },\n });\n await q.execute(statement.sql, statement.args);\n }\n\n async #readThread(q: Queryable, threadId: string, resourceId?: string): Promise<StorageThreadType | null> {\n let sql = `SELECT * FROM ${formatTableName(TABLE_THREADS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`;\n const params: any[] = [threadId];\n\n if (resourceId !== undefined) {\n sql += ` AND ${quoteIdentifier('resourceId', 'column name')} = ?`;\n params.push(resourceId);\n }\n\n const [rows] = await q.execute<RowDataPacket[]>(sql, params);\n const row = rows[0];\n return row ? this.mapThread(row as ThreadRow) : null;\n }\n\n async getThreadById({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise<StorageThreadType | null> {\n try {\n return await this.#readThread(this.pool, threadId, resourceId);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_GET_THREAD_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, ...(resourceId !== undefined && { resourceId }) },\n },\n error,\n );\n }\n }\n\n /**\n * Atomically reassign a thread and all of its messages to a different resource.\n *\n * Runs inside a single transaction and takes a `SELECT ... FOR UPDATE` row lock on the\n * thread, so overlapping transfers of the same thread serialize and can never interleave\n * the thread update with the message update. Either both the thread and every message move\n * to the new resource, or neither does — there is no split-ownership window. The thread's\n * `createdAt` is preserved. Callers are responsible for authorizing the reassignment.\n */\n async updateThreadResourceId({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId: string;\n }): Promise<StorageThreadType> {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n // Lock the thread row for the duration of the transaction. Concurrent transfers of the\n // same thread block here until this transaction commits, so they cannot interleave.\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_THREADS)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [threadId],\n );\n const row = rows[0];\n if (!row) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_THREAD_RESOURCE_ID', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread \"${threadId}\" not found`,\n details: { threadId },\n });\n }\n\n const thread = this.mapThread(row as ThreadRow);\n\n if (thread.resourceId === resourceId) {\n await connection.commit();\n return thread;\n }\n\n const updatedAt = new Date();\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_THREADS)} SET ${quoteIdentifier('resourceId', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [resourceId, transformToSqlValue(updatedAt), threadId],\n );\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_MESSAGES)} SET ${quoteIdentifier('resourceId', 'column name')} = ? WHERE ${quoteIdentifier('thread_id', 'column name')} = ?`,\n [resourceId, threadId],\n );\n\n await connection.commit();\n return { ...thread, resourceId, updatedAt };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'UPDATE_THREAD_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n const { field, direction } = this.parseOrderBy(orderBy, 'DESC');\n const perPageNormalized = normalizePerPage(perPageInput, 100);\n const { offset, perPage } = calculatePagination(page, perPageInput, perPageNormalized);\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (filter?.resourceId) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(filter.resourceId);\n }\n\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n conditions.push(`JSON_EXTRACT(\\`metadata\\`, ?) = CAST(? AS JSON)`);\n params.push(`$.${key}`, JSON.stringify(value));\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: params } : { sql: '', args: [] };\n\n try {\n const total = await this.operations.loadTotalCount({ tableName: TABLE_THREADS, whereClause });\n if (total === 0) {\n return { threads: [], total: 0, page, perPage, hasMore: false };\n }\n\n const limitValue = perPageInput === false ? total : perPageNormalized;\n const rows = await this.operations.loadMany<ThreadRow>({\n tableName: TABLE_THREADS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n const threads = rows.map(row => this.mapThread(row));\n\n return {\n threads,\n total,\n page,\n perPage,\n hasMore: perPageInput === false ? false : offset + perPageNormalized < 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('MYSQL', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { filter: JSON.stringify(filter ?? {}) },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n public async getThreadsByResourceId(args: { resourceId: string } & ThreadSortOptions): Promise<StorageThreadType[]> {\n const { threads } = await this.listThreads({\n filter: { resourceId: args.resourceId },\n orderBy: args.orderBy || args.sortDirection ? { field: args.orderBy, direction: args.sortDirection } : undefined,\n page: 0,\n perPage: false,\n });\n\n return threads;\n }\n\n public async getThreadsByResourceIdPaginated(\n args: {\n resourceId: string;\n } & PaginationArgs &\n ThreadSortOptions,\n ): Promise<PaginationInfo & { threads: StorageThreadType[] }> {\n return this.listThreads({\n filter: { resourceId: args.resourceId },\n page: args.page as number | undefined,\n perPage: args.perPage as number | false | undefined,\n orderBy: args.orderBy || args.sortDirection ? { field: args.orderBy, direction: args.sortDirection } : undefined,\n });\n }\n\n async saveThread({ thread, fence }: { thread: StorageThreadType; fence?: RunFence }): Promise<StorageThreadType> {\n try {\n await this.#fenced(fence, 'saveThread', q => this.upsertThread(q, thread));\n return thread;\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_SAVE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n fence,\n }: {\n id: string;\n title?: string;\n metadata?: Record<string, unknown>;\n fence?: RunFence;\n }): Promise<StorageThreadType> {\n try {\n return await this.#fenced(fence, 'updateThread', async q => {\n const existing = await this.#readThread(q, id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_THREAD', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: { threadId: id },\n });\n }\n\n const mergedMetadata = {\n ...(existing.metadata ?? {}),\n ...(metadata ?? {}),\n } as Record<string, unknown>;\n\n const updatedAt = new Date();\n const statement = prepareUpdateStatement({\n tableName: TABLE_THREADS,\n keys: { id },\n updates: {\n title: title ?? existing.title,\n metadata: JSON.stringify(mergedMetadata),\n updatedAt,\n },\n });\n await q.execute(statement.sql, statement.args);\n\n return {\n ...existing,\n title: title ?? existing.title,\n metadata: mergedMetadata,\n updatedAt,\n } satisfies StorageThreadType;\n });\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_UPDATE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n await this.operations.batchDelete({\n tableName: TABLE_MESSAGES,\n keys: [{ thread_id: threadId }],\n });\n await this.operations.delete({ tableName: TABLE_THREADS, keys: { id: threadId } });\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_DELETE_THREAD_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n\n const placeholders = messageIds.map(() => '?').join(', ');\n const sql = `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders}) ORDER BY ${quoteIdentifier('createdAt', 'column name')} ASC`;\n\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, messageIds);\n const messages = (rows as unknown as MessageRow[]).map(row => this.mapMessage(row));\n return { messages };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_LIST_MESSAGES_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveMessages(args: {\n messages: MastraDBMessage[];\n fence?: RunFence;\n }): Promise<{ messages: MastraDBMessage[] }> {\n const messages = args.messages;\n if (messages.length === 0) {\n return { messages: [] };\n }\n\n const threadIds = new Set<string>();\n for (const message of messages) {\n if (!message.threadId || !message.threadId.trim()) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'INVALID_INPUT'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Thread ID is required',\n details: { messageId: message.id ?? null },\n });\n }\n threadIds.add(message.threadId);\n if (!message.resourceId) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'INVALID_INPUT'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.`,\n details: { messageId: message.id ?? null, threadId: message.threadId },\n });\n }\n }\n\n for (const threadId of threadIds) {\n const existingThread = await this.getThreadById({ threadId });\n if (!existingThread) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${threadId} not found`,\n details: { threadId },\n });\n }\n }\n\n const connection = await this.pool.getConnection();\n const affectedThreads = new Map<string, Date>();\n const insertedIds: string[] = [];\n\n try {\n await connection.beginTransaction();\n await this.#assertFence(connection, args.fence, 'saveMessages');\n\n for (const message of messages) {\n if (!message.threadId) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'SAVE_MESSAGES', 'INVALID_INPUT'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Message must have threadId',\n details: { messageId: message.id ?? null },\n });\n }\n const createdAt = message.createdAt ? new Date(message.createdAt) : new Date();\n const id = message.id ?? globalThis.crypto.randomUUID();\n const record = {\n id,\n thread_id: message.threadId,\n content: JSON.stringify(message.content ?? message),\n role: message.role,\n type: message.type ?? 'v2',\n createdAt,\n resourceId: message.resourceId ?? null,\n } satisfies Record<string, any>;\n const statement = {\n sql: `INSERT INTO ${formatTableName(TABLE_MESSAGES)} (id, thread_id, content, role, type, createdAt, resourceId)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON DUPLICATE KEY UPDATE thread_id = VALUES(thread_id), content = VALUES(content), role = VALUES(role), type = VALUES(type), resourceId = VALUES(resourceId)`,\n args: [\n record.id,\n record.thread_id,\n record.content,\n record.role,\n record.type,\n transformToSqlValue(record.createdAt),\n record.resourceId,\n ],\n };\n await connection.execute(statement.sql, statement.args);\n const currentMax = affectedThreads.get(record.thread_id);\n if (!currentMax || currentMax.getTime() < createdAt.getTime()) {\n affectedThreads.set(record.thread_id, createdAt);\n }\n insertedIds.push(record.id);\n }\n\n for (const [threadId, updatedAt] of affectedThreads.entries()) {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_THREADS)} SET ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE id = ?`,\n [transformToSqlValue(updatedAt), threadId],\n );\n }\n\n await connection.commit();\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_SAVE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n connection.release();\n }\n\n const { messages: persisted } = await this.listMessagesById({ messageIds: insertedIds });\n const ordered = insertedIds.map(id => persisted.find(msg => msg.id === id)).filter(Boolean) as MastraDBMessage[];\n return { messages: ordered };\n }\n\n async updateMessages(args: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: Partial<MastraMessageContentV2>;\n })[];\n fence?: RunFence;\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n if (!messages.length) return [];\n\n try {\n const { messages: existing } = await this.listMessagesById({\n messageIds: messages.map(m => m.id),\n });\n const existingMap = new Map(existing.map(msg => [msg.id, msg]));\n\n const updates: { keys: Record<string, any>; data: Record<string, any> }[] = [];\n const affectedThreads = new Map<string, Date>();\n\n for (const update of messages) {\n const current = existingMap.get(update.id);\n if (!current) continue;\n\n const targetThreadId = update.threadId ?? current.threadId;\n if (!targetThreadId) {\n // If threadId is somehow missing, skip this update safely\n continue;\n }\n const data: Record<string, any> = {};\n\n if (update.threadId && update.threadId !== current.threadId) {\n data.thread_id = update.threadId;\n }\n if (update.role) {\n data.role = update.role;\n }\n if (update.type) {\n data.type = update.type;\n }\n if (update.resourceId !== undefined) {\n data.resourceId = update.resourceId;\n }\n\n if (update.content) {\n const existingContent = (current.content ?? {}) as Record<string, any>;\n const mergedContent: Record<string, any> = { ...existingContent, ...update.content };\n if (\n existingContent.metadata &&\n typeof existingContent.metadata === 'object' &&\n update.content.metadata &&\n typeof update.content.metadata === 'object'\n ) {\n mergedContent.metadata = {\n ...(existingContent.metadata as Record<string, any>),\n ...(update.content.metadata as Record<string, any>),\n };\n }\n data.content = JSON.stringify(mergedContent);\n }\n\n if (Object.keys(data).length === 0) {\n continue;\n }\n\n updates.push({ keys: { id: update.id }, data });\n\n const now = new Date();\n affectedThreads.set(targetThreadId, now);\n if (update.threadId && update.threadId !== current.threadId && current.threadId) {\n affectedThreads.set(current.threadId, now);\n }\n }\n\n if (!updates.length) {\n return existing;\n }\n\n await inTransaction(this.pool, async connection => {\n await this.#assertFence(connection, args.fence, 'updateMessages');\n for (const { keys, data } of updates) {\n const statement = prepareUpdateStatement({ tableName: TABLE_MESSAGES, updates: data, keys });\n await connection.execute(statement.sql, statement.args);\n }\n for (const [threadId, timestamp] of affectedThreads.entries()) {\n const statement = prepareUpdateStatement({\n tableName: TABLE_THREADS,\n updates: { updatedAt: timestamp },\n keys: { id: threadId },\n });\n await connection.execute(statement.sql, statement.args);\n }\n });\n\n const { messages: updated } = await this.listMessagesById({ messageIds: messages.map(m => m.id) });\n return updated;\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_UPDATE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteMessages(messageIds: string[], options?: { fence?: RunFence }): Promise<void> {\n if (!messageIds.length) return;\n try {\n await this.#fenced(options?.fence, 'deleteMessages', async q => {\n const placeholders = messageIds.map(() => '?').join(', ');\n const [rows] = await q.execute<RowDataPacket[]>(\n `SELECT DISTINCT thread_id FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders})`,\n messageIds,\n );\n const threadIds = (rows as { thread_id: string | null }[])\n .map(row => row.thread_id)\n .filter((threadId): threadId is string => Boolean(threadId));\n\n await q.execute(`DELETE FROM ${formatTableName(TABLE_MESSAGES)} WHERE id IN (${placeholders})`, messageIds);\n\n if (threadIds.length) {\n const threadPlaceholders = threadIds.map(() => '?').join(', ');\n const timestamp = transformToSqlValue(new Date());\n await q.execute(\n `UPDATE ${formatTableName(TABLE_THREADS)} SET ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE id IN (${threadPlaceholders})`,\n [timestamp, ...threadIds],\n );\n }\n });\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_DELETE_MESSAGES_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\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('MYSQL', '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 || globalThis.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('MYSQL', '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 const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n\n // Build message query with filters\n let messageQuery = `SELECT id, thread_id, content, role, type, createdAt, resourceId\n FROM ${formatTableName(TABLE_MESSAGES)} WHERE thread_id = ?`;\n const messageParams: any[] = [sourceThreadId];\n\n // Apply date filters\n if (options?.messageFilter?.startDate) {\n messageQuery += ` AND createdAt >= ?`;\n messageParams.push(transformToSqlValue(options.messageFilter.startDate));\n }\n if (options?.messageFilter?.endDate) {\n messageQuery += ` AND createdAt <= ?`;\n messageParams.push(transformToSqlValue(options.messageFilter.endDate));\n }\n\n // Apply message ID filter\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n const placeholders = options.messageFilter.messageIds.map(() => '?').join(', ');\n messageQuery += ` AND id IN (${placeholders})`;\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 ?) AS limited ORDER BY createdAt ASC`;\n messageParams.push(options.messageLimit);\n messageQuery = limitQuery;\n }\n\n const [sourceMessageRows] = await connection.execute<RowDataPacket[]>(messageQuery, messageParams);\n\n const now = new Date();\n\n // Determine the last message ID for clone metadata\n const lastMessageId =\n sourceMessageRows.length > 0 ? (sourceMessageRows[sourceMessageRows.length - 1] as any).id : 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 // Insert the new thread\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_THREADS)} (id, resourceId, title, metadata, createdAt, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [\n newThread.id,\n newThread.resourceId,\n newThread.title,\n newThread.metadata ? JSON.stringify(newThread.metadata) : null,\n transformToSqlValue(now),\n transformToSqlValue(now),\n ],\n );\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const messageIdMap: Record<string, string> = {};\n const targetResourceId = resourceId || sourceThread.resourceId;\n\n for (const sourceRow of sourceMessageRows) {\n const row = sourceRow as MessageRow;\n const newMessageId = globalThis.crypto.randomUUID();\n messageIdMap[row.id] = newMessageId;\n\n let content = row.content;\n try {\n content = typeof content === 'string' ? JSON.parse(content) : content;\n } catch {\n // use content as-is\n }\n\n const msgCreatedAt = parseDateTime(row.createdAt) ?? now;\n\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_MESSAGES)} (id, thread_id, content, createdAt, role, type, resourceId)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [\n newMessageId,\n newThreadId,\n typeof row.content === 'string' ? row.content : JSON.stringify(row.content),\n transformToSqlValue(msgCreatedAt),\n row.role,\n row.type || 'v2',\n targetResourceId,\n ],\n );\n\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: content as MastraMessageContentV2,\n role: row.role as MastraDBMessage['role'],\n type: row.type ?? undefined,\n createdAt: msgCreatedAt,\n resourceId: targetResourceId,\n });\n }\n\n await connection.commit();\n\n return {\n thread: newThread,\n clonedMessages,\n messageIdMap,\n };\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, filter, orderBy, page = 0, perPage: perPageInput } = args;\n const selectBy = (\n args as StorageListMessagesInput & {\n selectBy?: { include?: StorageListMessagesInput['include']; last?: number; vectorSearchString?: string };\n }\n ).selectBy;\n const include = args.include ?? selectBy?.include;\n const metadataFilter = validateStorageMetadataFilter(filter?.metadata);\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 emitValidationError('threadId must be a non-empty string or array of non-empty strings');\n }\n\n const primaryThreadId = threadIds[0]!;\n\n const normalizedPerPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage } = calculatePagination(page, perPageInput, normalizedPerPage);\n\n const field = orderBy?.field ?? 'createdAt';\n const direction = (orderBy?.direction ?? 'ASC').toUpperCase() === 'DESC' ? 'DESC' : 'ASC';\n const comparator = (a: MastraDBMessage, b: MastraDBMessage) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n if (aValue == null && bValue == null) return a.id.localeCompare(b.id);\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n if (aValue === bValue) return a.id.localeCompare(b.id);\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 try {\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (threadIds.length === 1) {\n conditions.push(`${quoteIdentifier('thread_id', 'column name')} = ?`);\n params.push(threadIds[0]!);\n } else {\n const placeholders = threadIds.map(() => '?').join(', ');\n conditions.push(`${quoteIdentifier('thread_id', 'column name')} IN (${placeholders})`);\n params.push(...threadIds);\n }\n\n if (resourceId) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(resourceId);\n }\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${startOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.start));\n }\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${endOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.end));\n }\n\n addMySQLMessageMetadataFilter(conditions, params, metadataFilter);\n\n if (selectBy?.vectorSearchString) {\n conditions.push(`${quoteIdentifier('content', 'column name')} LIKE ?`);\n params.push(`%${selectBy.vectorSearchString}%`);\n }\n\n const whereSql = conditions.length ? ` WHERE ${conditions.join(' AND ')}` : '';\n const tableName = formatTableName(TABLE_MESSAGES);\n\n // Fast path: perPage=0 with no includes returns empty immediately\n if (perPage === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // Fast path: perPage=0 with includes skips COUNT and main query\n if (perPage === 0 && include && include.length > 0) {\n const includeRows = await this._getIncludedMessages({ include, resourceId });\n if (!includeRows || includeRows.length === 0) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const includeMessages = includeRows.map(row => this.mapMessage(row));\n const list = new MessageList();\n list.add(includeMessages, 'memory');\n const messages = list.get.all.db().sort(comparator);\n\n return {\n messages,\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableName}${whereSql}`,\n params,\n );\n const total = Number(countRows[0]?.count ?? 0);\n\n // If nothing to return and no include, short circuit\n if (total === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage,\n hasMore: false,\n };\n }\n\n // last takes precedence over perPage\n const lastLimit =\n selectBy?.last !== undefined\n ? typeof selectBy.last === 'number' && selectBy.last > 0\n ? selectBy.last\n : Number.MAX_SAFE_INTEGER\n : undefined;\n\n const limitValue = lastLimit !== undefined ? lastLimit : perPageInput === false ? total : normalizedPerPage;\n const safeLimit = Math.max(0, Number(limitValue));\n const safeOffset = lastLimit !== undefined ? Math.max(0, total - safeLimit) : Math.max(0, Number(offset));\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${tableName}${whereSql} ORDER BY ${quoteIdentifier(field, 'column name')} ${direction} LIMIT ${safeLimit} OFFSET ${safeOffset}`,\n params,\n );\n\n const messagesByThread = new Map<string, MastraDBMessage[]>();\n const paginatedMain = (rows as unknown as MessageRow[]).map(row => this.mapMessage(row));\n messagesByThread.set(primaryThreadId, paginatedMain);\n\n const includeMessages = await this.collectIncludeMessages({\n threadId: primaryThreadId,\n include,\n messagesByThread,\n resourceId,\n });\n\n const combinedMap = new Map<string, MastraDBMessage>();\n for (const msg of paginatedMain) combinedMap.set(msg.id, msg);\n for (const msg of includeMessages) combinedMap.set(msg.id, msg);\n\n const combinedMessages = Array.from(combinedMap.values()).sort(comparator);\n\n const list = new MessageList();\n list.add(combinedMessages, 'memory');\n const normalizedMessages = list.get.all.db();\n const messages = [...normalizedMessages].sort(comparator);\n\n const baseHasMore = perPageInput === false ? false : safeOffset + safeLimit < total;\n\n const threadIdSet = new Set(threadIds);\n const mainThreadMessageCount = messages.filter(\n msg => msg.threadId !== undefined && threadIdSet.has(msg.threadId),\n ).length;\n const hasMore = metadataFilter || !include?.length || mainThreadMessageCount < total ? baseHasMore : false;\n\n return {\n messages,\n total,\n page,\n perPage,\n hasMore,\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('MYSQL', '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 page,\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\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 const metadataFilter = validateStorageMetadataFilter(filter?.metadata);\n\n if (!resourceId || typeof resourceId !== 'string' || resourceId.trim().length === 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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 const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n const conditions: string[] = [];\n const params: any[] = [];\n\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(resourceId);\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${startOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.start));\n }\n\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} ${endOp} ?`);\n params.push(transformToSqlValue(filter.dateRange.end));\n }\n\n addMySQLMessageMetadataFilter(conditions, params, metadataFilter);\n\n const whereSql = `WHERE ${conditions.join(' AND ')}`;\n const tableName = formatTableName(TABLE_MESSAGES);\n\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereSql}`,\n params,\n );\n const total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT id, thread_id, content, role, type, createdAt, resourceId FROM ${tableName} ${whereSql} ORDER BY ${quoteIdentifier(field, 'column name')} ${direction} LIMIT ${Number(limitValue)} OFFSET ${Number(offset)}`,\n params,\n );\n const messages: MastraDBMessage[] = (rows as unknown as MessageRow[]).map(row => this.mapMessage(row));\n\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n // For listMessagesByResourceId, resolve threadId for include items that don't have one\n const resolvedInclude = await Promise.all(\n include.map(async inc => {\n if (inc.threadId) return inc;\n // Look up the message's thread_id\n const [msgRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT thread_id FROM ${tableName} WHERE id = ? AND ${quoteIdentifier('resourceId', 'column name')} = ? LIMIT 1`,\n [inc.id, resourceId],\n );\n const threadId = msgRows?.[0]?.thread_id as string | undefined;\n return threadId ? { ...inc, threadId } : inc;\n }),\n );\n const validInclude = resolvedInclude.filter(inc => inc.threadId);\n if (validInclude.length > 0) {\n const messagesByThread = new Map<string, MastraDBMessage[]>();\n const includeMessages = await this.collectIncludeMessages({\n threadId: validInclude[0]!.threadId!,\n include: validInclude,\n messagesByThread,\n resourceId,\n });\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 const list = new MessageList().add(messages, 'memory');\n let finalMessages = list.get.all.db();\n\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 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 // 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('MYSQL', 'LIST_MESSAGES_BY_RESOURCE_ID', '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 throw mastraError;\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const row = await this.operations.load<ResourceRow>({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n if (!row) return null;\n\n const parsedMetadata =\n typeof row.metadata === 'string'\n ? parseJSON<Record<string, unknown>>(row.metadata)\n : (row.metadata as Record<string, unknown> | null | undefined);\n\n return {\n id: row.id,\n workingMemory: row.workingMemory ?? undefined,\n metadata: parsedMetadata ?? undefined,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n } satisfies StorageResourceType;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_GET_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async #insertResource(q: Queryable, resource: StorageResourceType): Promise<void> {\n const metadataValue =\n resource.metadata === undefined || resource.metadata === null ? null : JSON.stringify(resource.metadata);\n const statement = prepareStatement({\n tableName: TABLE_RESOURCES,\n record: {\n id: resource.id,\n workingMemory: resource.workingMemory ?? null,\n metadata: metadataValue,\n createdAt: resource.createdAt ?? new Date(),\n updatedAt: resource.updatedAt ?? new Date(),\n },\n });\n await q.execute(statement.sql, statement.args);\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n try {\n await this.#insertResource(this.pool, resource);\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_SAVE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n fence,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n fence?: RunFence;\n }): Promise<StorageResourceType> {\n try {\n const existing = await this.getResourceById({ resourceId });\n\n if (!existing) {\n // Create new resource if not exists\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory: workingMemory ?? '',\n metadata: metadata ?? {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n await this.#fenced(fence, 'updateResource', q => this.#insertResource(q, newResource));\n return newResource;\n }\n\n const mergedMetadata =\n metadata !== undefined ? { ...(existing.metadata ?? {}), ...(metadata ?? {}) } : existing.metadata;\n const metadataValue =\n metadata !== undefined ? (metadata === null ? null : JSON.stringify(mergedMetadata ?? {})) : undefined;\n\n const statement = prepareUpdateStatement({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n updates: {\n ...(workingMemory !== undefined ? { workingMemory } : {}),\n ...(metadataValue !== undefined ? { metadata: metadataValue } : {}),\n updatedAt: new Date(),\n },\n });\n await this.#fenced(fence, 'updateResource', q => q.execute(statement.sql, statement.args));\n const updated = await this.getResourceById({ resourceId });\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_RESOURCE', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Resource ${resourceId} not found after update`,\n details: { resourceId },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_MEMORY_UPDATE_RESOURCE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? ORDER BY ${OM_HEAD_ORDER} LIMIT 1`,\n [lookupKey],\n );\n if (!rows || rows.length === 0) return null;\n return this.parseOMRow(rows[0]);\n } catch (error) {\n rethrowOrWrapOM(error, '', 'GET_OBSERVATIONAL_MEMORY', { threadId, resourceId });\n }\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit: number = 10,\n options?: ObservationalMemoryHistoryOptions,\n ): Promise<ObservationalMemoryRecord[]> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const safeLimit = Math.max(1, Math.floor(Number(limit)) || 10);\n\n const conditions: string[] = [`${omCol('lookupKey')} = ?`];\n const params: any[] = [lookupKey];\n\n if (options?.recordId !== undefined) {\n conditions.push(`${omCol('id')} = ?`);\n params.push(options.recordId);\n }\n if (options?.from) {\n conditions.push(`${omCol('createdAt')} >= ?`);\n params.push(transformToSqlValue(options.from));\n }\n if (options?.to) {\n conditions.push(`${omCol('createdAt')} <= ?`);\n params.push(transformToSqlValue(options.to));\n }\n\n if (options?.groupId !== undefined) {\n conditions.push(`(LOCATE(CAST(? AS BINARY), CAST(${omCol('activeObservations')} AS BINARY)) > 0 OR EXISTS (\n SELECT 1 FROM JSON_TABLE(${omCol('bufferedObservationChunks')}, '$[*]'\n COLUMNS (observations LONGTEXT PATH '$.observations')) AS chunk\n WHERE LOCATE(CAST(? AS BINARY), CAST(chunk.observations AS BINARY)) > 0\n ))`);\n const prefix = `<observation-group id=\"${options.groupId}\"`;\n params.push(prefix, prefix);\n }\n if (options?.beforeGeneration !== undefined) {\n conditions.push(`${omCol('generationCount')} < ?`);\n params.push(options.beforeGeneration);\n }\n if (options?.afterGeneration !== undefined) {\n conditions.push(`${omCol('generationCount')} > ?`);\n params.push(options.afterGeneration);\n }\n const direction = options?.sortDirection === 'ASC' ? 'ASC' : 'DESC';\n const whereClause = conditions.join(' AND ');\n let sql = `SELECT * FROM ${OM_TABLE_QUOTED} WHERE ${whereClause} ORDER BY ${omCol('generationCount')} ${direction}, ${omCol('createdAt')} ASC, id ASC LIMIT ${safeLimit}`;\n\n if (options?.offset != null && options.offset > 0) {\n sql += ` OFFSET ${options.offset}`;\n }\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(sql, params);\n if (!rows) return [];\n return rows.map(row => this.parseOMRow(row));\n } catch (error) {\n rethrowOrWrapOM(error, '', 'GET_OBSERVATIONAL_MEMORY_HISTORY', { threadId, resourceId, limit });\n }\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n try {\n const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n // Never reused: a write addressed to a cleared record must not land on its successor.\n const id = globalThis.crypto.randomUUID();\n const now = new Date();\n\n const existing = await this.getObservationalMemory(input.threadId, input.resourceId);\n if (existing) return existing;\n\n const nowSql = transformToSqlValue(now);\n const cols = [\n 'id',\n 'lookupKey',\n 'scope',\n 'resourceId',\n 'threadId',\n 'activeObservations',\n 'activeObservationsPendingUpdate',\n 'originType',\n 'config',\n 'generationCount',\n 'lastObservedAt',\n 'lastReflectionAt',\n 'pendingMessageTokens',\n 'totalTokensObserved',\n 'observationTokenCount',\n 'isObserving',\n 'isReflecting',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n 'observedTimezone',\n 'createdAt',\n 'updatedAt',\n 'supersededBy',\n ]\n .map(omCol)\n .join(', ');\n const placeholders = Array.from({ length: 25 }, () => '?').join(', ');\n\n // A named lock keeps concurrent initializers (any process) to one record: each re-checks\n // for a live record while holding it, and the insert commits before it is released.\n const lockName = `mastra_om_init:${createHash('sha256').update(lookupKey).digest('hex').slice(0, 40)}`;\n const connection = await this.pool.getConnection();\n try {\n const [lockRows] = await connection.query<RowDataPacket[]>('SELECT GET_LOCK(?, ?) AS acquired', [\n lockName,\n OM_INIT_LOCK_TIMEOUT_SECONDS,\n ]);\n if (Number(lockRows[0]?.acquired) !== 1) {\n throw new Error(`Timed out waiting for the observational memory initialization lock for ${lookupKey}`);\n }\n try {\n const [liveRows] = await connection.query<RowDataPacket[]>(\n `SELECT 1 FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? AND ${omCol('supersededBy')} IS NULL LIMIT 1`,\n [lookupKey],\n );\n if (liveRows.length === 0) {\n await connection.execute(`INSERT INTO ${OM_TABLE_QUOTED} (${cols}) VALUES (${placeholders})`, [\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,\n false,\n 0,\n null,\n input.observedTimezone || null,\n nowSql,\n nowSql,\n null,\n ]);\n }\n } finally {\n await connection.query('SELECT RELEASE_LOCK(?)', [lockName]);\n }\n } finally {\n connection.release();\n }\n\n // Whoever inserted first (this call or a concurrent one), the head is now the answer.\n const head = await this.getObservationalMemory(input.threadId, input.resourceId);\n if (!head) throwOMNotFound(id, 'INITIALIZE_OBSERVATIONAL_MEMORY');\n return head;\n } catch (error) {\n rethrowOrWrapOM(error, '', 'INITIALIZE_OBSERVATIONAL_MEMORY', {\n threadId: input.threadId,\n resourceId: input.resourceId,\n });\n }\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n assertActiveObservationsApplied(await this.commitActiveObservations(input), input.id);\n }\n\n async commitActiveObservations(input: UpdateActiveObservationsInput): Promise<UpdateActiveObservationsResult> {\n try {\n const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, input.id);\n if (!row) throwOMNotFound(input.id, 'UPDATE_ACTIVE_OBSERVATIONS');\n if (row.supersededBy) return { applied: false, reason: 'retired' as const };\n if (\n input.expectedActiveObservations !== undefined &&\n input.expectedActiveObservations !== ((row.activeObservations as string) || '')\n ) {\n return { applied: false, reason: 'conflict' as const };\n }\n\n // The cursor never moves backward.\n const lastObservedAt = maxObservationCursor(parseDateTime(row.lastObservedAt), input.lastObservedAt)!;\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('activeObservations')} = ?,\n ${omCol('lastObservedAt')} = ?,\n ${omCol('pendingMessageTokens')} = 0,\n ${omCol('observationTokenCount')} = ?,\n ${omCol('totalTokensObserved')} = ${omCol('totalTokensObserved')} + ?,\n ${omCol('observedMessageIds')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n input.observations,\n transformToSqlValue(lastObservedAt),\n input.tokenCount,\n input.tokenCount,\n observedMessageIdsJson,\n transformToSqlValue(new Date()),\n input.id,\n ],\n );\n return { applied: true };\n }, 'commitActiveObservations');\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'UPDATE_ACTIVE_OBSERVATIONS');\n }\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n try {\n const { currentRecord } = input;\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, currentRecord.id);\n if (!row) return currentRecord;\n // A retired snapshot creates nothing; the caller adopts the head.\n if (row.supersededBy) return this.parseOMRow(await this.resolveLiveOMRow(connection, row));\n const stored = this.parseOMRow(row);\n const plan = planReflectionGenerationText({\n storedObservations: stored.activeObservations,\n storedObservationTokenCount: stored.observationTokenCount,\n snapshotObservations: currentRecord.activeObservations,\n snapshotObservationTokenCount: currentRecord.observationTokenCount,\n reflection: input.reflection,\n tokenCount: input.tokenCount,\n });\n // The text was rewritten (not only appended to) since the snapshot: the reflection is stale.\n if (!plan) return stored;\n return this.rollOverOMRow(connection, stored.id, plan.observations, plan.tokenCount, input.newRecordId, false);\n }, 'createReflectionGeneration');\n } catch (error) {\n rethrowOrWrapOM(error, input.currentRecord.id, 'CREATE_REFLECTION_GENERATION', {\n currentRecordId: input.currentRecord.id,\n });\n }\n }\n\n async #insertReflectionGeneration(\n q: Queryable,\n input: CreateReflectionGenerationInput,\n ): Promise<ObservationalMemoryRecord> {\n const id = globalThis.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 const nowSql = transformToSqlValue(now);\n const cols = [\n 'id',\n 'lookupKey',\n 'scope',\n 'resourceId',\n 'threadId',\n 'activeObservations',\n 'activeObservationsPendingUpdate',\n 'originType',\n 'config',\n 'generationCount',\n 'lastObservedAt',\n 'lastReflectionAt',\n 'pendingMessageTokens',\n 'totalTokensObserved',\n 'observationTokenCount',\n 'isObserving',\n 'isReflecting',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n 'observedTimezone',\n 'createdAt',\n 'updatedAt',\n ]\n .map(omCol)\n .join(', ');\n const placeholders = Array.from({ length: 24 }, () => '?').join(', ');\n\n await q.execute(`INSERT INTO ${OM_TABLE_QUOTED} (${cols}) VALUES (${placeholders})`, [\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 ? transformToSqlValue(record.lastObservedAt) : null,\n nowSql,\n record.pendingMessageTokens,\n record.totalTokensObserved,\n record.observationTokenCount,\n false,\n false,\n false,\n false,\n 0,\n null,\n record.observedTimezone || null,\n nowSql,\n nowSql,\n ]);\n\n return record;\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n await this.updateOMFlag(id, 'isReflecting', isReflecting, 'SET_REFLECTING_FLAG');\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n await this.updateOMFlag(id, 'isObserving', isObserving, 'SET_OBSERVING_FLAG');\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n try {\n await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, id);\n if (!row) throwOMNotFound(id, 'SET_BUFFERING_OBSERVATION_FLAG');\n // A retired id is redirected to the head.\n const target = await this.resolveLiveOMRow(connection, row);\n const sets = [\n `${omCol('isBufferingObservation')} = ?`,\n ...(lastBufferedAtTokens !== undefined ? [`${omCol('lastBufferedAtTokens')} = ?`] : []),\n `${omCol('updatedAt')} = ?`,\n ].join(', ');\n await connection.execute(`UPDATE ${OM_TABLE_QUOTED} SET ${sets} WHERE ${omCol('id')} = ?`, [\n isBuffering,\n ...(lastBufferedAtTokens !== undefined ? [lastBufferedAtTokens] : []),\n transformToSqlValue(new Date()),\n target.id,\n ]);\n });\n } catch (error) {\n rethrowOrWrapOM(error, id, 'SET_BUFFERING_OBSERVATION_FLAG');\n }\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n await this.updateOMFlag(id, 'isBufferingReflection', isBuffering, 'SET_BUFFERING_REFLECTION_FLAG');\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n await this.pool.execute(`DELETE FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ?`, [lookupKey]);\n } catch (error) {\n rethrowOrWrapOM(error, '', 'CLEAR_OBSERVATIONAL_MEMORY', { threadId, resourceId });\n }\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n try {\n await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, id);\n if (!row) throwOMNotFound(id, 'SET_PENDING_MESSAGE_TOKENS');\n // A retired id is redirected to the head.\n const target = await this.resolveLiveOMRow(connection, row);\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('pendingMessageTokens')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [tokenCount, transformToSqlValue(new Date()), target.id],\n );\n });\n } catch (error) {\n rethrowOrWrapOM(error, id, 'SET_PENDING_MESSAGE_TOKENS');\n }\n }\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n await this.appendBufferedObservations(input);\n }\n\n async appendBufferedObservations(input: UpdateBufferedObservationsInput): Promise<UpdateBufferedObservationsResult> {\n try {\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${globalThis.crypto.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 threadTitle: input.chunk.threadTitle,\n extractedValues: input.chunk.extractedValues,\n extractionFailures: input.chunk.extractionFailures,\n };\n\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, input.id);\n if (!row) throwOMNotFound(input.id, 'UPDATE_BUFFERED_OBSERVATIONS');\n // A retired id is redirected to the head.\n const target = await this.resolveLiveOMRow(connection, row);\n const existingChunks = parseBufferedChunks(target.bufferedObservationChunks);\n\n // Skip a retried append (same cycle) and a chunk the cursor already wholly covers.\n if (\n existingChunks.some(existing => existing.cycleId === input.chunk.cycleId) ||\n isBufferedChunkCoveredByCursor(input.chunk.lastObservedAt, parseDateTime(target.lastObservedAt))\n ) {\n return { persisted: false, recordId: target.id as string };\n }\n\n // lastBufferedAtTime never moves backward.\n const lastBufferedAtTime = maxObservationCursor(\n parseDateTime(target.lastBufferedAtTime),\n input.lastBufferedAtTime ?? undefined,\n );\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('bufferedObservationChunks')} = ?,\n ${omCol('lastBufferedAtTime')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n JSON.stringify([...existingChunks, newChunk]),\n transformToSqlValue(lastBufferedAtTime),\n transformToSqlValue(new Date()),\n target.id,\n ],\n );\n return { persisted: true, recordId: target.id as string };\n }, 'appendBufferedObservations');\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'UPDATE_BUFFERED_OBSERVATIONS');\n }\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n try {\n return await this.withOMTransaction(async connection => {\n // Lock the record: activation is computed from (and written back to) the stored state.\n const row = await this.lockOMRow(connection, input.id);\n if (!row) throwOMNotFound(input.id, 'SWAP_BUFFERED_TO_ACTIVE');\n\n const emptyResult: SwapBufferedToActiveResult = {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n // A retired record is frozen: activation reports it and writes nothing.\n if (row.supersededBy) return { ...emptyResult, retired: true };\n\n // Activation always works on the stored list, so a chunk appended after the caller read\n // the record is never dropped. Caller-provided chunks only override token weights.\n const persistedChunks = parseBufferedChunks(row.bufferedObservationChunks);\n const refreshedWeights = new Map(\n (Array.isArray(input.bufferedChunks) ? input.bufferedChunks : []).map(c => [c.id, c.messageTokens]),\n );\n const chunks = persistedChunks.map(c =>\n refreshedWeights.has(c.id) ? { ...c, messageTokens: refreshedWeights.get(c.id)! } : c,\n );\n\n if (chunks.length === 0) {\n return emptyResult;\n }\n\n // Calculate target message 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\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 if (bestOverBoundary === 0 || cumulativeMessageTokens < bestOverTokens) {\n bestOverBoundary = boundary;\n bestOverTokens = cumulativeMessageTokens;\n }\n } else {\n if (cumulativeMessageTokens > bestUnderTokens) {\n bestUnderBoundary = boundary;\n bestUnderTokens = cumulativeMessageTokens;\n }\n }\n }\n\n const maxOvershoot = retentionFloor * 0.95;\n const overshoot = bestOverTokens - targetMessageTokens;\n const remainingAfterOver = input.currentPendingTokens - bestOverTokens;\n const remainingAfterUnder = input.currentPendingTokens - bestUnderTokens;\n const minRemaining = Math.min(1000, retentionFloor);\n\n let chunksToActivate: number;\n if (input.forceMaxActivation && bestOverBoundary > 0 && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestOverBoundary > 0 && overshoot <= maxOvershoot && remainingAfterOver >= minRemaining) {\n chunksToActivate = bestOverBoundary;\n } else if (bestUnderBoundary > 0 && remainingAfterUnder >= minRemaining) {\n chunksToActivate = bestUnderBoundary;\n } else if (bestOverBoundary > 0) {\n chunksToActivate = bestOverBoundary;\n } else {\n chunksToActivate = 1;\n }\n\n // Split chunks: activate a stored prefix, keep the rest of the stored list.\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = persistedChunks.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((cid): cid is string => !!cid);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n // Derive lastObservedAt from the latest activated chunk; the stored cursor never moves\n // backward (a sync observation may already be past this chunk).\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const derivedLastObservedAt =\n input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n const lastObservedAt = maxObservationCursor(parseDateTime(row.lastObservedAt), derivedLastObservedAt)!;\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\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 connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${omCol('activeObservations')} = ?,\n ${omCol('observationTokenCount')} = ?,\n ${omCol('pendingMessageTokens')} = ?,\n ${omCol('bufferedObservationChunks')} = ?,\n ${omCol('lastObservedAt')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n newActive,\n newTokenCount,\n newPending,\n remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n transformToSqlValue(lastObservedAt),\n transformToSqlValue(new Date()),\n input.id,\n ],\n );\n\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 }, 'swapBufferedToActive');\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'SWAP_BUFFERED_TO_ACTIVE');\n }\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n try {\n const nowSql = transformToSqlValue(new Date());\n const br = omCol('bufferedReflection');\n\n const [result] = await this.#fenced(undefined, 'updateBufferedReflection', q =>\n q.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${br} = CASE\n WHEN ${br} IS NOT NULL AND ${br} != ''\n THEN CONCAT(${br}, CHAR(10), CHAR(10), ?)\n ELSE ?\n END,\n ${omCol('bufferedReflectionTokens')} = COALESCE(${omCol('bufferedReflectionTokens')}, 0) + ?,\n ${omCol('bufferedReflectionInputTokens')} = COALESCE(${omCol('bufferedReflectionInputTokens')}, 0) + ?,\n ${omCol('reflectedObservationLineCount')} = ?,\n ${omCol('updatedAt')} = ?\n WHERE ${omCol('id')} = ?`,\n [\n input.reflection,\n input.reflection,\n input.tokenCount,\n input.inputTokenCount,\n input.reflectedObservationLineCount,\n nowSql,\n input.id,\n ],\n ),\n );\n\n if ((result as ResultSetHeader).affectedRows === 0) {\n throwOMNotFound(input.id, 'UPDATE_BUFFERED_REFLECTION');\n }\n } catch (error) {\n rethrowOrWrapOM(error, input.id, 'UPDATE_BUFFERED_REFLECTION');\n }\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n try {\n const { currentRecord } = input;\n return await this.withOMTransaction(async connection => {\n const row = await this.lockOMRow(connection, currentRecord.id);\n if (!row) return currentRecord;\n // A retired snapshot creates nothing; the caller adopts the head.\n if (row.supersededBy) return this.parseOMRow(await this.resolveLiveOMRow(connection, row));\n const stored = this.parseOMRow(row);\n\n const bufferedReflection = stored.bufferedReflection || '';\n if (!bufferedReflection) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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: currentRecord.id },\n });\n }\n // Only appends may have happened since the caller's snapshot; a rewrite invalidates the\n // reflected line count.\n if (!isAppendOnlySince(stored.activeObservations, currentRecord.activeObservations)) {\n return stored;\n }\n\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const reflectedLineCount = stored.reflectedObservationLineCount ?? 0;\n const unreflectedContent = (stored.activeObservations || '')\n .split('\\n')\n .slice(reflectedLineCount)\n .join('\\n')\n .trim();\n const newObservations = unreflectedContent\n ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n : bufferedReflection;\n // tokenCount is computed by the processor from its snapshot; add tokens appended since.\n const tokenCount =\n input.tokenCount +\n Math.max(0, (stored.observationTokenCount ?? 0) - (currentRecord.observationTokenCount ?? 0));\n\n return this.rollOverOMRow(connection, stored.id, newObservations, tokenCount, input.newRecordId, true);\n }, 'swapBufferedReflectionToActive');\n } catch (error) {\n rethrowOrWrapOM(error, input.currentRecord.id, 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE');\n }\n }\n\n /**\n * Runs `fn` in one transaction on a dedicated connection. Every OM lifecycle write locks its\n * target row by primary key (`SELECT … FOR UPDATE`, a record lock — never a range), so the\n * only expected lock conflict is a wait; a deadlock or lock-wait timeout (e.g. against the\n * startup backfill's scan) is retried a bounded number of times.\n */\n private async withOMTransaction<T>(\n fn: (connection: PoolConnection) => Promise<T>,\n fencedOperation?: string,\n ): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n if (fencedOperation) await this.#assertFence(connection, undefined, fencedOperation);\n const result = await fn(connection);\n await connection.commit();\n return result;\n } catch (error) {\n await connection.rollback().catch(() => {});\n if (attempt < OM_MAX_TRANSACTION_ATTEMPTS && isRetryableLockError(error)) continue;\n throw error;\n } finally {\n connection.release();\n }\n }\n }\n\n /** Row-locks one OM record by primary key for the rest of the transaction. */\n private async lockOMRow(connection: PoolConnection, id: string): Promise<RowDataPacket | null> {\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT * FROM ${OM_TABLE_QUOTED} WHERE ${omCol('id')} = ? FOR UPDATE`,\n [id],\n );\n return rows?.[0] ?? null;\n }\n\n /**\n * The live, row-locked record a lifecycle write aimed at `row` lands on: `row` itself while\n * live, otherwise the head. The head is found with a plain (non-locking, so no range locks)\n * canonical head read, then locked by primary key. Under REPEATABLE READ that read can predate\n * a rollover committed after this transaction started; the locking read sees the latest\n * committed row, so a head retired since is followed through `supersededBy` (bounded).\n */\n private async resolveLiveOMRow(connection: PoolConnection, row: RowDataPacket): Promise<RowDataPacket> {\n if (!row.supersededBy) return row;\n const [heads] = await connection.execute<RowDataPacket[]>(\n `SELECT id FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? ORDER BY ${OM_HEAD_ORDER} LIMIT 1`,\n [row.lookupKey],\n );\n const headId = (heads?.[0]?.id as string | undefined) ?? (row.supersededBy as string);\n let current: RowDataPacket = (await this.lockOMRow(connection, headId)) ?? row;\n for (let hop = 0; current.supersededBy; hop++) {\n const next = hop < OM_MAX_HEAD_HOPS ? await this.lockOMRow(connection, current.supersededBy as string) : null;\n if (!next) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'RESOLVE_OBSERVATIONAL_MEMORY_HEAD', 'FAILED'),\n text: `Observational memory record ${row.id} is superseded but no live head was found`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: row.id as string },\n });\n }\n current = next;\n }\n return current;\n }\n\n /**\n * Create the next generation from the stored (live, row-locked) record and retire the stored\n * record in the same transaction. Carried columns are copied in SQL from the stored row, so\n * nothing round-trips through a client-side date conversion. Buffered chunks move to the new\n * generation; the cursor, buffering markers, flags, and counters carry over; buffered\n * reflection state does not (and is cleared on the retired row after a buffered swap).\n */\n private async rollOverOMRow(\n connection: PoolConnection,\n storedId: string,\n observations: string,\n tokenCount: number,\n newRecordId: string | undefined,\n clearBufferedReflection: boolean,\n ): Promise<ObservationalMemoryRecord> {\n const id = newRecordId ?? globalThis.crypto.randomUUID();\n const nowSql = transformToSqlValue(new Date());\n const c = omCol;\n await connection.execute(\n `INSERT INTO ${OM_TABLE_QUOTED} (\n ${c('id')}, ${c('lookupKey')}, ${c('scope')}, ${c('resourceId')}, ${c('threadId')},\n ${c('activeObservations')}, ${c('activeObservationsPendingUpdate')},\n ${c('originType')}, ${c('config')}, ${c('generationCount')}, ${c('lastObservedAt')}, ${c('lastReflectionAt')},\n ${c('pendingMessageTokens')}, ${c('totalTokensObserved')}, ${c('observationTokenCount')}, ${c('bufferedObservationChunks')},\n ${c('isObserving')}, ${c('isReflecting')}, ${c('isBufferingObservation')}, ${c('isBufferingReflection')},\n ${c('lastBufferedAtTokens')}, ${c('lastBufferedAtTime')},\n ${c('observedTimezone')}, ${c('metadata')}, ${c('supersededBy')}, ${c('createdAt')}, ${c('updatedAt')}\n )\n SELECT\n ?, ${c('lookupKey')}, ${c('scope')}, ${c('resourceId')}, ${c('threadId')},\n ?, NULL,\n 'reflection', ${c('config')}, ${c('generationCount')} + 1, ${c('lastObservedAt')}, ?,\n ${c('pendingMessageTokens')}, ${c('totalTokensObserved')}, ?, ${c('bufferedObservationChunks')},\n false, false, ${c('isBufferingObservation')}, false,\n ${c('lastBufferedAtTokens')}, ${c('lastBufferedAtTime')},\n ${c('observedTimezone')}, ${c('metadata')}, NULL, ?, ?\n FROM ${OM_TABLE_QUOTED} WHERE ${c('id')} = ?`,\n [id, observations, nowSql, Math.round(tokenCount), nowSql, nowSql, storedId],\n );\n\n // Retire the stored record: chunks moved, liveness marker set (never cleared).\n const [retired] = await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET\n ${c('supersededBy')} = ?,\n ${c('bufferedObservationChunks')} = NULL,\n ${\n clearBufferedReflection\n ? `${c('bufferedReflection')} = NULL, ${c('bufferedReflectionTokens')} = NULL,\n ${c('bufferedReflectionInputTokens')} = NULL, ${c('reflectedObservationLineCount')} = NULL,`\n : ''\n }\n ${c('updatedAt')} = ?\n WHERE ${c('id')} = ? AND ${c('supersededBy')} IS NULL`,\n [id, nowSql, storedId],\n );\n if ((retired as ResultSetHeader).affectedRows !== 1) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'CREATE_REFLECTION_GENERATION', 'RETIRE_FAILED'),\n text: `Failed to retire observational memory record ${storedId}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: storedId },\n });\n }\n\n const inserted = await this.lockOMRow(connection, id);\n if (!inserted) throwOMNotFound(id, 'CREATE_REFLECTION_GENERATION');\n return this.parseOMRow(inserted);\n }\n\n /**\n * Retire every live row that sorts after its key's canonical head, marking it superseded by\n * the head. Rows retired by older adapter versions (which never set `supersededBy`) become\n * frozen. Only keys with more than one live row are touched; each update embeds the head's\n * ordering key, so a row created by a concurrent rollover (a newer generation) never matches.\n * Runs at READ COMMITTED so the scan takes no gap locks.\n */\n private async backfillSupersededBy(): Promise<void> {\n const [keys] = await this.pool.execute<RowDataPacket[]>(\n `SELECT ${omCol('lookupKey')} AS lookupKey FROM ${OM_TABLE_QUOTED}\n WHERE ${omCol('supersededBy')} IS NULL GROUP BY ${omCol('lookupKey')} HAVING COUNT(*) > 1`,\n );\n for (const { lookupKey } of keys ?? []) {\n for (let attempt = 1; ; attempt++) {\n const connection = await this.pool.getConnection();\n try {\n await connection.query('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');\n await connection.beginTransaction();\n await connection.execute(\n `UPDATE ${OM_TABLE_QUOTED} AS r\n JOIN (\n SELECT ${omCol('id')} AS id, ${omCol('generationCount')} AS generationCount, ${omCol('createdAt')} AS createdAt\n FROM ${OM_TABLE_QUOTED} WHERE ${omCol('lookupKey')} = ? ORDER BY ${OM_HEAD_ORDER} LIMIT 1\n ) AS h\n SET r.${omCol('supersededBy')} = h.id\n WHERE r.${omCol('lookupKey')} = ?\n AND r.${omCol('supersededBy')} IS NULL\n AND (\n r.${omCol('generationCount')} < h.generationCount\n OR (r.${omCol('generationCount')} = h.generationCount AND r.${omCol('createdAt')} > h.createdAt)\n OR (r.${omCol('generationCount')} = h.generationCount AND r.${omCol('createdAt')} = h.createdAt AND r.${omCol('id')} > h.id)\n )`,\n [lookupKey, lookupKey],\n );\n await connection.commit();\n break;\n } catch (error) {\n await connection.rollback().catch(() => {});\n if (attempt < OM_MAX_TRANSACTION_ATTEMPTS && isRetryableLockError(error)) continue;\n throw error;\n } finally {\n connection.release();\n }\n }\n }\n }\n\n private async updateOMFlag(id: string, column: string, value: boolean, operation: string): Promise<void> {\n try {\n const [result] = await this.pool.execute(\n `UPDATE ${OM_TABLE_QUOTED} SET ${omCol(column)} = ?, ${omCol('updatedAt')} = ? WHERE ${omCol('id')} = ?`,\n [value, transformToSqlValue(new Date()), id],\n );\n\n if ((result as ResultSetHeader).affectedRows === 0) {\n throwOMNotFound(id, operation);\n }\n } catch (error) {\n rethrowOrWrapOM(error, id, operation);\n }\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: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n lastObservedAt: row.lastObservedAt ? parseDateTime(row.lastObservedAt) : undefined,\n originType: row.originType || 'initial',\n generationCount: Number(row.generationCount || 0),\n activeObservations: row.activeObservations || '',\n bufferedObservationChunks: parseJSONColumn<BufferedObservationChunk[]>(row.bufferedObservationChunks),\n bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n bufferedMessageIds: undefined,\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: parseMySQLBool(row.isReflecting),\n isObserving: parseMySQLBool(row.isObserving),\n isBufferingObservation: parseMySQLBool(row.isBufferingObservation),\n isBufferingReflection: parseMySQLBool(row.isBufferingReflection),\n lastBufferedAtTokens:\n typeof row.lastBufferedAtTokens === 'number'\n ? row.lastBufferedAtTokens\n : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n lastBufferedAtTime: row.lastBufferedAtTime ? (parseDateTime(row.lastBufferedAtTime) ?? null) : null,\n config: parseJSONColumn(row.config) ?? {},\n metadata: parseJSONColumn(row.metadata),\n observedMessageIds: parseJSONColumn<string[]>(row.observedMessageIds),\n observedTimezone: row.observedTimezone || undefined,\n supersededBy: row.supersededBy ?? null,\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n executeRetentionPrune,\n listTracesArgsSchema,\n ObservabilityStorage,\n resolveRetentionTargets,\n retentionCutoffMs,\n SPAN_SCHEMA,\n TABLE_SCHEMAS,\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 CreateIndexOptions,\n GetSpanArgs,\n PruneOptions,\n PruneResult,\n RetentionTablesDescriptor,\n TableRetentionPolicy,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n GetTraceLightResponse,\n LightSpanRecord,\n} from '@mastra/core/storage';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformFromSqlRow } from '../utils';\n\nconst JSON_SPAN_FIELDS = ['input', 'output', 'attributes', 'metadata', 'error', 'links', 'scope', 'tags'] as const;\n\nfunction serializeJsonFields(source: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const field of JSON_SPAN_FIELDS) {\n if (field in source && source[field] !== undefined) {\n result[field] = source[field] !== null ? JSON.stringify(source[field]) : null;\n }\n }\n return result;\n}\n\nexport class ObservabilityMySQL extends ObservabilityStorage {\n static override readonly retentionTables: RetentionTablesDescriptor = {\n spans: { table: TABLE_SPANS, column: 'startedAt', indexed: true },\n };\n\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SPANS] as const;\n\n constructor({\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ObservabilityMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n const targets = resolveRetentionTargets({\n policies,\n descriptor: ObservabilityMySQL.retentionTables,\n order: ['spans'],\n });\n return executeRetentionPrune({\n domain: 'observability',\n targets,\n options,\n cutoffFor: (target, now) => new Date(retentionCutoffMs(target.policy, now)),\n deleteBatch: (target, cutoff, limit) =>\n this.operations.pruneBatch({\n tableName: target.table as typeof TABLE_SPANS,\n column: target.column,\n cutoff,\n limit,\n }),\n });\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SPANS, schema: SPAN_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_SPANS,\n schema: SPAN_SCHEMA,\n ifNotExists: Object.keys(SPAN_SCHEMA),\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_ai_spans_traceid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['traceId', 'startedAt DESC'],\n },\n {\n name: `${prefix}mastra_ai_spans_parentspanid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['parentSpanId', 'startedAt DESC'],\n },\n {\n name: `${prefix}mastra_ai_spans_name_idx`,\n table: TABLE_SPANS,\n columns: ['name'],\n },\n {\n name: `${prefix}mastra_ai_spans_spantype_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['spanType', 'startedAt DESC'],\n },\n {\n name: `${prefix}mastra_ai_spans_root_spans_idx`,\n table: TABLE_SPANS,\n columns: ['startedAt DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_SPANS,\n schema: TABLE_SCHEMAS[TABLE_SPANS],\n compositePrimaryKey: ['traceId', 'spanId'],\n }),\n );\n\n for (const idx of ObservabilityMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ObservabilityMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SPANS });\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 now = new Date();\n const record = {\n ...span,\n ...serializeJsonFields(span),\n createdAt: now,\n updatedAt: now,\n };\n await this.operations.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ? AND ${quoteIdentifier('spanId', 'column name')} = ?`,\n args: [traceId, spanId],\n },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return { span: rows[0]! };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ? AND ${quoteIdentifier('parentSpanId', 'column name')} IS NULL`,\n args: [traceId],\n },\n limit: 1,\n });\n\n if (!rows || rows.length === 0) {\n return null;\n }\n\n return { span: rows[0]! };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.loadMany<SpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ?`,\n args: [traceId],\n },\n orderBy: `${quoteIdentifier('startedAt', 'column name')} ASC`,\n });\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getStructure(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n try {\n const spans = await this.operations.loadMany<LightSpanRecord>({\n tableName: TABLE_SPANS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('traceId', 'column name')} = ?`,\n args: [traceId],\n },\n orderBy: `${quoteIdentifier('startedAt', 'column name')} ASC`,\n });\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n // Strip heavy fields (input, output, attributes, metadata, tags, links) for lightweight response\n const lightSpans: LightSpanRecord[] = spans.map(span => ({\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n entityType: span.entityType,\n entityId: span.entityId,\n entityName: span.entityName,\n spanType: span.spanType,\n error: span.error,\n isEvent: span.isEvent,\n startedAt: span.startedAt,\n endedAt: span.endedAt,\n createdAt: span.createdAt,\n updatedAt: span.updatedAt,\n }));\n\n return {\n traceId,\n spans: lightSpans,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'GET_STRUCTURE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\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> = {\n ...updates,\n ...serializeJsonFields(updates),\n updatedAt: new Date(),\n };\n\n await this.operations.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n const tbl = formatTableName(TABLE_SPANS);\n\n try {\n const conditions: string[] = [`${quoteIdentifier('parentSpanId', 'column name')} IS NULL`];\n const queryArgs: any[] = [];\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`${quoteIdentifier('startedAt', 'column name')} >= ?`);\n queryArgs.push(filters.startedAt.start);\n }\n if (filters.startedAt?.end) {\n conditions.push(`${quoteIdentifier('startedAt', 'column name')} <= ?`);\n queryArgs.push(filters.startedAt.end);\n }\n if (filters.endedAt?.start) {\n conditions.push(`${quoteIdentifier('endedAt', 'column name')} >= ?`);\n queryArgs.push(filters.endedAt.start);\n }\n if (filters.endedAt?.end) {\n conditions.push(`${quoteIdentifier('endedAt', 'column name')} <= ?`);\n queryArgs.push(filters.endedAt.end);\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`${quoteIdentifier('spanType', 'column name')} = ?`);\n queryArgs.push(filters.spanType);\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`${quoteIdentifier('entityType', 'column name')} = ?`);\n queryArgs.push(filters.entityType);\n }\n if (filters.entityId !== undefined) {\n conditions.push(`${quoteIdentifier('entityId', 'column name')} = ?`);\n queryArgs.push(filters.entityId);\n }\n if (filters.entityName !== undefined) {\n conditions.push(`${quoteIdentifier('entityName', 'column name')} = ?`);\n queryArgs.push(filters.entityName);\n }\n\n // Identity & tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`${quoteIdentifier('userId', 'column name')} = ?`);\n queryArgs.push(filters.userId);\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`${quoteIdentifier('organizationId', 'column name')} = ?`);\n queryArgs.push(filters.organizationId);\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n queryArgs.push(filters.resourceId);\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`${quoteIdentifier('runId', 'column name')} = ?`);\n queryArgs.push(filters.runId);\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`${quoteIdentifier('sessionId', 'column name')} = ?`);\n queryArgs.push(filters.sessionId);\n }\n if (filters.threadId !== undefined) {\n conditions.push(`${quoteIdentifier('threadId', 'column name')} = ?`);\n queryArgs.push(filters.threadId);\n }\n if (filters.requestId !== undefined) {\n conditions.push(`${quoteIdentifier('requestId', 'column name')} = ?`);\n queryArgs.push(filters.requestId);\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`${quoteIdentifier('environment', 'column name')} = ?`);\n queryArgs.push(filters.environment);\n }\n if (filters.source !== undefined) {\n conditions.push(`${quoteIdentifier('source', 'column name')} = ?`);\n queryArgs.push(filters.source);\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`${quoteIdentifier('serviceName', 'column name')} = ?`);\n queryArgs.push(filters.serviceName);\n }\n\n // Scope filter (JSON containment - MySQL uses JSON_EXTRACT)\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('scope', 'column name')}, '$.${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 if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', 'LIST_TRACES', 'INVALID_FILTER_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { key },\n });\n }\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryArgs.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryArgs.push(JSON.stringify(value));\n }\n }\n }\n\n // Tags filter (all tags must be present - MySQL uses JSON_CONTAINS)\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n conditions.push(`JSON_CONTAINS(${quoteIdentifier('tags', 'column name')}, ?, '$')`);\n queryArgs.push(JSON.stringify(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(`${quoteIdentifier('error', 'column name')} IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(\n `${quoteIdentifier('endedAt', 'column name')} IS NULL AND ${quoteIdentifier('error', 'column name')} IS NULL`,\n );\n break;\n case TraceStatus.SUCCESS:\n conditions.push(\n `${quoteIdentifier('endedAt', 'column name')} IS NOT NULL AND ${quoteIdentifier('error', 'column name')} IS NULL`,\n );\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 ${tbl} c\n WHERE c.${quoteIdentifier('traceId', 'column name')} = ${tbl}.${quoteIdentifier('traceId', 'column name')}\n AND c.${quoteIdentifier('parentSpanId', 'column name')} IS NOT NULL\n AND c.${quoteIdentifier('error', 'column name')} IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${tbl} c\n WHERE c.${quoteIdentifier('traceId', 'column name')} = ${tbl}.${quoteIdentifier('traceId', 'column name')}\n AND c.${quoteIdentifier('parentSpanId', 'column name')} IS NOT NULL\n AND c.${quoteIdentifier('error', 'column name')} 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 // MySQL's natural behavior: NULLs are \"smaller\" than any value\n // - ASC: NULLs first (natural)\n // - DESC: NULLs last (natural)\n // We need CASE WHEN workarounds for endedAt to get desired ordering\n const sortField = quoteIdentifier(orderBy.field, 'column name');\n const sortDirection = orderBy.direction;\n let orderByClause: string;\n if (orderBy.field === 'endedAt') {\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.operations.loadTotalCount({\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 // Use raw query to support CASE WHEN in ORDER BY (sanitizeOrderBy in loadMany rejects it)\n const offset = page * perPage;\n const selectSql = `SELECT * FROM ${tbl}${whereClause} ORDER BY ${orderByClause} LIMIT ${Math.max(0, perPage)} OFFSET ${Math.max(0, offset)}`;\n const rawRows = await this.operations.query(selectSql, queryArgs);\n const spans = rawRows.map(row => transformFromSqlRow<SpanRecord>({ tableName: TABLE_SPANS, sqlRow: row as any }));\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: (page + 1) * perPage < count,\n },\n spans: toTraceSpans(spans),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 if (!args.records.length) {\n return;\n }\n const now = new Date();\n await this.operations.batchInsert({\n tableName: TABLE_SPANS,\n records: args.records.map(record => ({\n ...record,\n ...serializeJsonFields(record),\n createdAt: now,\n updatedAt: now,\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 try {\n if (!args.records.length) {\n return;\n }\n const now = new Date();\n await this.operations.batchUpdate({\n tableName: TABLE_SPANS,\n items: args.records.map(record => ({\n keys: { spanId: record.spanId, traceId: record.traceId },\n data: {\n ...record.updates,\n ...serializeJsonFields(record.updates),\n updatedAt: now,\n },\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 this.assertUnscopedBatchDeleteTraces(args);\n try {\n if (!args.traceIds.length) {\n return;\n }\n const keys = args.traceIds.map(traceId => ({ traceId }));\n await this.operations.batchDelete({\n tableName: TABLE_SPANS,\n keys,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n}\n","import { 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 TABLE_SCHEMAS,\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 CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class PromptBlocksMySQL extends PromptBlocksStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (PromptBlocksMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: PROMPT_BLOCKS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, schema: PROMPT_BLOCK_VERSIONS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n schema: PROMPT_BLOCK_VERSIONS_SCHEMA,\n ifNotExists: ['requestContextSchema'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_prompt_block_versions_block_version`,\n table: TABLE_PROMPT_BLOCK_VERSIONS,\n columns: ['blockId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of PromptBlocksMySQL.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n\n for (const idx of PromptBlocksMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return PromptBlocksMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_PROMPT_BLOCKS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseBlockRow(row: Record<string, unknown>): StoragePromptBlockType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): PromptBlockVersion {\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: this.safeParseJSON(row.rules) as PromptBlockVersion['rules'],\n requestContextSchema: this.safeParseJSON(row.requestContextSchema) as Record<string, unknown> | undefined,\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_PROMPT_BLOCKS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseBlockRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n try {\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 } catch (versionError) {\n try {\n await this.operations.delete({ tableName: TABLE_PROMPT_BLOCKS, keys: { id: promptBlock.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback prompt block creation:', rollbackError);\n }\n throw versionError;\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Prompt block with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_PROMPT_BLOCKS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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('MYSQL', '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.operations.delete({ tableName: TABLE_PROMPT_BLOCKS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n const conditions: string[] = [];\n const queryParams: any[] = [];\n\n if (status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_PROMPT_BLOCKS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n }\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams } : undefined;\n const total = await this.operations.loadTotalCount({ tableName: TABLE_PROMPT_BLOCKS, whereClause });\n\n if (total === 0) {\n return { promptBlocks: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCKS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n promptBlocks: rows.map(row => this.parseBlockRow(row)),\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('MYSQL', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const now = new Date();\n await this.operations.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 requestContextSchema: input.requestContextSchema ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_PROMPT_BLOCK_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [blockId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ?`, args: [blockId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ?`, args: [blockId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, whereClause });\n\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_PROMPT_BLOCK_VERSIONS)} WHERE ${quoteIdentifier('blockId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('blockId', 'column name')} = ?`, args: [blockId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import {\n normalizeScheduleTarget,\n SchedulesStorage,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n Schedule,\n ScheduleFilter,\n ScheduleTrigger,\n ScheduleTriggerListOptions,\n ScheduleStatus,\n ScheduleTarget,\n ScheduleUpdate,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket, ResultSetHeader } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nfunction parseJson<T = unknown>(val: unknown): T | undefined {\n if (val == null) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n}\n\nfunction toNumber(val: unknown): number {\n if (typeof val === 'bigint') return Number(val);\n return Number(val);\n}\n\nfunction rowToSchedule(row: Record<string, any>): Schedule {\n const target = parseJson<ScheduleTarget>(row.target);\n if (!target) {\n throw new Error(`Schedule row ${row.id} has invalid target`);\n }\n const schedule: Schedule = {\n id: String(row.id),\n target: normalizeScheduleTarget(target),\n cron: String(row.cron),\n status: String(row.status) as ScheduleStatus,\n nextFireAt: toNumber(row.next_fire_at),\n createdAt: toNumber(row.created_at),\n updatedAt: toNumber(row.updated_at),\n };\n if (row.timezone != null) schedule.timezone = String(row.timezone);\n if (row.last_fire_at != null) schedule.lastFireAt = toNumber(row.last_fire_at);\n if (row.last_run_id != null) schedule.lastRunId = String(row.last_run_id);\n const metadata = parseJson<Record<string, unknown>>(row.metadata);\n if (metadata !== undefined) schedule.metadata = metadata;\n if (row.owner_type != null) schedule.ownerType = String(row.owner_type) as Schedule['ownerType'];\n if (row.owner_id != null) schedule.ownerId = String(row.owner_id);\n return schedule;\n}\n\nfunction rowToTrigger(row: Record<string, any>): ScheduleTrigger {\n const trigger: ScheduleTrigger = {\n id: row.id != null ? String(row.id) : undefined,\n scheduleId: String(row.schedule_id),\n runId: row.run_id != null ? String(row.run_id) : null,\n scheduledFireAt: toNumber(row.scheduled_fire_at),\n actualFireAt: toNumber(row.actual_fire_at),\n outcome: String(row.outcome) as ScheduleTrigger['outcome'],\n triggerKind:\n row.trigger_kind != null ? (String(row.trigger_kind) as ScheduleTrigger['triggerKind']) : 'schedule-fire',\n };\n if (row.error != null) trigger.error = String(row.error);\n if (row.parent_trigger_id != null) trigger.parentTriggerId = String(row.parent_trigger_id);\n const metadata = parseJson<Record<string, unknown>>(row.metadata);\n if (metadata !== undefined) trigger.metadata = metadata;\n return trigger;\n}\n\nexport class SchedulesMySQL extends SchedulesStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (SchedulesMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_SCHEDULES,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULES],\n });\n await this.operations.createTable({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_mastra_schedules_status_next_fire`,\n table: TABLE_SCHEDULES,\n columns: ['status', 'next_fire_at'],\n },\n {\n name: `${prefix}idx_mastra_schedule_triggers_schedule_fire`,\n table: TABLE_SCHEDULE_TRIGGERS,\n columns: ['schedule_id', 'actual_fire_at DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCHEDULES,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULES],\n }),\n );\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n }),\n );\n\n for (const idx of SchedulesMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return SchedulesMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SCHEDULE_TRIGGERS });\n await this.operations.clearTable({ tableName: TABLE_SCHEDULES });\n }\n\n async createSchedule(schedule: Schedule): Promise<Schedule> {\n const existing = await this.getSchedule(schedule.id);\n if (existing) {\n throw new Error(`Schedule with id \"${schedule.id}\" already exists`);\n }\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_SCHEDULES)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('target', 'column name')}, ${quoteIdentifier('cron', 'column name')}, ${quoteIdentifier('timezone', 'column name')}, ${quoteIdentifier('status', 'column name')}, ${quoteIdentifier('next_fire_at', 'column name')}, ${quoteIdentifier('last_fire_at', 'column name')}, ${quoteIdentifier('last_run_id', 'column name')}, ${quoteIdentifier('created_at', 'column name')}, ${quoteIdentifier('updated_at', 'column name')}, ${quoteIdentifier('metadata', 'column name')}, ${quoteIdentifier('owner_type', 'column name')}, ${quoteIdentifier('owner_id', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n schedule.id,\n JSON.stringify(schedule.target),\n schedule.cron,\n schedule.timezone ?? null,\n schedule.status,\n schedule.nextFireAt,\n schedule.lastFireAt ?? null,\n schedule.lastRunId ?? null,\n schedule.createdAt,\n schedule.updatedAt,\n schedule.metadata ? JSON.stringify(schedule.metadata) : null,\n schedule.ownerType ?? null,\n schedule.ownerId ?? null,\n ],\n );\n return schedule;\n }\n\n async getSchedule(id: string): Promise<Schedule | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULES)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n const row = rows[0];\n return row ? rowToSchedule(row as Record<string, any>) : null;\n }\n\n async listSchedules(filter?: ScheduleFilter): Promise<Schedule[]> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n\n if (filter?.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(filter.status);\n }\n if (filter?.workflowId) {\n // target is JSON; MySQL JSON_EXTRACT\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('target', 'column name')}, '$.workflowId') = ?`);\n params.push(filter.workflowId);\n }\n if (filter?.ownerType !== undefined) {\n if (filter.ownerType === null) {\n conditions.push(`${quoteIdentifier('owner_type', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdentifier('owner_type', 'column name')} = ?`);\n params.push(filter.ownerType);\n }\n }\n if (filter?.ownerId !== undefined) {\n if (filter.ownerId === null) {\n conditions.push(`${quoteIdentifier('owner_id', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdentifier('owner_id', 'column name')} = ?`);\n params.push(filter.ownerId);\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULES)} ${where} ORDER BY ${quoteIdentifier('created_at', 'column name')} ASC`,\n params,\n );\n return rows.map(r => rowToSchedule(r as Record<string, any>));\n }\n\n async listDueSchedules(now: number, limit?: number): Promise<Schedule[]> {\n const cap = limit ?? 100;\n const [rows] = await this.pool.query<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULES)} WHERE ${quoteIdentifier('status', 'column name')} = ? AND ${quoteIdentifier('next_fire_at', 'column name')} <= ? ORDER BY ${quoteIdentifier('next_fire_at', 'column name')} ASC LIMIT ?`,\n ['active', String(now), cap],\n );\n return rows.map(r => rowToSchedule(r as Record<string, any>));\n }\n\n async updateSchedule(id: string, update: ScheduleUpdate): Promise<Schedule> {\n const setClauses: string[] = [];\n const params: (string | number | null)[] = [];\n\n if ('cron' in update) {\n setClauses.push(`${quoteIdentifier('cron', 'column name')} = ?`);\n params.push(update.cron as string);\n }\n if ('timezone' in update) {\n setClauses.push(`${quoteIdentifier('timezone', 'column name')} = ?`);\n params.push((update.timezone as string) ?? null);\n }\n if ('status' in update) {\n setClauses.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(update.status as string);\n }\n if ('nextFireAt' in update) {\n setClauses.push(`${quoteIdentifier('next_fire_at', 'column name')} = ?`);\n params.push(update.nextFireAt as number);\n }\n if ('metadata' in update) {\n setClauses.push(`${quoteIdentifier('metadata', 'column name')} = ?`);\n params.push(update.metadata ? JSON.stringify(update.metadata) : null);\n }\n if ('ownerType' in update) {\n setClauses.push(`${quoteIdentifier('owner_type', 'column name')} = ?`);\n params.push((update.ownerType as string) ?? null);\n }\n if ('ownerId' in update) {\n setClauses.push(`${quoteIdentifier('owner_id', 'column name')} = ?`);\n params.push((update.ownerId as string) ?? null);\n }\n\n if (setClauses.length === 0) {\n const existing = await this.getSchedule(id);\n if (!existing) throw new Error(`Schedule ${id} not found`);\n return existing;\n }\n\n setClauses.push(`${quoteIdentifier('updated_at', 'column name')} = ?`);\n params.push(Date.now());\n params.push(id);\n\n await this.pool.execute(\n `UPDATE ${formatTableName(TABLE_SCHEDULES)} SET ${setClauses.join(', ')} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n params,\n );\n\n const updated = await this.getSchedule(id);\n if (!updated) throw new Error(`Schedule ${id} not found`);\n return updated;\n }\n\n async updateScheduleNextFire(\n id: string,\n expectedNextFireAt: number,\n newNextFireAt: number,\n lastFireAt: number,\n lastRunId: string,\n newStatus?: ScheduleStatus,\n ): Promise<boolean> {\n const [result] = await this.pool.execute<ResultSetHeader>(\n `UPDATE ${formatTableName(TABLE_SCHEDULES)} SET ${quoteIdentifier('next_fire_at', 'column name')} = ?, ${quoteIdentifier('last_fire_at', 'column name')} = ?, ${quoteIdentifier('last_run_id', 'column name')} = ?, ${quoteIdentifier('updated_at', 'column name')} = ?, ${quoteIdentifier('status', 'column name')} = COALESCE(?, ${quoteIdentifier('status', 'column name')}) WHERE ${quoteIdentifier('id', 'column name')} = ? AND ${quoteIdentifier('next_fire_at', 'column name')} = ? AND ${quoteIdentifier('status', 'column name')} = ?`,\n [newNextFireAt, lastFireAt, lastRunId, Date.now(), newStatus ?? null, id, expectedNextFireAt, 'active'],\n );\n return result.affectedRows > 0;\n }\n\n async deleteSchedule(id: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SCHEDULE_TRIGGERS)} WHERE ${quoteIdentifier('schedule_id', 'column name')} = ?`,\n [id],\n );\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SCHEDULES)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n }\n\n async recordTrigger(trigger: ScheduleTrigger): Promise<void> {\n const id = trigger.id ?? globalThis.crypto.randomUUID();\n await this.pool.execute(\n `INSERT INTO ${formatTableName(TABLE_SCHEDULE_TRIGGERS)} (${quoteIdentifier('id', 'column name')}, ${quoteIdentifier('schedule_id', 'column name')}, ${quoteIdentifier('run_id', 'column name')}, ${quoteIdentifier('scheduled_fire_at', 'column name')}, ${quoteIdentifier('actual_fire_at', 'column name')}, ${quoteIdentifier('outcome', 'column name')}, ${quoteIdentifier('error', 'column name')}, ${quoteIdentifier('trigger_kind', 'column name')}, ${quoteIdentifier('parent_trigger_id', 'column name')}, ${quoteIdentifier('metadata', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n trigger.scheduleId,\n trigger.runId,\n trigger.scheduledFireAt,\n trigger.actualFireAt,\n trigger.outcome,\n trigger.error ?? null,\n trigger.triggerKind ?? 'schedule-fire',\n trigger.parentTriggerId ?? null,\n trigger.metadata ? JSON.stringify(trigger.metadata) : null,\n ],\n );\n }\n\n async listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise<ScheduleTrigger[]> {\n const conditions: string[] = [`${quoteIdentifier('schedule_id', 'column name')} = ?`];\n const params: (string | number | null)[] = [scheduleId];\n\n if (opts?.fromActualFireAt != null) {\n conditions.push(`${quoteIdentifier('actual_fire_at', 'column name')} >= ?`);\n params.push(opts.fromActualFireAt);\n }\n if (opts?.toActualFireAt != null) {\n conditions.push(`${quoteIdentifier('actual_fire_at', 'column name')} < ?`);\n params.push(opts.toActualFireAt);\n }\n\n const limitClause = opts?.limit != null ? `LIMIT ${Math.floor(opts.limit)}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCHEDULE_TRIGGERS)} WHERE ${conditions.join(' AND ')} ORDER BY ${quoteIdentifier('actual_fire_at', 'column name')} DESC ${limitClause}`,\n params,\n );\n return rows.map(r => rowToTrigger(r as Record<string, any>));\n }\n}\n","import { 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 TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n ScorerDefinitionVersion,\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nexport class ScorerDefinitionsMySQL extends ScorerDefinitionsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ScorerDefinitionsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SCORER_DEFINITIONS, schema: SCORER_DEFINITIONS_SCHEMA });\n await this.operations.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: SCORER_DEFINITION_VERSIONS_SCHEMA,\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}idx_scorer_definition_versions_def_version`,\n table: TABLE_SCORER_DEFINITION_VERSIONS,\n columns: ['scorerDefinitionId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n for (const tableName of ScorerDefinitionsMySQL.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n }),\n );\n }\n\n for (const idx of ScorerDefinitionsMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ScorerDefinitionsMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_SCORER_DEFINITIONS });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseScorerRow(row: Record<string, unknown>): StorageScorerDefinitionType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): ScorerDefinitionVersion {\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: this.safeParseJSON(row.model) as ScorerDefinitionVersion['model'],\n instructions: (row.instructions as string) ?? undefined,\n scoreRange: this.safeParseJSON(row.scoreRange) as ScorerDefinitionVersion['scoreRange'],\n presetConfig: this.safeParseJSON(row.presetConfig) as ScorerDefinitionVersion['presetConfig'],\n defaultSampling: this.safeParseJSON(row.defaultSampling) as ScorerDefinitionVersion['defaultSampling'],\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCORER_DEFINITIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseScorerRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.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,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n const versionId = crypto.randomUUID();\n try {\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 } catch (versionError) {\n try {\n await this.operations.delete({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id: scorerDefinition.id } });\n } catch (rollbackError) {\n console.error('Failed to rollback scorer definition creation:', rollbackError);\n }\n throw versionError;\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('MYSQL', '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 MastraError({\n id: createStorageErrorId('MYSQL', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Scorer definition with id ${id} not found`,\n details: { id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status } = updates;\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\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) updateData.metadata = { ...existing.metadata, ...metadata };\n\n await this.operations.update({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.withTransaction(async () => {\n await this.deleteVersionsByParentId(id);\n await this.operations.delete({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id } });\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n if (status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_SCORER_DEFINITIONS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams } : undefined;\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SCORER_DEFINITIONS, whereClause });\n if (total === 0) return { scorerDefinitions: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n scorerDefinitions: rows.map(row => this.parseScorerRow(row)),\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('MYSQL', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const now = new Date();\n await this.operations.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,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SCORER_DEFINITION_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [scorerDefinitionId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n args: [scorerDefinitionId],\n },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n args: [scorerDefinitionId],\n };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SCORER_DEFINITION_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_SCORER_DEFINITION_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SCORER_DEFINITION_VERSIONS)} WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('scorerDefinitionId', 'column name')} = ?`,\n args: [scorerDefinitionId],\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport {\n ScoresStorage,\n SCORERS_SCHEMA,\n TABLE_SCHEMAS,\n TABLE_SCORERS,\n calculatePagination,\n normalizePerPage,\n} from '@mastra/core/storage';\nimport type { PaginationInfo, StoragePagination, CreateIndexOptions, ScoreTenancyFilters } from '@mastra/core/storage';\nimport type { Pool } from 'mysql2/promise';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL, generateIndexSQL } from '../operations';\nimport { parseDateTime, quoteIdentifier } from '../utils';\n\ntype SaveScoreInput = Omit<ScoreRowData, 'id' | 'createdAt' | 'updatedAt'>;\ntype ListScoresResult = { pagination: PaginationInfo; scores: ScoreRowData[] };\n\ninterface ScoreRow {\n id: string;\n scorerId: string;\n traceId: string | null;\n spanId: string | null;\n runId: string;\n score: number;\n reason: string | null;\n metadata: string | null;\n preprocessStepResult: string | null;\n extractStepResult: string | null;\n analyzeStepResult: string | null;\n preprocessPrompt: string | null;\n extractPrompt: string | null;\n generateScorePrompt: string | null;\n generateReasonPrompt: string | null;\n analyzePrompt: string | null;\n reasonPrompt: string | null;\n scorer: string | null;\n input: string | null;\n output: string | null;\n additionalContext: string | null;\n requestContext: string | null;\n entityType: string | null;\n entity: string | null;\n entityId: string | null;\n source: string | null;\n resourceId: string | null;\n organizationId: string | null;\n projectId: string | null;\n batchId: string | null;\n datasetId: string | null;\n datasetItemId: string | null;\n threadId: string | null;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\nfunction parseJSON<T>(value: unknown): T | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string') {\n if (!value) return undefined;\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n }\n if (typeof value === 'object') {\n return value as T;\n }\n return undefined;\n}\n\nexport class ScoresMySQL extends ScoresStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORERS] as const;\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ScoresMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SCORERS, schema: SCORERS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_SCORERS,\n schema: SCORERS_SCHEMA,\n ifNotExists: ['spanId', 'requestContext', 'organizationId', 'projectId', 'batchId', 'datasetId', 'datasetItemId'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n static getDefaultIndexDefs(prefix: string = ''): CreateIndexOptions[] {\n return [\n {\n name: `${prefix}mastra_scores_trace_id_span_id_created_at_idx`,\n table: TABLE_SCORERS,\n columns: ['traceId', 'spanId', 'createdAt DESC'],\n },\n ];\n }\n\n static getExportDDL(): string[] {\n const statements: string[] = [];\n\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCORERS,\n schema: TABLE_SCHEMAS[TABLE_SCORERS],\n }),\n );\n\n for (const idx of ScoresMySQL.getDefaultIndexDefs()) {\n statements.push(generateIndexSQL(idx));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ScoresMySQL.getDefaultIndexDefs('');\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${TABLE_SCORERS}`);\n }\n\n private mapScore(row: ScoreRow): ScoreRowData {\n const mapped = {\n id: row.id,\n scorerId: row.scorerId,\n traceId: row.traceId ?? undefined,\n spanId: row.spanId ?? undefined,\n runId: row.runId,\n score: row.score,\n reason: row.reason ?? undefined,\n metadata: parseJSON<Record<string, unknown>>(row.metadata),\n preprocessStepResult: parseJSON<Record<string, unknown>>(row.preprocessStepResult),\n extractStepResult: parseJSON<Record<string, unknown>>(row.extractStepResult),\n analyzeStepResult: parseJSON<Record<string, unknown>>(row.analyzeStepResult),\n preprocessPrompt: row.preprocessPrompt ?? undefined,\n extractPrompt: row.extractPrompt ?? undefined,\n generateScorePrompt: row.generateScorePrompt ?? undefined,\n generateReasonPrompt: row.generateReasonPrompt ?? undefined,\n analyzePrompt: row.analyzePrompt ?? undefined,\n reasonPrompt: row.reasonPrompt ?? undefined,\n scorer: parseJSON<Record<string, unknown>>(row.scorer) as ScoreRowData['scorer'],\n input: parseJSON<any>(row.input) ?? undefined,\n output: parseJSON<Record<string, unknown>>(row.output),\n additionalContext: parseJSON<Record<string, unknown>>(row.additionalContext),\n requestContext: parseJSON<Record<string, unknown>>(row.requestContext) ?? undefined,\n // entityType is required by the ScoreRowData type but may be null in DB; keep as-is and cast below\n entityType: (row.entityType ?? undefined) as any,\n entity: parseJSON<Record<string, unknown>>(row.entity),\n entityId: row.entityId ?? undefined,\n source: (row.source ?? undefined) as ScoreRowData['source'],\n resourceId: row.resourceId ?? undefined,\n organizationId: row.organizationId ?? undefined,\n projectId: row.projectId ?? undefined,\n batchId: row.batchId ?? undefined,\n datasetId: row.datasetId ?? undefined,\n datasetItemId: row.datasetItemId ?? undefined,\n threadId: row.threadId ?? undefined,\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n return mapped as ScoreRowData;\n }\n\n private serializeScore(score: SaveScoreInput, id: string, createdAt: Date, updatedAt: Date): Record<string, any> {\n const toJson = (value: unknown): string | null => (value === undefined ? null : JSON.stringify(value));\n\n return {\n id,\n scorerId: score.scorerId,\n traceId: score.traceId ?? null,\n spanId: score.spanId ?? null,\n runId: score.runId,\n score: score.score,\n reason: score.reason ?? null,\n metadata: toJson(score.metadata),\n preprocessStepResult: toJson(score.preprocessStepResult),\n extractStepResult: toJson(score.extractStepResult),\n analyzeStepResult: toJson(score.analyzeStepResult),\n preprocessPrompt: score.preprocessPrompt ?? null,\n extractPrompt: score.extractPrompt ?? null,\n generateScorePrompt: score.generateScorePrompt ?? null,\n generateReasonPrompt: score.generateReasonPrompt ?? null,\n analyzePrompt: score.analyzePrompt ?? null,\n reasonPrompt: score.reasonPrompt ?? null,\n scorer: toJson(score.scorer),\n input: toJson(score.input),\n output: toJson(score.output),\n additionalContext: toJson(score.additionalContext),\n requestContext: toJson(score.requestContext),\n entityType: score.entityType ?? null,\n entity: toJson(score.entity),\n entityId: score.entityId ?? null,\n resourceId: score.resourceId ?? null,\n organizationId: score.organizationId ?? null,\n projectId: score.projectId ?? null,\n batchId: score.batchId ?? null,\n datasetId: score.datasetId ?? null,\n datasetItemId: score.datasetItemId ?? null,\n threadId: score.threadId ?? null,\n source: score.source ?? null,\n createdAt,\n updatedAt,\n };\n }\n\n async saveScore(score: SaveScoreInput): Promise<{ score: ScoreRowData }> {\n try {\n // Caller-supplied ids give scores a stable identity: operations.insert\n // is INSERT ... ON DUPLICATE KEY UPDATE, so retried writes for the same\n // id converge on one row (latest wins).\n const id = (score as { id?: string }).id ?? crypto.randomUUID();\n const now = new Date();\n\n await this.operations.insert({\n tableName: TABLE_SCORERS,\n record: this.serializeScore(score, id, now, now),\n });\n return { score: { ...score, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_SCORES_SAVE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const row = await this.operations.load<ScoreRow>({ tableName: TABLE_SCORERS, keys: { id } });\n return row ? this.mapScore(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_SCORES_GET_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n private async fetchScores(\n whereClause: { sql: string; args: any[] },\n pagination: StoragePagination,\n ): Promise<ListScoresResult> {\n const { page = 0, perPage: perPageInput } = pagination;\n const perPageNormalized = normalizePerPage(perPageInput, 50);\n const { offset, perPage } = calculatePagination(page, perPageInput, perPageNormalized);\n\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SCORERS, whereClause });\n if (total === 0) {\n return {\n scores: [],\n pagination: { total: 0, page, perPage, hasMore: false },\n };\n }\n\n const limitValue = perPageInput === false ? total : perPageNormalized;\n\n const rows = await this.operations.loadMany<ScoreRow>({\n tableName: TABLE_SCORERS,\n whereClause,\n orderBy: `${quoteIdentifier('createdAt', 'column name')} DESC`,\n offset,\n limit: limitValue,\n });\n\n const scores = rows.map(row => this.mapScore(row));\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage,\n hasMore: perPageInput === false ? false : offset + scores.length < total,\n },\n };\n }\n\n private buildWhereClause(filters: Record<string, string | undefined>): { sql: string; args: any[] } {\n const conditions: string[] = [];\n const args: any[] = [];\n for (const [column, value] of Object.entries(filters)) {\n if (value !== undefined) {\n conditions.push(`${quoteIdentifier(column, 'column name')} = ?`);\n args.push(value);\n }\n }\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n }\n\n async getScoresByScorerId(args: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresByScorerId(args);\n }\n\n async getScoresByRunId(args: {\n runId: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresByRunId(args);\n }\n\n async getScoresByEntityId(args: {\n entityId: string;\n entityType: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresByEntityId(args);\n }\n\n async getScoresBySpan(args: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.listScoresBySpan(args);\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n filters,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n scorerId,\n entityId,\n entityType,\n source,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n entityId,\n entityType,\n source,\n filters,\n }: {\n runId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n runId,\n entityId,\n entityType,\n source,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n filters,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n traceId,\n spanId,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n\n async listScoresByEntityId({\n entityId,\n pagination,\n entityType,\n source,\n filters,\n }: {\n entityId: string;\n pagination: StoragePagination;\n entityType?: string;\n source?: ScoringSource;\n filters?: ScoreTenancyFilters;\n }): Promise<ListScoresResult> {\n return this.fetchScores(\n this.buildWhereClause({\n entityId,\n entityType,\n source,\n organizationId: filters?.organizationId,\n projectId: filters?.projectId,\n }),\n pagination,\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n SkillsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n TABLE_FAVORITES,\n TABLE_SCHEMAS,\n SKILLS_SCHEMA,\n SKILL_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 { skillSnapshotFieldValuesEqual } from '@mastra/core/storage/domains/skills';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'instructions',\n 'license',\n 'compatibility',\n 'source',\n 'references',\n 'scripts',\n 'assets',\n 'files',\n 'metadata',\n 'tree',\n] as const;\n\nexport class SkillsMySQL extends SkillsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SKILLS, TABLE_SKILL_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the skills domain tables.\n * Currently no default indexes are defined for skills.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_SKILLS, schema: TABLE_SCHEMAS[TABLE_SKILLS] }),\n generateTableSQL({ tableName: TABLE_SKILL_VERSIONS, schema: TABLE_SCHEMAS[TABLE_SKILL_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (SkillsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the skills domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return SkillsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for skills.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for skills domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_SKILLS, schema: SKILLS_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_SKILL_VERSIONS, schema: SKILL_VERSIONS_SCHEMA });\n await this.operations.alterTable({\n tableName: TABLE_SKILLS,\n schema: SKILLS_SCHEMA,\n ifNotExists: ['visibility', 'favoriteCount'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_SKILL_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_SKILLS });\n }\n\n private safeParseJSON(val: unknown): any {\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 private 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 visibility: (row.visibility as StorageSkillType['visibility']) ?? undefined,\n favoriteCount: row.favoriteCount === null || row.favoriteCount === undefined ? 0 : Number(row.favoriteCount),\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): SkillVersion {\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: this.safeParseJSON(row.compatibility) as SkillVersion['compatibility'],\n source: this.safeParseJSON(row.source) as SkillVersion['source'],\n references: this.safeParseJSON(row.references) as SkillVersion['references'],\n scripts: this.safeParseJSON(row.scripts) as SkillVersion['scripts'],\n assets: this.safeParseJSON(row.assets) as SkillVersion['assets'],\n files: this.safeParseJSON(row.files) as SkillVersion['files'],\n metadata: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n tree: this.safeParseJSON(row.tree) as SkillVersion['tree'],\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageSkillType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILLS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseSkillRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n await this.operations.insert({\n tableName: TABLE_SKILLS,\n record: {\n id: skill.id,\n status: 'draft',\n activeVersionId: null,\n authorId: skill.authorId ?? null,\n visibility: visibility ?? null,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, visibility: _visibility, ...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 await this.operations.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 visibility,\n favoriteCount: 0,\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('MYSQL', '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('MYSQL', '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 const { authorId, visibility, activeVersionId, status, ...configFields } = updates;\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (authorId !== undefined) updateData.authorId = authorId;\n if (visibility !== undefined) updateData.visibility = visibility;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) updateData.status = 'published';\n }\n if (status !== undefined) updateData.status = status;\n\n await this.operations.update({ tableName: TABLE_SKILLS, keys: { id }, data: updateData });\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 const {\n id: _versionId,\n skillId: _skillId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n !skillSnapshotFieldValuesEqual(\n configFields[field as keyof typeof configFields],\n latestConfig[field as keyof typeof latestConfig],\n ),\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 const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.delete({ tableName: TABLE_SKILLS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n status,\n visibility,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'LIST_SKILLS', '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 // Empty entityIds is short-circuit: no rows possible\n if (entityIds && entityIds.length === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const skillsTable = formatTableName(TABLE_SKILLS);\n const favoritesTable = formatTableName(TABLE_FAVORITES);\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 0;\n\n // Determine if we need a JOIN\n const joinUserId = pinFavoritedFor;\n const useJoin = Boolean(joinUserId);\n let joinUserIdParamIdx: number | null = null;\n if (useJoin) {\n joinUserIdParamIdx = paramIdx++;\n }\n\n if (status) {\n conditions.push(`s.${quoteIdentifier('status', 'column name')} = ?`);\n queryParams.push(status);\n paramIdx++;\n }\n\n if (authorId !== undefined) {\n conditions.push(`s.${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\n paramIdx++;\n }\n\n if (visibility !== undefined) {\n conditions.push(`s.${quoteIdentifier('visibility', 'column name')} = ?`);\n queryParams.push(visibility);\n paramIdx++;\n }\n\n if (entityIds && entityIds.length > 0) {\n const placeholders = entityIds.map(() => '?').join(', ');\n conditions.push(`s.${quoteIdentifier('id', 'column name')} IN (${placeholders})`);\n queryParams.push(...entityIds);\n paramIdx += entityIds.length;\n }\n\n // Handle favoritedOnly\n if (useJoin && favoritedOnly) {\n conditions.push(`sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL`);\n } else if (favoritedOnly) {\n // Defensive: favoritedOnly with no userId can never match a real row\n conditions.push('1=0');\n }\n\n const joinClause =\n useJoin && joinUserIdParamIdx !== null\n ? `LEFT JOIN ${favoritesTable} sr ON sr.${quoteIdentifier('entityType', 'column name')} = 'skill' AND sr.${quoteIdentifier('entityId', 'column name')} = s.${quoteIdentifier('id', 'column name')} AND sr.${quoteIdentifier('userId', 'column name')} = ?`\n : '';\n\n const joinParams: any[] = useJoin && joinUserId ? [joinUserId] : [];\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const [countRows] = await this.pool.query<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${skillsTable} s ${joinClause} ${whereClause}`,\n [...joinParams, ...queryParams],\n );\n const total = parseInt(countRows[0]?.count ?? '0', 10);\n\n if (total === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const hasMore = perPageInput === false ? false : offset + perPage < total;\n\n // Build ORDER BY\n let orderByClause: string;\n if (useJoin) {\n // Pin favorited skills first\n orderByClause = `CASE WHEN sr.${quoteIdentifier('userId', 'column name')} IS NOT NULL THEN 0 ELSE 1 END ASC, s.${quoteIdentifier(field, 'column name')} ${direction}`;\n } else {\n orderByClause = `s.${quoteIdentifier(field, 'column name')} ${direction}`;\n }\n\n const [rows] = await this.pool.query<RowDataPacket[]>(\n `SELECT s.* FROM ${skillsTable} s ${joinClause} ${whereClause} ORDER BY ${orderByClause} LIMIT ? OFFSET ?`,\n [...joinParams, ...queryParams, limitValue, offset],\n );\n\n return {\n skills: rows.map(row => this.parseSkillRow(row)),\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'LIST_SKILLS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n try {\n const now = new Date();\n await this.operations.insert({\n tableName: TABLE_SKILL_VERSIONS,\n record: {\n id: input.id,\n skillId: input.skillId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n license: input.license ?? null,\n compatibility: input.compatibility ?? null,\n source: input.source ?? null,\n references: input.references ?? null,\n scripts: input.scripts ?? null,\n assets: input.assets ?? null,\n files: input.files ?? null,\n metadata: input.metadata ?? null,\n tree: input.tree ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_SKILL_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [skillId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ?`, args: [skillId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ?`, args: [skillId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_SKILL_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_SKILL_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_SKILL_VERSIONS)} WHERE ${quoteIdentifier('skillId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_SKILL_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('skillId', 'column name')} = ?`, args: [skillId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ToolProviderConnectionsStorage,\n createStorageErrorId,\n TABLE_TOOL_PROVIDER_CONNECTIONS,\n TABLE_SCHEMAS,\n TOOL_PROVIDER_CONNECTIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageDeleteToolProviderConnectionInput,\n StorageListToolProviderConnectionsInput,\n StorageToolProviderConnection,\n StorageToolProviderConnectionKey,\n StorageToolProviderConnectionScope,\n StorageUpsertToolProviderConnectionInput,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformToSqlValue, parseDateTime } from '../utils';\n\nfunction normaliseScope(raw: unknown): StorageToolProviderConnectionScope {\n const value = raw == null ? 'per-author' : String(raw);\n if (value === 'shared') return 'shared';\n if (value === 'caller-supplied') return 'caller-supplied';\n return 'per-author';\n}\n\nfunction rowToToolProviderConnection(row: Record<string, unknown>): StorageToolProviderConnection {\n return {\n authorId: String(row.authorId),\n providerId: String(row.providerId),\n toolkit: String(row.toolkit),\n connectionId: String(row.connectionId),\n label: row.label == null ? null : String(row.label),\n scope: normaliseScope(row.scope),\n createdAt: parseDateTime(row.createdAt as string | number | Date | null | undefined) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt as string | number | Date | null | undefined) ?? new Date(),\n };\n}\n\nexport class ToolProviderConnectionsMySQL extends ToolProviderConnectionsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_TOOL_PROVIDER_CONNECTIONS] as const;\n\n /**\n * Returns default index definitions for the tool-provider-connections domain tables.\n * Currently no default indexes are defined for tool-provider-connections.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n schema: TABLE_SCHEMAS[TABLE_TOOL_PROVIDER_CONNECTIONS],\n compositePrimaryKey: ['authorId', 'providerId', 'connectionId'],\n }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ToolProviderConnectionsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /**\n * Returns default index definitions for the tool-provider-connections domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return ToolProviderConnectionsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for tool-provider-connections.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for tool-provider-connections domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_TOOL_PROVIDER_CONNECTIONS,\n schema: TOOL_PROVIDER_CONNECTIONS_SCHEMA,\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_TOOL_PROVIDER_CONNECTIONS });\n }\n\n async getConnectionById({\n authorId,\n providerId,\n connectionId,\n }: StorageToolProviderConnectionKey): Promise<StorageToolProviderConnection | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ? LIMIT 1`,\n [authorId, providerId, connectionId],\n );\n return rows.length ? rowToToolProviderConnection(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_GET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId, providerId, connectionId },\n },\n error,\n );\n }\n }\n\n async upsertConnection(input: StorageUpsertToolProviderConnectionInput): Promise<StorageToolProviderConnection> {\n const { authorId, providerId, toolkit, connectionId, label } = input;\n const now = new Date();\n const labelValue = label == null ? null : label;\n\n try {\n return await this.operations.withTransaction(async connection => {\n const [existing] = await connection.execute<RowDataPacket[]>(\n `SELECT ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('scope', 'column name')} FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ? LIMIT 1`,\n [authorId, providerId, connectionId],\n );\n\n const existingRow = existing[0];\n const createdAt = existingRow ? existingRow.createdAt : now;\n const existingScope = existingRow && existingRow.scope != null ? normaliseScope(existingRow.scope) : undefined;\n const scope: StorageToolProviderConnectionScope = input.scope ?? existingScope ?? 'per-author';\n\n if (existingRow) {\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} SET ${quoteIdentifier('toolkit', 'column name')} = ?, ${quoteIdentifier('label', 'column name')} = ?, ${quoteIdentifier('scope', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ?`,\n [toolkit, labelValue, scope, transformToSqlValue(now), authorId, providerId, connectionId],\n );\n } else {\n await connection.execute(\n `INSERT INTO ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} (${quoteIdentifier('authorId', 'column name')}, ${quoteIdentifier('providerId', 'column name')}, ${quoteIdentifier('toolkit', 'column name')}, ${quoteIdentifier('connectionId', 'column name')}, ${quoteIdentifier('label', 'column name')}, ${quoteIdentifier('scope', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')}) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n authorId,\n providerId,\n toolkit,\n connectionId,\n labelValue,\n scope,\n transformToSqlValue(createdAt),\n transformToSqlValue(now),\n ],\n );\n }\n\n return {\n authorId,\n providerId,\n toolkit,\n connectionId,\n label: labelValue,\n scope,\n createdAt: parseDateTime(createdAt) ?? now,\n updatedAt: now,\n };\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId, providerId, connectionId },\n },\n error,\n );\n }\n }\n\n async listConnectionsByAuthor({\n authorId,\n providerId,\n toolkit,\n scope,\n }: StorageListToolProviderConnectionsInput): Promise<StorageToolProviderConnection[]> {\n try {\n const clauses: string[] = [];\n const args: (string | number | null)[] = [];\n if (authorId !== undefined) {\n clauses.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n args.push(authorId);\n }\n if (providerId) {\n clauses.push(`${quoteIdentifier('providerId', 'column name')} = ?`);\n args.push(providerId);\n }\n if (toolkit) {\n clauses.push(`${quoteIdentifier('toolkit', 'column name')} = ?`);\n args.push(toolkit);\n }\n if (scope) {\n clauses.push(`${quoteIdentifier('scope', 'column name')} = ?`);\n args.push(scope);\n }\n const whereClause = clauses.length > 0 ? ` WHERE ${clauses.join(' AND ')}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)}${whereClause}`,\n args,\n );\n return rows.map(row => rowToToolProviderConnection(row as Record<string, unknown>));\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_LIST', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId: authorId ?? '', providerId: providerId ?? '', toolkit: toolkit ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteConnection({\n authorId,\n providerId,\n connectionId,\n }: StorageDeleteToolProviderConnectionInput): Promise<void> {\n try {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_TOOL_PROVIDER_CONNECTIONS)} WHERE ${quoteIdentifier('authorId', 'column name')} = ? AND ${quoteIdentifier('providerId', 'column name')} = ? AND ${quoteIdentifier('connectionId', 'column name')} = ?`,\n [authorId, providerId, connectionId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'TOOL_PROVIDER_CONNECTION_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { authorId, providerId, connectionId },\n },\n error,\n );\n }\n }\n}\n","import {\n TABLE_WORKFLOW_DEFINITIONS,\n WORKFLOW_DEFINITIONS_SCHEMA,\n WorkflowDefinitionsStorage,\n} from '@mastra/core/storage';\nimport type {\n CreateWorkflowDefinitionInput,\n ListWorkflowDefinitionsInput,\n ListWorkflowDefinitionsOutput,\n UpdateWorkflowDefinitionInput,\n WorkflowDefinition,\n} from '@mastra/core/storage';\nimport type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier, transformFromSqlRow } from '../utils';\n\nfunction rowToDefinition(row: Record<string, unknown>): WorkflowDefinition {\n const transformed = transformFromSqlRow<Record<string, unknown>>({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n sqlRow: row,\n });\n const def: WorkflowDefinition = {\n id: String(transformed.id),\n inputSchema: transformed.inputSchema,\n outputSchema: transformed.outputSchema,\n graph: transformed.graph as WorkflowDefinition['graph'],\n status: String(transformed.status) as WorkflowDefinition['status'],\n source: String(transformed.source) as WorkflowDefinition['source'],\n createdAt: transformed.createdAt as Date,\n updatedAt: transformed.updatedAt as Date,\n };\n if (transformed.description != null) def.description = String(transformed.description);\n if (transformed.metadata != null) def.metadata = transformed.metadata as Record<string, unknown>;\n if (transformed.stateSchema != null) def.stateSchema = transformed.stateSchema;\n if (transformed.requestContextSchema != null) def.requestContextSchema = transformed.requestContextSchema;\n if (transformed.schedule != null) def.schedule = transformed.schedule as WorkflowDefinition['schedule'];\n if (transformed.authorId != null) def.authorId = String(transformed.authorId);\n return def;\n}\n\nexport class WorkflowDefinitionsMySQL extends WorkflowDefinitionsStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n private database?: string;\n\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_DEFINITIONS] as const;\n\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n schema: WORKFLOW_DEFINITIONS_SCHEMA,\n }),\n ];\n }\n\n constructor({ pool, operations, database }: { pool: Pool; operations: StoreOperationsMySQL; database?: string }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.database = database;\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n schema: WORKFLOW_DEFINITIONS_SCHEMA,\n });\n await this.operations.alterTable({\n tableName: TABLE_WORKFLOW_DEFINITIONS,\n schema: WORKFLOW_DEFINITIONS_SCHEMA,\n ifNotExists: ['schedule'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_WORKFLOW_DEFINITIONS });\n }\n\n async upsert(input: CreateWorkflowDefinitionInput | UpdateWorkflowDefinitionInput): Promise<WorkflowDefinition> {\n const now = new Date();\n const existing = await this.get(input.id);\n\n if (!existing) {\n if (!('inputSchema' in input) || input.inputSchema === undefined)\n throw new Error(`Cannot create workflow definition \"${input.id}\": inputSchema is required.`);\n if (!('outputSchema' in input) || input.outputSchema === undefined)\n throw new Error(`Cannot create workflow definition \"${input.id}\": outputSchema is required.`);\n if (!('graph' in input) || input.graph === undefined)\n throw new Error(`Cannot create workflow definition \"${input.id}\": graph is required.`);\n\n const record: Record<string, any> = {\n id: input.id,\n description: input.description ?? null,\n metadata: input.metadata ?? null,\n inputSchema: input.inputSchema,\n outputSchema: input.outputSchema,\n stateSchema: input.stateSchema ?? null,\n requestContextSchema: input.requestContextSchema ?? null,\n graph: input.graph,\n schedule: 'schedule' in input ? (input.schedule ?? null) : null,\n status: 'active',\n source: 'storage',\n authorId: 'authorId' in input ? (input.authorId ?? null) : null,\n createdAt: now,\n updatedAt: now,\n };\n try {\n // insertOnly: a plain INSERT so a concurrent create is detected as a\n // duplicate-key error instead of ON DUPLICATE KEY UPDATE silently\n // clobbering the winning row (and its createdAt).\n await this.operations.insertOnly({ tableName: TABLE_WORKFLOW_DEFINITIONS, record });\n } catch (error) {\n // A concurrent upsert may have created the row after our existence\n // check; fall back to updating it so the upsert stays idempotent.\n if (!(await this.get(input.id))) throw error;\n return this.applyUpdate(input, now);\n }\n const created = await this.get(input.id);\n if (!created) throw new Error(`Failed to persist workflow definition \"${input.id}\".`);\n return created;\n }\n\n return this.applyUpdate(input, now);\n }\n\n private async applyUpdate(\n input: CreateWorkflowDefinitionInput | UpdateWorkflowDefinitionInput,\n now: Date,\n ): Promise<WorkflowDefinition> {\n const data: Record<string, any> = { updatedAt: now };\n if ('description' in input && input.description !== undefined) data.description = input.description;\n if ('metadata' in input && input.metadata !== undefined) data.metadata = input.metadata;\n if ('inputSchema' in input && input.inputSchema !== undefined) data.inputSchema = input.inputSchema;\n if ('outputSchema' in input && input.outputSchema !== undefined) data.outputSchema = input.outputSchema;\n if ('stateSchema' in input && input.stateSchema !== undefined) data.stateSchema = input.stateSchema;\n if ('requestContextSchema' in input && input.requestContextSchema !== undefined)\n data.requestContextSchema = input.requestContextSchema;\n if ('graph' in input && input.graph !== undefined) data.graph = input.graph;\n if ('schedule' in input && input.schedule !== undefined) data.schedule = input.schedule;\n if ('status' in input && input.status !== undefined) data.status = input.status;\n if ('authorId' in input && input.authorId !== undefined) data.authorId = input.authorId;\n\n await this.operations.update({ tableName: TABLE_WORKFLOW_DEFINITIONS, keys: { id: input.id }, data });\n const updated = await this.get(input.id);\n if (!updated) throw new Error(`Failed to update workflow definition \"${input.id}\".`);\n return updated;\n }\n\n async get(id: string): Promise<WorkflowDefinition | null> {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKFLOW_DEFINITIONS, this.database)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n if (!rows.length) return null;\n return rowToDefinition(rows[0] as Record<string, unknown>);\n }\n\n async list(args?: ListWorkflowDefinitionsInput): Promise<ListWorkflowDefinitionsOutput> {\n const conditions: string[] = [];\n const params: (string | number | null)[] = [];\n if (args?.status) {\n conditions.push(`${quoteIdentifier('status', 'column name')} = ?`);\n params.push(args.status);\n }\n if (args?.authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n params.push(args.authorId);\n }\n const where = conditions.length ? ` WHERE ${conditions.join(' AND ')}` : '';\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKFLOW_DEFINITIONS, this.database)}${where} ORDER BY ${quoteIdentifier('updatedAt', 'column name')} DESC`,\n params,\n );\n const definitions = rows.map(row => rowToDefinition(row as Record<string, unknown>));\n return { definitions, total: definitions.length };\n }\n\n async delete(id: string): Promise<void> {\n await this.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_WORKFLOW_DEFINITIONS, this.database)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n TABLE_WORKFLOW_RUN_OWNERS,\n RUN_FENCING_TABLE_SCHEMAS,\n WorkflowsStorage,\n createStorageErrorId,\n normalizePerPage,\n matchesExpectedWorkflowStatus,\n matchesRunFence,\n isRunFenceConflictError,\n resolveRunFence,\n executeRetentionPrune,\n resolveRetentionTargets,\n retentionCutoffMs,\n} from '@mastra/core/storage';\nimport type {\n ClaimRunOwnershipInput,\n ClaimRunOwnershipResult,\n CreateIndexOptions,\n RenewRunOwnershipInput,\n RenewRunOwnershipResult,\n RunFence,\n RunOwnershipRecord,\n StorageListWorkflowRunsInput,\n TABLE_NAMES,\n UpdateWorkflowStateOptions,\n WorkflowRun,\n WorkflowRuns,\n PruneOptions,\n PruneResult,\n RetentionTablesDescriptor,\n TableRetentionPolicy,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport type { Pool, ResultSetHeader, RowDataPacket } from 'mysql2/promise';\nimport { assertRunFence, claimTransaction, DB_NOW_MS, inTransaction, withRunFence } from '../../db/run-fencing';\nimport type { Queryable } from '../../db/run-fencing';\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, parseDateTime, quoteIdentifier, transformToSqlValue } from '../utils';\n\ninterface WorkflowRow {\n workflow_name: string;\n run_id: string;\n resourceId: string | null;\n snapshot: string | WorkflowRunState;\n createdAt: Date | string;\n updatedAt: Date | string;\n}\n\nfunction parseSnapshot(snapshot: string | WorkflowRunState): WorkflowRunState | string {\n if (typeof snapshot === 'string') {\n try {\n return JSON.parse(snapshot) as WorkflowRunState;\n } catch {\n return snapshot;\n }\n }\n return snapshot;\n}\n\nconst RUN_OWNERS_TABLE = formatTableName(TABLE_WORKFLOW_RUN_OWNERS as TABLE_NAMES);\nconst RUN_ID = quoteIdentifier('runId', 'column name');\nconst OWNER_ID = quoteIdentifier('ownerId', 'column name');\nconst LEASE_EXPIRES_AT = quoteIdentifier('leaseExpiresAt', 'column name');\nconst UPDATED_AT = quoteIdentifier('updatedAt', 'column name');\nconst RUN_OWNER_COLUMNS = `generation, ${OWNER_ID} AS ownerId, ${LEASE_EXPIRES_AT} AS leaseExpiresAt, ${DB_NOW_MS} AS nowMs`;\n\nfunction toRunOwnershipRecord(runId: string, row: RowDataPacket): RunOwnershipRecord {\n const leaseExpiresAt = row.leaseExpiresAt === null ? null : Number(row.leaseExpiresAt);\n return {\n runId,\n generation: Number(row.generation),\n ownerId: String(row.ownerId),\n leaseExpiresAt: leaseExpiresAt === null ? null : new Date(leaseExpiresAt),\n live: leaseExpiresAt !== null && leaseExpiresAt > Number(row.nowMs),\n };\n}\n\nasync function readRunOwner(q: Queryable, runId: string): Promise<RunOwnershipRecord | null> {\n const [rows] = await q.execute<RowDataPacket[]>(\n `SELECT ${RUN_OWNER_COLUMNS} FROM ${RUN_OWNERS_TABLE} WHERE ${RUN_ID} = ?`,\n [runId],\n );\n return rows[0] ? toRunOwnershipRecord(runId, rows[0]) : null;\n}\n\nfunction mapWorkflowRow(row: WorkflowRow): WorkflowRun {\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n resourceId: row.resourceId ?? undefined,\n snapshot: parseSnapshot(row.snapshot),\n createdAt: parseDateTime(row.createdAt) ?? new Date(),\n updatedAt: parseDateTime(row.updatedAt) ?? new Date(),\n };\n}\n\nexport class WorkflowsMySQL extends WorkflowsStorage {\n private operations: StoreOperationsMySQL;\n private pool: Pool;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_SNAPSHOT] as const;\n\n /**\n * Tables `prune()` can clean up. Run ownership rows anchor on `updatedAt` (epoch ms), which every\n * claim, renewal and release refreshes, so a live execution's row is never\n * older than its renew interval.\n */\n static override readonly retentionTables: RetentionTablesDescriptor = {\n runOwnership: { table: TABLE_WORKFLOW_RUN_OWNERS, column: 'updatedAt', indexed: false, anchorType: 'epoch-ms' },\n };\n\n /**\n * Returns default index definitions for the workflows domain tables.\n * Currently no default indexes are defined for workflows.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n compositePrimaryKey: ['workflow_name', 'run_id'],\n }),\n generateTableSQL({\n tableName: TABLE_WORKFLOW_RUN_OWNERS as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_WORKFLOW_RUN_OWNERS],\n }),\n ];\n }\n\n constructor({\n operations,\n pool,\n skipDefaultIndexes,\n indexes,\n }: {\n operations: StoreOperationsMySQL;\n pool: Pool;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.operations = operations;\n this.pool = pool;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (WorkflowsMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n supportsConcurrentUpdates(): boolean {\n return true;\n }\n\n /**\n * Returns default index definitions for the workflows domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return WorkflowsMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for workflows.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for workflows domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n const schema = TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT];\n await this.operations.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema });\n await this.operations.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema,\n ifNotExists: ['resourceId'],\n });\n await this.operations.createTable({\n tableName: TABLE_WORKFLOW_RUN_OWNERS as TABLE_NAMES,\n schema: RUN_FENCING_TABLE_SCHEMAS[TABLE_WORKFLOW_RUN_OWNERS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async prune(policies: Record<string, TableRetentionPolicy>, options?: PruneOptions): Promise<PruneResult[]> {\n const targets = resolveRetentionTargets({\n policies,\n descriptor: WorkflowsMySQL.retentionTables,\n order: ['runOwnership'],\n });\n return executeRetentionPrune({\n domain: 'workflows',\n targets,\n options,\n cutoffFor: (target, now) => retentionCutoffMs(target.policy, now),\n deleteBatch: (target, cutoff, limit) =>\n this.operations.pruneBatch({ tableName: target.table as TABLE_NAMES, column: target.column, cutoff, limit }),\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)}`);\n await this.pool.execute(`DELETE FROM ${RUN_OWNERS_TABLE}`);\n }\n\n supportsRunFencing(): boolean {\n return true;\n }\n\n #ownershipError(operation: string, runId: string, error: unknown): MastraError {\n return new MastraError(\n {\n id: createStorageErrorId('MYSQL', operation, 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\n },\n error,\n );\n }\n\n async claimRunOwnership({\n runId,\n ownerId,\n leaseMs,\n force,\n expectedGeneration,\n }: ClaimRunOwnershipInput): Promise<ClaimRunOwnershipResult> {\n try {\n return await claimTransaction(this.pool, async connection => {\n const [existing] = await connection.execute<RowDataPacket[]>(\n `SELECT generation FROM ${RUN_OWNERS_TABLE} WHERE ${RUN_ID} = ? FOR UPDATE`,\n [runId],\n );\n if (existing.length === 0) {\n if (expectedGeneration !== undefined && expectedGeneration !== 0) {\n return { acquired: false, record: null };\n }\n // A run's first generation is the database clock, so a run claimed\n // again after its record was pruned still gets a higher generation.\n await connection.execute(\n `INSERT INTO ${RUN_OWNERS_TABLE} (${RUN_ID}, generation, ${OWNER_ID}, ${LEASE_EXPIRES_AT}, ${UPDATED_AT})\n VALUES (?, GREATEST(1, ${DB_NOW_MS}), ?, ${DB_NOW_MS} + ?, ${DB_NOW_MS})`,\n [runId, ownerId, leaseMs],\n );\n return { acquired: true, record: (await readRunOwner(connection, runId))! };\n }\n // The row lock is held from the statement above, so the lease check in\n // this statement reads the database clock after any wait for it.\n await connection.execute(\n `UPDATE ${RUN_OWNERS_TABLE}\n SET generation = generation + 1, ${OWNER_ID} = ?, ${LEASE_EXPIRES_AT} = ${DB_NOW_MS} + ?,\n ${UPDATED_AT} = ${DB_NOW_MS}\n WHERE ${RUN_ID} = ?\n AND (? IS NULL OR generation = ?)\n AND (? OR ${LEASE_EXPIRES_AT} IS NULL OR ${LEASE_EXPIRES_AT} <= ${DB_NOW_MS})`,\n [ownerId, leaseMs, runId, expectedGeneration ?? null, expectedGeneration ?? null, force === true],\n );\n const record = await readRunOwner(connection, runId);\n // Comparing generations under the held row lock, rather than counting\n // affected rows, keeps the answer independent of the FOUND_ROWS flag.\n return record && record.generation === Number(existing[0]!.generation) + 1\n ? { acquired: true, record }\n : { acquired: false, record };\n });\n } catch (error) {\n throw this.#ownershipError('CLAIM_RUN_OWNERSHIP', runId, error);\n }\n }\n\n async renewRunOwnership({ leaseMs, ...fence }: RenewRunOwnershipInput): Promise<RenewRunOwnershipResult> {\n try {\n return await inTransaction(this.pool, async connection => {\n await connection.execute(\n `UPDATE ${RUN_OWNERS_TABLE}\n SET ${LEASE_EXPIRES_AT} = ${DB_NOW_MS} + ?, ${UPDATED_AT} = ${DB_NOW_MS}\n WHERE ${RUN_ID} = ? AND generation = ? AND ${OWNER_ID} = ? AND ${LEASE_EXPIRES_AT} IS NOT NULL`,\n [leaseMs, fence.runId, fence.generation, fence.ownerId],\n );\n const record = await readRunOwner(connection, fence.runId);\n return record && matchesRunFence(record, fence) && record.leaseExpiresAt !== null\n ? { renewed: true, record }\n : { renewed: false, record };\n });\n } catch (error) {\n throw this.#ownershipError('RENEW_RUN_OWNERSHIP', fence.runId, error);\n }\n }\n\n async releaseRunOwnership(fence: RunFence): Promise<boolean> {\n try {\n return await inTransaction(this.pool, async connection => {\n await connection.execute(\n `UPDATE ${RUN_OWNERS_TABLE} SET ${LEASE_EXPIRES_AT} = NULL, ${UPDATED_AT} = ${DB_NOW_MS}\n WHERE ${RUN_ID} = ? AND generation = ? AND ${OWNER_ID} = ?`,\n [fence.runId, fence.generation, fence.ownerId],\n );\n return matchesRunFence(await readRunOwner(connection, fence.runId), fence);\n });\n } catch (error) {\n throw this.#ownershipError('RELEASE_RUN_OWNERSHIP', fence.runId, error);\n }\n }\n\n async getRunOwnership({ runId }: { runId: string }): Promise<RunOwnershipRecord | null> {\n try {\n return await readRunOwner(this.pool, runId);\n } catch (error) {\n throw this.#ownershipError('GET_RUN_OWNERSHIP', runId, error);\n }\n }\n\n async deleteWorkflowRunById({\n runId,\n workflowName,\n fence,\n }: {\n runId: string;\n workflowName: string;\n fence?: RunFence;\n }): Promise<void> {\n try {\n await withRunFence(this.pool, RUN_OWNERS_TABLE, resolveRunFence(this, fence, runId), 'deleteWorkflowRunById', q =>\n q.execute(\n `DELETE FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [workflowName, runId],\n ),\n );\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_DELETE_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n state,\n fence: explicitFence,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext?: Record<string, any>;\n state?: Record<string, any>;\n fence?: RunFence;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n const fence = resolveRunFence(this, explicitFence, runId);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n if (fence) await assertRunFence(connection, RUN_OWNERS_TABLE, fence, 'updateWorkflowResults');\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT snapshot FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ? FOR UPDATE`,\n [workflowName, runId],\n );\n if (!Array.isArray(rows) || rows.length === 0) {\n await connection.rollback();\n throw new MastraError({\n id: 'MYSQL_WORKFLOWS_UPDATE_RESULTS_NOT_FOUND',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { workflowName, runId },\n });\n }\n\n const currentSnapshot = parseSnapshot(rows[0]!.snapshot) as WorkflowRunState;\n const context = { ...(currentSnapshot.context ?? {}) };\n\n context[stepId] = result;\n if (state !== undefined) {\n (context as Record<string, unknown>).__state = state;\n }\n\n const updatedSnapshot: WorkflowRunState = {\n ...currentSnapshot,\n context,\n requestContext: { ...(currentSnapshot.requestContext ?? {}), ...(requestContext ?? {}) },\n };\n\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} SET ${quoteIdentifier('snapshot', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [JSON.stringify(updatedSnapshot), transformToSqlValue(new Date()), workflowName, runId],\n );\n\n await connection.commit();\n\n return context;\n } catch (error) {\n await connection.rollback();\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_UPDATE_RESULTS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId, stepId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n fence: explicitFence,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n fence?: RunFence;\n }): Promise<WorkflowRunState | undefined> {\n const fence = resolveRunFence(this, explicitFence, runId);\n const connection = await this.pool.getConnection();\n try {\n await connection.beginTransaction();\n if (fence) await assertRunFence(connection, RUN_OWNERS_TABLE, fence, 'updateWorkflowState');\n const [rows] = await connection.execute<RowDataPacket[]>(\n `SELECT snapshot FROM ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ? FOR UPDATE`,\n [workflowName, runId],\n );\n if (!Array.isArray(rows) || rows.length === 0) {\n await connection.rollback();\n return undefined;\n }\n\n const existing = parseSnapshot(rows[0]!.snapshot) as WorkflowRunState;\n\n const { expectedStatus, ...state } = opts;\n if (!matchesExpectedWorkflowStatus(existing.status, expectedStatus)) {\n await connection.rollback();\n return undefined;\n }\n\n // Merge opts into the snapshot\n const updatedSnapshot = { ...existing, ...state };\n\n await connection.execute(\n `UPDATE ${formatTableName(TABLE_WORKFLOW_SNAPSHOT)} SET ${quoteIdentifier('snapshot', 'column name')} = ?, ${quoteIdentifier('updatedAt', 'column name')} = ? WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [JSON.stringify(updatedSnapshot), transformToSqlValue(new Date()), workflowName, runId],\n );\n await connection.commit();\n\n return updatedSnapshot;\n } catch (error) {\n await connection.rollback();\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_UPDATE_STATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n } finally {\n connection.release();\n }\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n fence,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n fence?: RunFence;\n }): Promise<void> {\n const now = new Date();\n const createdAtValue = createdAt ?? now;\n const updatedAtValue = updatedAt ?? now;\n const tableName = formatTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n await withRunFence(\n this.pool,\n RUN_OWNERS_TABLE,\n resolveRunFence(this, fence, runId),\n 'persistWorkflowSnapshot',\n async q => {\n const [updateResult] = await q.execute<ResultSetHeader>(\n `UPDATE ${tableName}\n SET ${quoteIdentifier('resourceId', 'column name')} = ?,\n ${quoteIdentifier('snapshot', 'column name')} = ?,\n ${quoteIdentifier('updatedAt', 'column name')} = ?\n WHERE ${quoteIdentifier('workflow_name', 'column name')} = ? AND ${quoteIdentifier('run_id', 'column name')} = ?`,\n [resourceId ?? null, JSON.stringify(snapshot), transformToSqlValue(updatedAtValue), workflowName, runId],\n );\n\n if (updateResult.affectedRows > 0) {\n return;\n }\n\n await q.execute(\n `INSERT INTO ${tableName} (${quoteIdentifier('workflow_name', 'column name')}, ${quoteIdentifier('run_id', 'column name')}, ${quoteIdentifier('resourceId', 'column name')}, ${quoteIdentifier('snapshot', 'column name')}, ${quoteIdentifier('createdAt', 'column name')}, ${quoteIdentifier('updatedAt', 'column name')})\n VALUES (?, ?, ?, ?, ?, ?)\n ON DUPLICATE KEY UPDATE ${quoteIdentifier('resourceId', 'column name')} = VALUES(${quoteIdentifier('resourceId', 'column name')}), ${quoteIdentifier('snapshot', 'column name')} = VALUES(${quoteIdentifier('snapshot', 'column name')}), ${quoteIdentifier('updatedAt', 'column name')} = VALUES(${quoteIdentifier('updatedAt', 'column name')})`,\n [\n workflowName,\n runId,\n resourceId ?? null,\n JSON.stringify(snapshot),\n transformToSqlValue(createdAtValue),\n transformToSqlValue(updatedAtValue),\n ],\n );\n },\n );\n } catch (error) {\n if (isRunFenceConflictError(error)) throw error;\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_PERSIST_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const row = await this.operations.load<WorkflowRow>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n return row ? (parseSnapshot(row.snapshot) as WorkflowRunState) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_LOAD_SNAPSHOT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n const { workflowName, fromDate, toDate, perPage, page, resourceId, status } = args;\n\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (workflowName) {\n conditions.push(`${quoteIdentifier('workflow_name', 'column name')} = ?`);\n params.push(workflowName);\n }\n if (resourceId) {\n conditions.push(`${quoteIdentifier('resourceId', 'column name')} = ?`);\n params.push(resourceId);\n }\n if (status) {\n conditions.push(`JSON_EXTRACT(${quoteIdentifier('snapshot', 'column name')}, '$.status') = ?`);\n params.push(status);\n }\n if (fromDate) {\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} >= ?`);\n params.push(transformToSqlValue(fromDate));\n }\n if (toDate) {\n conditions.push(`${quoteIdentifier('createdAt', 'column name')} <= ?`);\n params.push(transformToSqlValue(toDate));\n }\n\n const whereSql = conditions.length ? ` WHERE ${conditions.join(' AND ')}` : '';\n const tableName = formatTableName(TABLE_WORKFLOW_SNAPSHOT);\n\n try {\n let total = 0;\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n\n if (usePagination) {\n const [countRows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT COUNT(*) as count FROM ${tableName}${whereSql}`,\n params,\n );\n total = Number(countRows[0]?.count ?? 0);\n\n if (total === 0) {\n return { runs: [], total: 0 };\n }\n }\n\n let paginationClause = '';\n\n if (usePagination) {\n const normalizedPerPage = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page * normalizedPerPage;\n paginationClause = ` LIMIT ${Number(normalizedPerPage)} OFFSET ${Number(offset)}`;\n }\n\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT workflow_name, run_id, resourceId, snapshot, createdAt, updatedAt FROM ${tableName}${whereSql} ORDER BY ${quoteIdentifier('createdAt', 'column name')} DESC${paginationClause}`,\n params,\n );\n\n const runs = (rows as unknown as WorkflowRow[]).map(mapWorkflowRow);\n\n return {\n runs,\n total: total || runs.length,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_GET_RUNS_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getWorkflowRuns(args: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n return this.listWorkflowRuns(args);\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const runs = await this.operations.loadMany<WorkflowRow>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n whereClause: {\n sql: workflowName ? ' WHERE workflow_name = ? AND run_id = ?' : ' WHERE run_id = ?',\n args: workflowName ? [workflowName, runId] : [runId],\n },\n orderBy: '`createdAt` DESC',\n limit: 1,\n });\n if (!runs.length) return null;\n return mapWorkflowRow(runs[0]!);\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_WORKFLOWS_GET_RUN_BY_ID_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n WorkspacesStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n TABLE_SCHEMAS,\n WORKSPACES_SCHEMA,\n WORKSPACE_VERSIONS_SCHEMA,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\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 type { Pool, RowDataPacket } from 'mysql2/promise';\n\nimport type { StoreOperationsMySQL } from '../operations';\nimport { generateTableSQL } from '../operations';\nimport { formatTableName, quoteIdentifier } from '../utils';\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 WorkspacesMySQL extends WorkspacesStorage {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS] as const;\n\n /**\n * Returns default index definitions for the workspaces domain tables.\n * Currently no default indexes are defined for workspaces.\n */\n static getDefaultIndexDefs(_prefix: string = ''): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Exports DDL statements for all managed tables.\n */\n static getExportDDL(): string[] {\n return [\n generateTableSQL({ tableName: TABLE_WORKSPACES, schema: TABLE_SCHEMAS[TABLE_WORKSPACES] }),\n generateTableSQL({ tableName: TABLE_WORKSPACE_VERSIONS, schema: TABLE_SCHEMAS[TABLE_WORKSPACE_VERSIONS] }),\n ];\n }\n\n constructor({\n pool,\n operations,\n skipDefaultIndexes,\n indexes,\n }: {\n pool: Pool;\n operations: StoreOperationsMySQL;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n }) {\n super();\n this.pool = pool;\n this.operations = operations;\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (WorkspacesMySQL.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the workspaces domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return WorkspacesMySQL.getDefaultIndexDefs('');\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for workspaces.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n // No default indexes for workspaces domain\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n await this.operations.createIndex(indexDef);\n }\n }\n\n async init(): Promise<void> {\n await this.operations.createTable({ tableName: TABLE_WORKSPACES, schema: WORKSPACES_SCHEMA });\n await this.operations.createTable({ tableName: TABLE_WORKSPACE_VERSIONS, schema: WORKSPACE_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.operations.clearTable({ tableName: TABLE_WORKSPACE_VERSIONS });\n await this.operations.clearTable({ tableName: TABLE_WORKSPACES });\n }\n\n private safeParseJSON<T = unknown>(val: unknown): T | undefined {\n if (val === null || val === undefined) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as T;\n } catch {\n return val as T;\n }\n }\n return val as T;\n }\n\n private parseWorkspaceRow(row: Record<string, unknown>): StorageWorkspaceType {\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: this.safeParseJSON(row.metadata) as Record<string, unknown> | undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n updatedAt: row.updatedAt instanceof Date ? row.updatedAt : new Date(row.updatedAt as string),\n };\n }\n\n private parseVersionRow(row: Record<string, unknown>): WorkspaceVersion {\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: this.safeParseJSON(row.filesystem) as WorkspaceVersion['filesystem'],\n sandbox: this.safeParseJSON(row.sandbox) as WorkspaceVersion['sandbox'],\n mounts: this.safeParseJSON(row.mounts) as WorkspaceVersion['mounts'],\n search: this.safeParseJSON(row.search) as WorkspaceVersion['search'],\n skills: this.safeParseJSON(row.skills) as WorkspaceVersion['skills'],\n tools: this.safeParseJSON(row.tools) as WorkspaceVersion['tools'],\n autoSync: row.autoSync === true || row.autoSync === 1 || row.autoSync === '1',\n operationTimeout: row.operationTimeout != null ? Number(row.operationTimeout) : undefined,\n changedFields: this.safeParseJSON(row.changedFields) as string[] | undefined,\n changeMessage: (row.changeMessage as string) ?? undefined,\n createdAt: row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt as string),\n };\n }\n\n async getById(id: string): Promise<StorageWorkspaceType | null> {\n try {\n const [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKSPACES)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseWorkspaceRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 await this.operations.withTransaction(async () => {\n await this.operations.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,\n updatedAt: now,\n },\n });\n\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;\n const versionId = crypto.randomUUID();\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 });\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('MYSQL', '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('MYSQL', '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 const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n const configFieldNames = SNAPSHOT_FIELDS as readonly string[];\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (authorId !== undefined) updateData.authorId = authorId;\n if (activeVersionId !== undefined) {\n updateData.activeVersionId = activeVersionId;\n if (status === undefined) updateData.status = 'published';\n }\n if (status !== undefined) updateData.status = status;\n if (metadata !== undefined) updateData.metadata = { ...(existing.metadata || {}), ...metadata };\n\n await this.operations.withTransaction(async connection => {\n // Lock the workspace row so concurrent updates serialize and cannot\n // race on the version number increment below.\n await connection.execute(\n `SELECT ${quoteIdentifier('id', 'column name')} FROM ${formatTableName(TABLE_WORKSPACES)} WHERE ${quoteIdentifier('id', 'column name')} = ? FOR UPDATE`,\n [id],\n );\n\n await this.operations.update({ tableName: TABLE_WORKSPACES, keys: { id }, data: updateData });\n\n if (hasConfigUpdate) {\n // Read latest version inside transaction to prevent race conditions\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) throw new Error(`No versions found for workspace ${id}`);\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 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\n const updated = await this.getById(id);\n if (!updated)\n throw new MastraError({\n id: createStorageErrorId('MYSQL', '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 return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.operations.withTransaction(async () => {\n await this.deleteVersionsByParentId(id);\n await this.operations.delete({ tableName: TABLE_WORKSPACES, keys: { id } });\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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: any[] = [];\n if (authorId !== undefined) {\n conditions.push(`${quoteIdentifier('authorId', 'column name')} = ?`);\n queryParams.push(authorId);\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('MYSQL', 'LIST_WORKSPACES', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}`,\n details: { key },\n });\n if (typeof value === 'string') {\n conditions.push(\n `JSON_UNQUOTE(JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}')) = ?`,\n );\n queryParams.push(value);\n } else {\n conditions.push(\n `JSON_EXTRACT(${quoteIdentifier('metadata', 'column name')}, '$.${key}') = CAST(? AS JSON)`,\n );\n queryParams.push(JSON.stringify(value));\n }\n }\n }\n\n const whereClause =\n conditions.length > 0 ? { sql: ` WHERE ${conditions.join(' AND ')}`, args: queryParams } : undefined;\n const total = await this.operations.loadTotalCount({ tableName: TABLE_WORKSPACES, whereClause });\n if (total === 0) return { workspaces: [], total: 0, page, perPage: perPageInput ?? 100, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACES,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n workspaces: rows.map(row => this.parseWorkspaceRow(row)),\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('MYSQL', 'LIST_WORKSPACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n try {\n const now = new Date();\n await this.operations.insert({\n tableName: TABLE_WORKSPACE_VERSIONS,\n record: {\n id: input.id,\n workspaceId: input.workspaceId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n filesystem: input.filesystem ?? null,\n sandbox: input.sandbox ?? null,\n mounts: input.mounts ?? null,\n search: input.search ?? null,\n skills: input.skills ?? null,\n tools: input.tools ?? null,\n autoSync: input.autoSync ? 1 : 0,\n operationTimeout: input.operationTimeout ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 [rows] = await this.pool.execute<RowDataPacket[]>(\n `SELECT * FROM ${formatTableName(TABLE_WORKSPACE_VERSIONS)} WHERE ${quoteIdentifier('id', 'column name')} = ?`,\n [id],\n );\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause: {\n sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ? AND ${quoteIdentifier('versionNumber', 'column name')} = ?`,\n args: [workspaceId, versionNumber],\n },\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`, args: [workspaceId] },\n orderBy: `${quoteIdentifier('versionNumber', 'column name')} DESC`,\n limit: 1,\n });\n return rows.length ? this.parseVersionRow(rows[0]!) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 const whereClause = { sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`, args: [workspaceId] };\n const total = await this.operations.loadTotalCount({ tableName: TABLE_WORKSPACE_VERSIONS, whereClause });\n if (total === 0) return { versions: [], total: 0, page, perPage: perPageInput ?? 20, hasMore: false };\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.operations.loadMany<Record<string, unknown>>({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause,\n orderBy: `${quoteIdentifier(field, 'column name')} ${direction}`,\n offset,\n limit: limitValue,\n });\n\n return {\n versions: rows.map(row => this.parseVersionRow(row)),\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('MYSQL', '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.operations.delete({ tableName: TABLE_WORKSPACE_VERSIONS, keys: { id } });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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.pool.execute(\n `DELETE FROM ${formatTableName(TABLE_WORKSPACE_VERSIONS)} WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`,\n [entityId],\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', '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 return await this.operations.loadTotalCount({\n tableName: TABLE_WORKSPACE_VERSIONS,\n whereClause: { sql: ` WHERE ${quoteIdentifier('workspaceId', 'column name')} = ?`, args: [workspaceId] },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('MYSQL', 'COUNT_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';\nimport { MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains, CreateIndexOptions, RetentionConfig } from '@mastra/core/storage';\nimport { createPool } from 'mysql2/promise';\nimport type { Pool, PoolOptions } from 'mysql2/promise';\n\nimport { AgentsMySQL } from './domains/agents';\nimport { BackgroundTasksMySQL } from './domains/background-tasks';\nimport { BlobsMySQL } from './domains/blobs';\nimport { ChannelsMySQL } from './domains/channels';\nimport { DatasetsMySQL } from './domains/datasets';\nimport { ExperimentsMySQL } from './domains/experiments';\nimport { FavoritesMySQL } from './domains/favorites';\nimport { KnowledgeMySQL } from './domains/knowledge';\nimport { MCPClientsMySQL } from './domains/mcp-clients';\nimport { MCPServersMySQL } from './domains/mcp-servers';\nimport { MemoryMySQL } from './domains/memory';\nimport { ObservabilityMySQL } from './domains/observability';\nimport { StoreOperationsMySQL } from './domains/operations';\nimport { PromptBlocksMySQL } from './domains/prompt-blocks';\nimport { SchedulesMySQL } from './domains/schedules';\nimport { ScorerDefinitionsMySQL } from './domains/scorer-definitions';\nimport { ScoresMySQL } from './domains/scores';\nimport { SkillsMySQL } from './domains/skills';\nimport { ToolProviderConnectionsMySQL } from './domains/tool-provider-connections';\nimport { WorkflowDefinitionsMySQL } from './domains/workflow-definitions';\nimport { WorkflowsMySQL } from './domains/workflows';\nimport { WorkspacesMySQL } from './domains/workspaces';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsMySQL,\n BackgroundTasksMySQL,\n BlobsMySQL,\n ChannelsMySQL,\n DatasetsMySQL,\n ExperimentsMySQL,\n FavoritesMySQL,\n KnowledgeMySQL,\n MCPClientsMySQL,\n MCPServersMySQL,\n MemoryMySQL,\n ObservabilityMySQL,\n StoreOperationsMySQL,\n PromptBlocksMySQL,\n SchedulesMySQL,\n ScorerDefinitionsMySQL,\n ScoresMySQL,\n SkillsMySQL,\n ToolProviderConnectionsMySQL,\n WorkflowsMySQL,\n WorkflowDefinitionsMySQL,\n WorkspacesMySQL,\n};\n\nexport type MySQLStoreConfig = (\n | {\n connectionString: string;\n database?: string;\n max?: number;\n ssl?: boolean | Record<string, unknown>;\n }\n | {\n host: string;\n port?: number;\n user: string;\n password?: string;\n database: string;\n ssl?: boolean | Record<string, unknown>;\n max?: number;\n waitForConnections?: boolean;\n queueLimit?: number;\n }\n) & {\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n retention?: RetentionConfig;\n};\n\nfunction validateConfig(config: MySQLStoreConfig): void {\n if ('connectionString' in config) {\n if (!config.connectionString || typeof config.connectionString !== 'string') {\n throw new Error('MySQLStore: connectionString must be a non-empty string.');\n }\n return;\n }\n\n const required: Array<keyof typeof config> = ['host', 'user', 'database'];\n for (const key of required) {\n const value = config[key];\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`MySQLStore: ${key} must be provided and cannot be empty.`);\n }\n }\n\n if ('password' in config && config.password !== undefined) {\n if (typeof config.password !== 'string') {\n throw new Error('MySQLStore: password must be a string if provided.');\n }\n }\n}\n\nfunction createMySQLPool(config: MySQLStoreConfig): { pool: Pool; database?: string } {\n if ('connectionString' in config) {\n const { options } = parseConnectionString(config.connectionString, config);\n return { pool: createPool(options), database: options.database };\n }\n\n const options: PoolOptions = {\n host: config.host,\n port: config.port ?? 3306,\n user: config.user,\n database: config.database,\n connectionLimit: config.max ?? 10,\n waitForConnections: config.waitForConnections ?? true,\n queueLimit: config.queueLimit ?? 0,\n dateStrings: true,\n };\n\n if (config.password !== undefined) {\n options.password = config.password;\n }\n\n if ('ssl' in config && config.ssl) {\n options.ssl = typeof config.ssl === 'boolean' ? {} : (config.ssl as PoolOptions['ssl']);\n }\n\n return { pool: createPool(options), database: options.database };\n}\n\nfunction parseConnectionString(\n connectionString: string,\n overrides: Extract<MySQLStoreConfig, { connectionString: string }>,\n): { options: PoolOptions } {\n const url = new URL(connectionString);\n\n const databaseFromUrl = url.pathname.replace(/^\\//, '') || undefined;\n\n const base: PoolOptions = {\n host: url.hostname || 'localhost',\n port: url.port ? Number(url.port) : 3306,\n user: decodeURIComponent(url.username),\n password: decodeURIComponent(url.password),\n database: overrides.database ?? databaseFromUrl,\n connectionLimit: overrides.max ?? 10,\n waitForConnections: true,\n queueLimit: 0,\n dateStrings: true,\n };\n\n if (url.searchParams.has('waitForConnections')) {\n base.waitForConnections = url.searchParams.get('waitForConnections') === 'true';\n }\n if (url.searchParams.has('queueLimit')) {\n const queueLimit = Number(url.searchParams.get('queueLimit'));\n if (!Number.isNaN(queueLimit)) {\n base.queueLimit = queueLimit;\n }\n }\n if (url.searchParams.has('connectionLimit')) {\n const connectionLimit = Number(url.searchParams.get('connectionLimit'));\n if (!Number.isNaN(connectionLimit)) {\n base.connectionLimit = connectionLimit;\n }\n }\n if (url.searchParams.has('dateStrings')) {\n base.dateStrings = url.searchParams.get('dateStrings') === 'true';\n }\n\n let sslParam: unknown = overrides.ssl ?? url.searchParams.get('ssl') ?? undefined;\n if (typeof sslParam === 'string') {\n const trimmed = sslParam.trim();\n const lowered = trimmed.toLowerCase();\n if (['false', '0', 'off', ''].includes(lowered)) {\n sslParam = undefined;\n } else if (['true', '1', 'on'].includes(lowered)) {\n sslParam = {};\n } else if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n sslParam = JSON.parse(trimmed);\n } catch {\n sslParam = undefined;\n }\n }\n }\n if (sslParam && typeof sslParam === 'object') {\n base.ssl = sslParam as PoolOptions['ssl'];\n }\n\n return { options: base };\n}\n\nexport class MySQLStore extends MastraCompositeStore {\n private pool: Pool;\n private operations: StoreOperationsMySQL;\n\n stores: StorageDomains;\n\n constructor(config: MySQLStoreConfig & { id?: string; disableInit?: boolean }) {\n super({\n id: config.id ?? 'mysql',\n name: 'MySQLStore',\n disableInit: config.disableInit,\n retention: config.retention,\n });\n validateConfig(config);\n const { pool, database } = createMySQLPool(config);\n this.pool = pool;\n\n const operations = new StoreOperationsMySQL({ pool: this.pool, database });\n this.operations = operations;\n\n const memory = new MemoryMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const knowledge = new KnowledgeMySQL({ pool: this.pool, operations });\n const workflows = new WorkflowsMySQL({\n operations,\n pool: this.pool,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const scores = new ScoresMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const observability = new ObservabilityMySQL({\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const agents = new AgentsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const datasets = new DatasetsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const experiments = new ExperimentsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const promptBlocks = new PromptBlocksMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const scorerDefinitions = new ScorerDefinitionsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const mcpClients = new MCPClientsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const mcpServers = new MCPServersMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const workspaces = new WorkspacesMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const skills = new SkillsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const blobs = new BlobsMySQL({ pool: this.pool, operations });\n const backgroundTasks = new BackgroundTasksMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const channels = new ChannelsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const favorites = new FavoritesMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const schedules = new SchedulesMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const toolProviderConnections = new ToolProviderConnectionsMySQL({\n pool: this.pool,\n operations,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n });\n const workflowDefinitions = new WorkflowDefinitionsMySQL({\n pool: this.pool,\n operations,\n database,\n });\n\n this.stores = {\n memory,\n knowledge,\n workflows,\n scores,\n observability,\n agents,\n datasets,\n experiments,\n promptBlocks,\n scorerDefinitions,\n mcpClients,\n mcpServers,\n workspaces,\n skills,\n blobs,\n backgroundTasks,\n channels,\n favorites,\n schedules,\n toolProviderConnections,\n workflowDefinitions,\n };\n }\n\n async init(): Promise<void> {\n try {\n const connection = await this.pool.getConnection();\n connection.release();\n // Load the init-scoped catalog snapshot so domain inits answer their\n // existence checks locally instead of probing the server per object.\n // A failed or empty load (no default database) simply leaves today's\n // per-probe behavior in place.\n await this.operations.loadInitSchemaSnapshot();\n await super.init();\n } catch (error) {\n throw new MastraError(\n {\n id: 'MYSQL_STORE_INIT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n } finally {\n // Init-scoped by design: cleared on every exit path so runtime callers\n // keep querying the live catalog (never a process-global cache).\n this.operations.clearInitSchemaSnapshot();\n }\n }\n\n async close(): Promise<void> {\n await this.pool.end();\n }\n}\n\n/**\n * All storage domain classes that provide static getExportDDL methods.\n */\nconst ALL_DOMAINS = [\n MemoryMySQL,\n KnowledgeMySQL,\n ObservabilityMySQL,\n ScoresMySQL,\n ScorerDefinitionsMySQL,\n PromptBlocksMySQL,\n AgentsMySQL,\n WorkflowsMySQL,\n WorkflowDefinitionsMySQL,\n DatasetsMySQL,\n ExperimentsMySQL,\n BackgroundTasksMySQL,\n FavoritesMySQL,\n ChannelsMySQL,\n SchedulesMySQL,\n] as const;\n\n/**\n * Exports the Mastra database schema as MySQL DDL statements.\n * Does not require a database connection.\n */\nexport function exportSchemas(): string {\n const statements: string[] = [];\n\n for (const Domain of ALL_DOMAINS) {\n statements.push(...Domain.getExportDDL());\n }\n\n return statements.join('\\n');\n}\n"],"mappings":"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"}