@mastra/cloudflare-d1 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +21 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +21 -15
- package/dist/index.js.map +1 -1
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/sql-builder.ts","../src/storage/db/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["parseSqlIdentifier","Cloudflare","MastraBase","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","getSqlType","getDefaultValue","TABLE_WORKFLOW_SNAPSHOT","MemoryStorage","TABLE_THREADS","TABLE_SCHEMAS","TABLE_MESSAGES","TABLE_RESOURCES","ensureDate","normalizePerPage","calculatePagination","MessageList","serializeDate","list","coreTransformScoreRow","ScoresStorage","TABLE_SCORERS","saveScorePayloadSchema","WorkflowsStorage","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["export function isArrayOfRecords(value: any): value is Record<string, any>[] {\n return value && Array.isArray(value) && value.length > 0;\n}\n\nexport function deserializeValue(value: any, type?: string): any {\n if (value === null || value === undefined) return null;\n\n if (type === 'date' && typeof value === 'string') {\n return new Date(value);\n }\n\n if (type === 'jsonb' && typeof value === 'string') {\n try {\n return JSON.parse(value) as Record<string, any>;\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string' && (value.startsWith('{') || value.startsWith('['))) {\n try {\n return JSON.parse(value) as Record<string, any>;\n } catch {\n return value;\n }\n }\n\n return value;\n}\n","import { parseSqlIdentifier } from '@mastra/core/utils';\n\n/**\n * Type definition for SQL query parameters\n */\nexport type SqlParam = string | number | boolean | null | undefined;\n\n/**\n * Interface for SQL query options with generic type support\n */\nexport interface SqlQueryOptions {\n /** SQL query to execute */\n sql: string;\n /** Parameters to bind to the query */\n params?: SqlParam[];\n /** Whether to return only the first result */\n first?: boolean;\n}\n\n/**\n * SQL Builder class for constructing type-safe SQL queries\n * This helps create maintainable and secure SQL queries with proper parameter handling\n */\nexport class SqlBuilder {\n private sql: string = '';\n private params: SqlParam[] = [];\n private whereAdded: boolean = false;\n\n // Basic query building\n select(columns?: string | string[]): SqlBuilder {\n if (!columns || (Array.isArray(columns) && columns.length === 0)) {\n this.sql = 'SELECT *';\n } else {\n const cols = Array.isArray(columns) ? columns : [columns];\n const parsedCols = cols.map(col => parseSelectIdentifier(col));\n this.sql = `SELECT ${parsedCols.join(', ')}`;\n }\n return this;\n }\n\n from(table: string): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n this.sql += ` FROM ${parsedTableName}`;\n return this;\n }\n\n /**\n * Add a WHERE clause to the query\n * @param condition The condition to add\n * @param params Parameters to bind to the condition\n */\n where(condition: string, ...params: SqlParam[]): SqlBuilder {\n this.sql += ` WHERE ${condition}`;\n this.params.push(...params);\n this.whereAdded = true;\n return this;\n }\n\n /**\n * Add a WHERE clause if it hasn't been added yet, otherwise add an AND clause\n * @param condition The condition to add\n * @param params Parameters to bind to the condition\n */\n whereAnd(condition: string, ...params: SqlParam[]): SqlBuilder {\n if (this.whereAdded) {\n return this.andWhere(condition, ...params);\n } else {\n return this.where(condition, ...params);\n }\n }\n\n andWhere(condition: string, ...params: SqlParam[]): SqlBuilder {\n this.sql += ` AND ${condition}`;\n this.params.push(...params);\n return this;\n }\n\n orWhere(condition: string, ...params: SqlParam[]): SqlBuilder {\n this.sql += ` OR ${condition}`;\n this.params.push(...params);\n return this;\n }\n\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): SqlBuilder {\n const parsedColumn = parseSqlIdentifier(column, 'column name');\n if (!['ASC', 'DESC'].includes(direction)) {\n throw new Error(`Invalid sort direction: ${direction}`);\n }\n this.sql += ` ORDER BY ${parsedColumn} ${direction}`;\n return this;\n }\n\n limit(count: number): SqlBuilder {\n this.sql += ` LIMIT ?`;\n this.params.push(count);\n return this;\n }\n\n offset(count: number): SqlBuilder {\n this.sql += ` OFFSET ?`;\n this.params.push(count);\n return this;\n }\n\n count(): SqlBuilder {\n this.sql += 'SELECT COUNT(*) AS count';\n return this;\n }\n\n /**\n * Insert a row, or update specific columns on conflict (upsert).\n * @param table Table name\n * @param columns Columns to insert\n * @param values Values to insert\n * @param conflictColumns Columns to check for conflict (usually PK or UNIQUE)\n * @param updateMap Object mapping columns to update to their new value (e.g. { name: 'excluded.name' })\n */\n insert(\n table: string,\n columns: string[],\n values: SqlParam[],\n conflictColumns?: string[],\n updateMap?: Record<string, string>,\n ): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n const parsedColumns = columns.map(col => parseSqlIdentifier(col, 'column name'));\n const placeholders = parsedColumns.map(() => '?').join(', ');\n\n if (conflictColumns && updateMap) {\n const parsedConflictColumns = conflictColumns.map(col => parseSqlIdentifier(col, 'column name'));\n const updateClause = Object.entries(updateMap)\n .map(([col, expr]) => `${col} = ${expr}`)\n .join(', ');\n this.sql = `INSERT INTO ${parsedTableName} (${parsedColumns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${parsedConflictColumns.join(', ')}) DO UPDATE SET ${updateClause}`;\n this.params.push(...values);\n return this;\n }\n\n this.sql = `INSERT INTO ${parsedTableName} (${parsedColumns.join(', ')}) VALUES (${placeholders})`;\n this.params.push(...values);\n\n return this;\n }\n\n // Update operations\n update(table: string, columns: string[], values: SqlParam[]): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n const parsedColumns = columns.map(col => parseSqlIdentifier(col, 'column name'));\n const setClause = parsedColumns.map(col => `${col} = ?`).join(', ');\n this.sql = `UPDATE ${parsedTableName} SET ${setClause}`;\n this.params.push(...values);\n return this;\n }\n\n // Delete operations\n delete(table: string): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n this.sql = `DELETE FROM ${parsedTableName}`;\n return this;\n }\n\n /**\n * Create a table if it doesn't exist\n * @param table The table name\n * @param columnDefinitions The column definitions as an array of strings\n * @param tableConstraints Optional constraints for the table\n * @returns The builder instance\n */\n createTable(table: string, columnDefinitions: string[], tableConstraints?: string[]): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n // Naive validation: check the first word of each column definition\n const parsedColumnDefinitions = columnDefinitions.map(def => {\n const colName = def.split(/\\s+/)[0];\n if (!colName) throw new Error('Empty column name in definition');\n parseSqlIdentifier(colName, 'column name');\n return def;\n });\n const columns = parsedColumnDefinitions.join(', ');\n const constraints = tableConstraints && tableConstraints.length > 0 ? ', ' + tableConstraints.join(', ') : '';\n this.sql = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (${columns}${constraints})`;\n return this;\n }\n\n /**\n * Check if an index exists in the database\n * @param indexName The name of the index to check\n * @param tableName The table the index is on\n * @returns The builder instance\n */\n checkIndexExists(indexName: string, tableName: string): SqlBuilder {\n this.sql = `SELECT name FROM sqlite_master WHERE type='index' AND name=? AND tbl_name=?`;\n this.params.push(indexName, tableName);\n return this;\n }\n\n /**\n * Create an index if it doesn't exist\n * @param indexName The name of the index to create\n * @param tableName The table to create the index on\n * @param columnName The column to index\n * @param indexType Optional index type (e.g., 'UNIQUE')\n * @returns The builder instance\n */\n createIndex(indexName: string, tableName: string, columnName: string, indexType: string = ''): SqlBuilder {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n this.sql = `CREATE ${indexType ? indexType + ' ' : ''}INDEX IF NOT EXISTS ${parsedIndexName} ON ${parsedTableName}(${parsedColumnName})`;\n return this;\n }\n\n /**\n * Add a LIKE condition to the query\n * @param column The column to check\n * @param value The value to match (will be wrapped with % for LIKE)\n * @param exact If true, will not add % wildcards\n */\n like(column: string, value: string, exact: boolean = false): SqlBuilder {\n const parsedColumnName = parseSqlIdentifier(column, 'column name');\n const likeValue = exact ? value : `%${value}%`;\n if (this.whereAdded) {\n this.sql += ` AND ${parsedColumnName} LIKE ?`;\n } else {\n this.sql += ` WHERE ${parsedColumnName} LIKE ?`;\n this.whereAdded = true;\n }\n this.params.push(likeValue);\n return this;\n }\n\n /**\n * Add a JSON LIKE condition for searching in JSON fields\n * @param column The JSON column to search in\n * @param key The JSON key to match\n * @param value The value to match\n */\n jsonLike(column: string, key: string, value: string): SqlBuilder {\n const parsedColumnName = parseSqlIdentifier(column, 'column name');\n const parsedKey = parseSqlIdentifier(key, 'key name');\n const jsonPattern = `%\"${parsedKey}\":\"${value}\"%`;\n if (this.whereAdded) {\n this.sql += ` AND ${parsedColumnName} LIKE ?`;\n } else {\n this.sql += ` WHERE ${parsedColumnName} LIKE ?`;\n this.whereAdded = true;\n }\n this.params.push(jsonPattern);\n return this;\n }\n\n /**\n * Get the built query\n * @returns Object containing the SQL string and parameters array\n */\n build(): { sql: string; params: SqlParam[] } {\n return {\n sql: this.sql,\n params: this.params,\n };\n }\n\n /**\n * Reset the builder for reuse\n * @returns The reset builder instance\n */\n reset(): SqlBuilder {\n this.sql = '';\n this.params = [];\n this.whereAdded = false;\n return this;\n }\n}\n\n// Factory function for easier creation\nexport function createSqlBuilder(): SqlBuilder {\n return new SqlBuilder();\n}\n\n/** Represents a validated SQL SELECT column identifier (or '*', optionally with 'AS alias'). */\ntype SelectIdentifier = string & { __brand: 'SelectIdentifier' };\n\nconst SQL_IDENTIFIER_PATTERN = /^[a-zA-Z0-9_]+(\\s+AS\\s+[a-zA-Z0-9_]+)?$/;\n\n/**\n * Parses and returns a valid SQL SELECT column identifier.\n * Allows a single identifier (letters, numbers, underscores), or '*', optionally with 'AS alias'.\n *\n * @param column - The column identifier string to parse.\n * @returns The validated column identifier as a branded type.\n * @throws {Error} If invalid.\n *\n * @example\n * const col = parseSelectIdentifier('user_id'); // Ok\n * parseSelectIdentifier('user_id AS uid'); // Ok\n * parseSelectIdentifier('*'); // Ok\n * parseSelectIdentifier('user id'); // Throws error\n */\nexport function parseSelectIdentifier(column: string): SelectIdentifier {\n if (column !== '*' && !SQL_IDENTIFIER_PATTERN.test(column)) {\n throw new Error(\n `Invalid column name: \"${column}\". Must be \"*\" or a valid identifier (letters, numbers, underscores), optionally with \"AS alias\".`,\n );\n }\n return column as SelectIdentifier;\n}\n","import type { D1Database } from '@cloudflare/workers-types';\nimport { MastraBase } from '@mastra/core/base';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, getDefaultValue, getSqlType, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport Cloudflare from 'cloudflare';\nimport { deserializeValue } from '../domains/utils';\nimport { createSqlBuilder } from '../sql-builder';\nimport type { SqlParam, SqlQueryOptions } from '../sql-builder';\n\nexport type D1QueryResult = Awaited<ReturnType<Cloudflare['d1']['database']['query']>>['result'];\n\nexport interface D1Client {\n query(args: { sql: string; params: string[] }): Promise<{ result: D1QueryResult }>;\n}\n\nexport interface D1DBConfig {\n client?: D1Client;\n binding?: D1Database;\n tablePrefix?: string;\n}\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing D1 client or binding\n * 2. Config to create a new client internally\n */\nexport type D1DomainConfig = D1DomainClientConfig | D1DomainBindingConfig | D1DomainRestConfig;\n\n/**\n * Pass an existing D1 client (REST API)\n */\nexport interface D1DomainClientConfig {\n client: D1Client;\n tablePrefix?: string;\n}\n\n/**\n * Pass an existing D1 binding (Workers API)\n */\nexport interface D1DomainBindingConfig {\n binding: D1Database;\n tablePrefix?: string;\n}\n\n/**\n * Pass config to create a new D1 client internally (REST API)\n */\nexport interface D1DomainRestConfig {\n accountId: string;\n apiToken: string;\n databaseId: string;\n tablePrefix?: string;\n}\n\n/**\n * Resolves D1DomainConfig to D1DBConfig.\n * Handles creating a new D1 client if apiToken is provided.\n */\nexport function resolveD1Config(config: D1DomainConfig): D1DBConfig {\n // Existing client\n if ('client' in config) {\n return {\n client: config.client,\n tablePrefix: config.tablePrefix,\n };\n }\n\n // Existing binding\n if ('binding' in config) {\n return {\n binding: config.binding,\n tablePrefix: config.tablePrefix,\n };\n }\n\n // Config to create new client (REST API)\n const cfClient = new Cloudflare({ apiToken: config.apiToken });\n return {\n client: {\n query: ({ sql, params }) => {\n return cfClient.d1.database.query(config.databaseId, {\n account_id: config.accountId,\n sql,\n params,\n });\n },\n },\n tablePrefix: config.tablePrefix,\n };\n}\n\nexport class D1DB extends MastraBase {\n private client?: D1Client;\n private binding?: D1Database;\n private tablePrefix: string;\n\n /** Cache of actual table columns: tableName -> Promise<Set<columnName>> (stores in-flight promise to coalesce concurrent calls) */\n private tableColumnsCache = new Map<string, Promise<Set<string>>>();\n\n constructor(config: D1DBConfig) {\n super({\n component: 'STORAGE',\n name: 'D1_DB',\n });\n this.client = config.client;\n this.binding = config.binding;\n this.tablePrefix = config.tablePrefix || '';\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n // For D1/SQLite, use PRAGMA table_info to get column info\n // Handle both prefixed and non-prefixed table names\n const fullTableName = table.startsWith(this.tablePrefix) ? table : `${this.tablePrefix}${table}`;\n const sql = `PRAGMA table_info(${fullTableName});`;\n const result = await this.executeQuery({ sql, params: [] });\n if (!result || !Array.isArray(result)) return false;\n return result.some((col: any) => col.name === column || col.name === column.toLowerCase());\n }\n\n getTableName(tableName: TABLE_NAMES): string {\n return `${this.tablePrefix}${tableName}`;\n }\n\n private formatSqlParams(params: SqlParam[]): string[] {\n return params.map(p => (p === undefined || p === null ? null : p) as string);\n }\n\n private async executeWorkersBindingQuery({\n sql,\n params = [],\n first = false,\n }: SqlQueryOptions): Promise<Record<string, any>[] | Record<string, any> | null> {\n if (!this.binding) {\n throw new Error('Workers binding is not configured');\n }\n\n try {\n const statement = this.binding.prepare(sql);\n const formattedParams = this.formatSqlParams(params);\n\n let result;\n if (formattedParams.length > 0) {\n if (first) {\n result = await statement.bind(...formattedParams).first();\n if (!result) return null;\n return result;\n } else {\n result = await statement.bind(...formattedParams).all();\n const results = result.results || [];\n return results;\n }\n } else {\n if (first) {\n result = await statement.first();\n if (!result) return null;\n return result;\n } else {\n result = await statement.all();\n const results = result.results || [];\n return results;\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'WORKERS_BINDING_QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sql },\n },\n error,\n );\n }\n }\n\n private async executeRestQuery({\n sql,\n params = [],\n first = false,\n }: SqlQueryOptions): Promise<Record<string, any>[] | Record<string, any> | null> {\n if (!this.client) {\n throw new Error('D1 client is not configured');\n }\n\n try {\n const formattedParams = this.formatSqlParams(params);\n const response = await this.client.query({\n sql,\n params: formattedParams,\n });\n const result = response.result || [];\n const results = result.flatMap(r => r.results || []);\n\n if (first) {\n return results[0] || null;\n }\n\n return results;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'REST_QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sql },\n },\n error,\n );\n }\n }\n\n async executeQuery(options: SqlQueryOptions): Promise<Record<string, any>[] | Record<string, any> | null> {\n if (this.binding) {\n return this.executeWorkersBindingQuery(options);\n } else if (this.client) {\n return this.executeRestQuery(options);\n } else {\n throw new Error('Neither binding nor client is configured');\n }\n }\n\n /**\n * Gets the set of column names that actually exist in the database table.\n * Results are cached; the cache is invalidated when alterTable() adds new columns.\n */\n private async getKnownColumnNames(tableName: string): Promise<Set<string>> {\n const cached = this.tableColumnsCache.get(tableName);\n if (cached) return cached;\n\n // Store the in-flight promise so concurrent callers (e.g. Promise.all in batch ops) await the same query\n const promise = this.getTableColumns(tableName).then(columns => {\n const names = new Set(columns.map(c => c.name));\n // If the query returned no columns, remove the cached promise so we retry next time\n if (names.size === 0) {\n this.tableColumnsCache.delete(tableName);\n }\n return names;\n });\n this.tableColumnsCache.set(tableName, promise);\n\n return promise;\n }\n\n /**\n * Filters a record to only include columns that exist in the actual database table.\n * Unknown columns are silently dropped to ensure forward compatibility.\n */\n private async filterRecordToKnownColumns(\n tableName: string,\n record: Record<string, any>,\n ): Promise<Record<string, any>> {\n const knownColumns = await this.getKnownColumnNames(tableName);\n if (knownColumns.size === 0) return record;\n\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n if (knownColumns.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n private async getTableColumns(tableName: string): Promise<{ name: string; type: string }[]> {\n try {\n const sql = `PRAGMA table_info(${tableName})`;\n const result = await this.executeQuery({ sql });\n\n if (!result || !Array.isArray(result)) {\n return [];\n }\n\n return result.map(row => ({\n name: row.name as string,\n type: row.type as string,\n }));\n } catch (error) {\n this.logger.warn(`Failed to get table columns for ${tableName}:`, error);\n return [];\n }\n }\n\n private serializeValue(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return value;\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'bigint':\n return 'INTEGER'; // SQLite uses INTEGER for all integer sizes\n case 'jsonb':\n return 'TEXT'; // Store JSON as TEXT in SQLite\n case 'boolean':\n return 'INTEGER'; // SQLite uses 0/1 for booleans\n default:\n return getSqlType(type);\n }\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n return getDefaultValue(type);\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const fullTableName = this.getTableName(tableName);\n\n // Build SQL columns from schema\n const columnDefinitions = Object.entries(schema).map(([colName, colDef]) => {\n const type = this.getSqlType(colDef.type);\n const nullable = colDef.nullable === false ? 'NOT NULL' : '';\n const primaryKey = colDef.primaryKey ? 'PRIMARY KEY' : '';\n return `${colName} ${type} ${nullable} ${primaryKey}`.trim();\n });\n\n // Add table-level constraints if needed\n const tableConstraints: string[] = [];\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n tableConstraints.push('UNIQUE (workflow_name, run_id)');\n }\n\n const query = createSqlBuilder().createTable(fullTableName, columnDefinitions, tableConstraints);\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n this.logger.debug(`Created table ${fullTableName}`);\n this.tableColumnsCache.delete(fullTableName);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const fullTableName = this.getTableName(tableName);\n const query = createSqlBuilder().delete(fullTableName);\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n this.logger.debug(`Cleared table ${fullTableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const fullTableName = this.getTableName(tableName);\n try {\n const sql = `DROP TABLE IF EXISTS ${fullTableName}`;\n await this.executeQuery({ sql });\n this.logger.debug(`Dropped table ${fullTableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(fullTableName);\n }\n }\n\n async alterTable(args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n const fullTableName = this.getTableName(args.tableName);\n\n try {\n const existingColumns = await this.getTableColumns(fullTableName);\n const existingColumnNames = new Set(existingColumns.map(col => col.name));\n\n for (const [columnName, column] of Object.entries(args.schema)) {\n if (!existingColumnNames.has(columnName) && args.ifNotExists.includes(columnName)) {\n const sqlType = this.getSqlType(column.type);\n const defaultValue = this.getDefaultValue(column.type);\n const sql = `ALTER TABLE ${fullTableName} ADD COLUMN ${columnName} ${sqlType} ${defaultValue}`;\n await this.executeQuery({ sql });\n this.logger.debug(`Added column ${columnName} to table ${fullTableName}`);\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName: args.tableName },\n },\n error,\n );\n } finally {\n // Invalidate cached columns after DDL completes so concurrent writers see the new schema\n this.tableColumnsCache.delete(fullTableName);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const fullTableName = this.getTableName(tableName);\n const processedRecord = await this.processRecord(record);\n // Filter out columns that don't exist in the actual database table\n const filteredRecord = await this.filterRecordToKnownColumns(fullTableName, processedRecord);\n const columns = Object.keys(filteredRecord);\n if (columns.length === 0) return; // No known columns after filtering - skip insert\n const values = Object.values(filteredRecord);\n\n const query = createSqlBuilder().insert(fullTableName, columns, values);\n const { sql, params } = query.build();\n\n await this.executeQuery({ sql, params });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', '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 try {\n if (records.length === 0) return;\n\n const fullTableName = this.getTableName(tableName);\n const processedRecords = await Promise.all(records.map(record => this.processRecord(record)));\n // Filter out columns that don't exist in the actual database table\n const filteredRecords = await Promise.all(\n processedRecords.map(r => this.filterRecordToKnownColumns(fullTableName, r)),\n );\n\n // For batch insert, we need to create multiple INSERT statements\n // Derive columns per-record and skip empty records\n for (const record of filteredRecords) {\n const columns = Object.keys(record);\n if (columns.length === 0) continue; // Skip records with no known columns\n const values = Object.values(record);\n const query = createSqlBuilder().insert(fullTableName, columns, values);\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const fullTableName = this.getTableName(tableName);\n const query = createSqlBuilder().select('*').from(fullTableName);\n\n // Add WHERE conditions for each key\n let firstKey = true;\n for (const [key, value] of Object.entries(keys)) {\n if (firstKey) {\n query.where(`${key} = ?`, value);\n firstKey = false;\n } else {\n query.andWhere(`${key} = ?`, value);\n }\n }\n\n query.orderBy('createdAt', 'DESC');\n\n query.limit(1);\n const { sql, params } = query.build();\n\n const result = await this.executeQuery({ sql, params, first: true });\n\n if (!result) {\n return null;\n }\n\n // Deserialize JSON fields\n const deserializedResult: Record<string, any> = {};\n for (const [key, value] of Object.entries(result)) {\n deserializedResult[key] = deserializeValue(value);\n }\n\n return deserializedResult as R;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async processRecord(record: Record<string, any>): Promise<Record<string, any>> {\n const processed: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n processed[key] = this.serializeValue(value);\n }\n return processed;\n }\n\n /**\n * Upsert multiple records in a batch operation\n * @param tableName The table to insert into\n * @param records The records to insert\n */\n async batchUpsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n\n const fullTableName = this.getTableName(tableName);\n\n try {\n // Process records in batches for better performance\n const batchSize = 50; // Adjust based on performance testing\n\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n\n const recordsToInsert = batch;\n\n // Filter out columns that don't exist in the actual database table\n if (recordsToInsert.length > 0) {\n const filteredRecords = await Promise.all(\n recordsToInsert.map(r => this.filterRecordToKnownColumns(fullTableName, r || {})),\n );\n\n // Create a bulk insert statement - derive columns per-record and skip empties\n for (const record of filteredRecords) {\n const columns = Object.keys(record);\n if (columns.length === 0) continue; // Skip records with no known columns\n\n const values = columns.map(col => {\n const value = record[col];\n return this.serializeValue(value);\n });\n\n const recordToUpsert = columns.reduce(\n (acc, col) => {\n if (col !== 'createdAt') acc[col] = `excluded.${col}`;\n return acc;\n },\n {} as Record<string, any>,\n );\n\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['id'], recordToUpsert);\n\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n }\n }\n\n this.logger.debug(\n `Processed batch ${Math.floor(i / batchSize) + 1} of ${Math.ceil(records.length / batchSize)}`,\n );\n }\n\n this.logger.debug(`Successfully batch upserted ${records.length} records into ${tableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'BATCH_UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to batch upsert into ${tableName}: ${error instanceof Error ? error.message : String(error)}`,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n createStorageErrorId,\n ensureDate,\n MemoryStorage,\n serializeDate,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCHEMAS,\n normalizePerPage,\n calculatePagination,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n} from '@mastra/core/storage';\nimport { D1DB, resolveD1Config } from '../../db';\nimport type { D1DomainConfig } from '../../db';\nimport { createSqlBuilder } from '../../sql-builder';\nimport { deserializeValue, isArrayOfRecords } from '../utils';\n\nexport class MemoryStorageD1 extends MemoryStorage {\n #db: D1DB;\n\n constructor(config: D1DomainConfig) {\n super();\n this.#db = new D1DB(resolveD1Config(config));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const resource = await this.#db.load<StorageResourceType>({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n\n if (!resource) return null;\n\n try {\n return {\n ...resource,\n createdAt: ensureDate(resource.createdAt) as Date,\n updatedAt: ensureDate(resource.updatedAt) as Date,\n metadata:\n typeof resource.metadata === 'string'\n ? (JSON.parse(resource.metadata || '{}') as Record<string, any>)\n : resource.metadata,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Error processing resource ${resourceId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { resourceId },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return null;\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n const fullTableName = this.#db.getTableName(TABLE_RESOURCES);\n\n // Prepare the record for SQL insertion\n const resourceToSave = {\n id: resource.id,\n workingMemory: resource.workingMemory,\n metadata: resource.metadata ? JSON.stringify(resource.metadata) : null,\n createdAt: resource.createdAt,\n updatedAt: resource.updatedAt,\n };\n\n // Process record for SQL insertion\n const processedRecord = await this.#db.processRecord(resourceToSave);\n\n const columns = Object.keys(processedRecord);\n const values = Object.values(processedRecord);\n\n // Specify which columns to update on conflict (all except id)\n const updateMap: Record<string, string> = {\n workingMemory: 'excluded.workingMemory',\n metadata: 'excluded.metadata',\n createdAt: 'excluded.createdAt',\n updatedAt: 'excluded.updatedAt',\n };\n\n // Use the new insert method with ON CONFLICT\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['id'], updateMap);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to save resource to ${fullTableName}: ${error instanceof Error ? error.message : String(error)}`,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedAt = new Date();\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt,\n };\n\n const fullTableName = this.#db.getTableName(TABLE_RESOURCES);\n\n const columns = ['workingMemory', 'metadata', 'updatedAt'];\n const values = [updatedResource.workingMemory, JSON.stringify(updatedResource.metadata), updatedAt.toISOString()];\n\n const query = createSqlBuilder().update(fullTableName, columns, values).where('id = ?', resourceId);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to update resource ${resourceId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n const thread = await this.#db.load<StorageThreadType>({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!thread) return null;\n\n try {\n return {\n ...thread,\n createdAt: ensureDate(thread.createdAt) as Date,\n updatedAt: ensureDate(thread.updatedAt) as Date,\n metadata:\n typeof thread.metadata === 'string'\n ? (JSON.parse(thread.metadata || '{}') as Record<string, any>)\n : thread.metadata || {},\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Error processing thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return null;\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n const mapRowToStorageThreadType = (row: Record<string, any>): StorageThreadType => ({\n ...(row as StorageThreadType),\n createdAt: ensureDate(row.createdAt) as Date,\n updatedAt: ensureDate(row.updatedAt) as Date,\n metadata:\n typeof row.metadata === 'string'\n ? (JSON.parse(row.metadata || '{}') as Record<string, any>)\n : row.metadata || {},\n });\n\n try {\n let countQuery = createSqlBuilder().count().from(fullTableName);\n let selectQuery = createSqlBuilder().select('*').from(fullTableName);\n\n // Add resourceId filter if provided\n if (filter?.resourceId) {\n countQuery = countQuery.whereAnd('resourceId = ?', filter.resourceId);\n selectQuery = selectQuery.whereAnd('resourceId = ?', filter.resourceId);\n }\n\n // Add metadata filters if provided (AND logic)\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n // Validate filter value type - only allow scalar types\n if (value !== null && typeof value === 'object') {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'INVALID_METADATA_VALUE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Metadata filter value for key \"${key}\" must be a scalar type (string, number, boolean, or null), got ${Array.isArray(value) ? 'array' : 'object'}`,\n details: { key, valueType: Array.isArray(value) ? 'array' : 'object' },\n },\n new Error('Invalid metadata filter value type'),\n );\n }\n\n // Handle null values specially: json_extract returns NULL for null values,\n // and NULL = NULL evaluates to NULL (not true) in SQL\n if (value === null) {\n const condition = `json_extract(metadata, '$.${key}') IS NULL`;\n countQuery = countQuery.whereAnd(condition);\n selectQuery = selectQuery.whereAnd(condition);\n } else {\n // json_extract returns the raw value (unquoted for strings, native for numbers/booleans)\n // Pass native values directly so SQLite compares types correctly\n const condition = `json_extract(metadata, '$.${key}') = ?`;\n // Type assertion is safe here because we've validated above that value is a scalar type\n const filterValue = value as string | number | boolean;\n countQuery = countQuery.whereAnd(condition, filterValue);\n selectQuery = selectQuery.whereAnd(condition, filterValue);\n }\n }\n }\n\n const countResult = (await this.#db.executeQuery(countQuery.build())) as {\n count: number;\n }[];\n const total = Number(countResult?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n selectQuery = selectQuery.orderBy(field, direction).limit(limitValue).offset(offset);\n\n const results = (await this.#db.executeQuery(selectQuery.build())) as Record<string, any>[];\n const threads = results.map(mapRowToStorageThreadType);\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n throw error;\n }\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Error listing threads: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n // Prepare the record for SQL insertion\n const threadToSave = {\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.toISOString(),\n updatedAt: thread.updatedAt.toISOString(),\n };\n\n // Process record for SQL insertion\n const processedRecord = await this.#db.processRecord(threadToSave);\n\n const columns = Object.keys(processedRecord);\n const values = Object.values(processedRecord);\n\n // Specify which columns to update on conflict (all except id)\n const updateMap: Record<string, string> = {\n resourceId: 'excluded.resourceId',\n title: 'excluded.title',\n metadata: 'excluded.metadata',\n createdAt: 'excluded.createdAt',\n updatedAt: 'excluded.updatedAt',\n };\n\n // Use the new insert method with ON CONFLICT\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['id'], updateMap);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to save thread to ${fullTableName}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const thread = await this.getThreadById({ threadId: id });\n try {\n if (!thread) {\n throw new Error(`Thread ${id} not found`);\n }\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n const mergedMetadata = {\n ...(typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata),\n ...(metadata as Record<string, any>),\n };\n\n const updatedAt = new Date();\n const columns = ['title', 'metadata', 'updatedAt'];\n const values = [title, JSON.stringify(mergedMetadata), updatedAt.toISOString()];\n\n const query = createSqlBuilder().update(fullTableName, columns, values).where('id = ?', id);\n\n const { sql, params } = query.build();\n\n await this.#db.executeQuery({ sql, params });\n\n return {\n ...thread,\n title,\n metadata: {\n ...(typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata),\n ...(metadata as Record<string, any>),\n },\n updatedAt,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to update thread ${id}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId: id },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n try {\n // Delete the thread\n const deleteThreadQuery = createSqlBuilder().delete(fullTableName).where('id = ?', threadId);\n\n const { sql: threadSql, params: threadParams } = deleteThreadQuery.build();\n await this.#db.executeQuery({ sql: threadSql, params: threadParams });\n\n // Also delete associated messages\n const messagesTableName = this.#db.getTableName(TABLE_MESSAGES);\n const deleteMessagesQuery = createSqlBuilder().delete(messagesTableName).where('thread_id = ?', threadId);\n\n const { sql: messagesSql, params: messagesParams } = deleteMessagesQuery.build();\n await this.#db.executeQuery({ sql: messagesSql, params: messagesParams });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to delete thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages: [] };\n\n try {\n const now = new Date();\n const threadId = messages[0]?.threadId;\n\n // Validate all messages before insert\n for (const [i, message] of messages.entries()) {\n if (!message.id) throw new Error(`Message at index ${i} missing id`);\n if (!message.threadId) {\n throw new Error(`Message at index ${i} missing threadId`);\n }\n if (!message.content) {\n throw new Error(`Message at index ${i} missing content`);\n }\n if (!message.role) {\n throw new Error(`Message at index ${i} missing role`);\n }\n if (!message.resourceId) {\n throw new Error(`Message at index ${i} missing resourceId`);\n }\n const thread = await this.getThreadById({ threadId: message.threadId });\n if (!thread) {\n throw new Error(`Thread ${message.threadId} not found`);\n }\n }\n\n // Prepare all messages for insertion (set timestamps, thread_id, etc.)\n const messagesToInsert = messages.map(message => {\n const createdAt = message.createdAt ? new Date(message.createdAt) : now;\n return {\n id: message.id,\n thread_id: message.threadId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: createdAt.toISOString(),\n role: message.role,\n type: message.type || 'v2',\n resourceId: message.resourceId,\n };\n });\n\n // Insert messages and update thread's updatedAt in parallel\n await Promise.all([\n this.#db.batchUpsert({\n tableName: TABLE_MESSAGES,\n records: messagesToInsert,\n }),\n // Update thread's updatedAt timestamp\n this.#db.executeQuery({\n sql: `UPDATE ${this.#db.getTableName(TABLE_THREADS)} SET updatedAt = ? WHERE id = ?`,\n params: [now.toISOString(), threadId],\n }),\n ]);\n\n this.logger.debug(`Saved ${messages.length} messages`);\n const list = new MessageList().add(messages, 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to save messages: ${error instanceof Error ? error.message : String(error)}`,\n },\n error,\n );\n }\n }\n\n private _sortMessages(messages: MastraDBMessage[], field: string, direction: string): MastraDBMessage[] {\n return messages.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 (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\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\n private async _getIncludedMessages(include: StorageListMessagesInput['include']) {\n if (!include || include.length === 0) return null;\n\n const tableName = this.#db.getTableName(TABLE_MESSAGES);\n\n // Phase 1: Batch-fetch metadata for all target messages in a single query.\n // This eliminates the correlated subselects that previously ran per-subquery.\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 targetResult = await this.#db.executeQuery({\n sql: `SELECT id, thread_id, createdAt FROM ${tableName} WHERE id IN (${idPlaceholders})`,\n params: targetIds,\n });\n\n if (!Array.isArray(targetResult) || targetResult.length === 0) return null;\n\n const targetMap = new Map(\n targetResult.map((r: any) => [r.id as string, { threadId: r.thread_id as string, createdAt: r.createdAt }]),\n );\n\n // Phase 2: Build cursor-based subqueries using materialized constants from Phase 1.\n // Uses createdAt directly so the (thread_id, createdAt) index covers the query.\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 // Fetch the target message itself plus previous messages.\n // Wrap in SELECT * FROM (...) because SQLite does not allow ORDER BY\n // inside compound-select members (UNION ALL) directly.\n unionQueries.push(`SELECT * FROM (\n SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId\n FROM ${tableName}\n WHERE thread_id = ?\n AND createdAt <= ?\n ORDER BY createdAt DESC, id DESC\n LIMIT ?\n )`);\n params.push(target.threadId, target.createdAt, withPreviousMessages + 1);\n\n // Fetch messages after the target (only if requested)\n if (withNextMessages > 0) {\n unionQueries.push(`SELECT * FROM (\n SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId\n FROM ${tableName}\n WHERE thread_id = ?\n AND createdAt > ?\n ORDER BY createdAt ASC, id ASC\n LIMIT ?\n )`);\n params.push(target.threadId, target.createdAt, withNextMessages);\n }\n }\n\n if (unionQueries.length === 0) return null;\n\n let finalQuery: string;\n if (unionQueries.length === 1) {\n finalQuery = unionQueries[0]!;\n } else {\n finalQuery = `${unionQueries.join(' UNION ALL ')} ORDER BY createdAt ASC, id ASC`;\n }\n const messages = await this.#db.executeQuery({ sql: finalQuery, params });\n\n if (!Array.isArray(messages)) {\n return [];\n }\n\n // Parse message content and deduplicate\n const seen = new Set<string>();\n const processedMessages = messages\n .filter((message: Record<string, any>) => {\n const id = message.id as string;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n })\n .map((message: Record<string, any>) => {\n const processedMsg: Record<string, any> = {};\n for (const [key, value] of Object.entries(message)) {\n if (key === `type` && value === `v2`) continue;\n processedMsg[key] = deserializeValue(value);\n }\n return processedMsg;\n });\n\n return processedMessages;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n const fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n const messages: any[] = [];\n\n try {\n const query = createSqlBuilder()\n .select(['id', 'content', 'role', 'type', 'createdAt', 'thread_id AS threadId', 'resourceId'])\n .from(fullTableName)\n .where(`id in (${messageIds.map(() => '?').join(',')})`, ...messageIds);\n\n query.orderBy('createdAt', 'DESC');\n\n const { sql, params } = query.build();\n\n const result = await this.#db.executeQuery({ sql, params });\n\n if (Array.isArray(result)) messages.push(...result);\n\n // Parse message content\n const processedMessages = messages.map(message => {\n const processedMsg: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(message)) {\n if (key === `type` && value === `v2`) continue;\n processedMsg[key] = deserializeValue(value);\n }\n\n return processedMsg;\n });\n this.logger.debug(`Retrieved ${messages.length} messages`);\n const list = new MessageList().add(processedMessages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to retrieve messages by ID: ${error instanceof Error ? error.message : String(error)}`,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? threadId.join(',') : threadId },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', '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 fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n let query = `\n SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId\n FROM ${fullTableName}\n WHERE thread_id = ?\n `;\n const queryParams: any[] = [threadId];\n\n if (resourceId) {\n query += ` AND resourceId = ?`;\n queryParams.push(resourceId);\n }\n\n const dateRange = filter?.dateRange;\n if (dateRange?.start) {\n const startDate =\n dateRange.start instanceof Date ? serializeDate(dateRange.start) : serializeDate(new Date(dateRange.start));\n const startOp = dateRange.startExclusive ? '>' : '>=';\n query += ` AND createdAt ${startOp} ?`;\n queryParams.push(startDate);\n }\n\n if (dateRange?.end) {\n const endDate =\n dateRange.end instanceof Date ? serializeDate(dateRange.end) : serializeDate(new Date(dateRange.end));\n const endOp = dateRange.endExclusive ? '<' : '<=';\n query += ` AND createdAt ${endOp} ?`;\n queryParams.push(endDate);\n }\n\n // Build ORDER BY clause\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // When perPage is 0 with no includes, there's nothing to return.\n if (perPage === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // When perPage is 0 and we have include targets, skip COUNT and data queries.\n // This is the semantic recall path where we only need the included messages.\n if (perPage === 0 && include && include.length > 0) {\n const includeResult = await this._getIncludedMessages(include);\n if (!Array.isArray(includeResult) || includeResult.length === 0) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n const list = new MessageList().add(includeResult as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return {\n messages: this._sortMessages(list.get.all.db(), field, direction),\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n query += ` ORDER BY \"${field}\" ${direction}`;\n\n // Apply pagination\n if (perPage !== Number.MAX_SAFE_INTEGER) {\n query += ` LIMIT ? OFFSET ?`;\n queryParams.push(perPage, offset);\n }\n\n const results = await this.#db.executeQuery({ sql: query, params: queryParams });\n\n // Parse message content\n const paginatedMessages = (isArrayOfRecords(results) ? results : []).map((message: Record<string, any>) => {\n const processedMsg: Record<string, any> = {};\n for (const [key, value] of Object.entries(message)) {\n if (key === `type` && value === `v2`) continue;\n processedMsg[key] = deserializeValue(value);\n }\n return processedMsg;\n });\n\n const paginatedCount = paginatedMessages.length;\n\n // Get total count\n let countQuery = `SELECT count() as count FROM ${fullTableName} WHERE thread_id = ?`;\n const countParams: any[] = [threadId];\n\n if (resourceId) {\n countQuery += ` AND resourceId = ?`;\n countParams.push(resourceId);\n }\n\n if (dateRange?.start) {\n const startDate =\n dateRange.start instanceof Date ? serializeDate(dateRange.start) : serializeDate(new Date(dateRange.start));\n const startOp = dateRange.startExclusive ? '>' : '>=';\n countQuery += ` AND createdAt ${startOp} ?`;\n countParams.push(startDate);\n }\n\n if (dateRange?.end) {\n const endDate =\n dateRange.end instanceof Date ? serializeDate(dateRange.end) : serializeDate(new Date(dateRange.end));\n const endOp = dateRange.endExclusive ? '<' : '<=';\n countQuery += ` AND createdAt ${endOp} ?`;\n countParams.push(endDate);\n }\n\n const countResult = (await this.#db.executeQuery({ sql: countQuery, params: countParams })) as {\n count: number;\n }[];\n const total = Number(countResult[0]?.count ?? 0);\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(paginatedMessages.map((m: Record<string, any>) => m.id as string));\n let includeMessages: MastraDBMessage[] = [];\n\n if (include && include.length > 0) {\n // Use the existing _getIncludedMessages helper, but adapt it for listMessages format\n const includeResult = (await this._getIncludedMessages(include)) as MastraDBMessage[];\n if (Array.isArray(includeResult)) {\n includeMessages = includeResult;\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n paginatedMessages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(paginatedMessages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n const finalMessages = this._sortMessages(list.get.all.db(), field, direction);\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const returnedThreadMessageIds = new Set(finalMessages.filter(m => m.threadId === threadId).map(m => m.id));\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore =\n perPageInput === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to list messages for thread ${Array.isArray(threadId) ? threadId.join(',') : threadId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async updateMessages(args: {\n messages: Partial<Omit<MastraDBMessage, 'createdAt'>> &\n {\n id: string;\n content?: {\n metadata?: MastraMessageContentV2['metadata'];\n content?: MastraMessageContentV2['content'];\n };\n }[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n this.logger.debug('Updating messages', { count: messages.length });\n\n if (!messages.length) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n const fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n const threadsTableName = this.#db.getTableName(TABLE_THREADS);\n\n try {\n // Get existing messages\n const placeholders = messageIds.map(() => '?').join(',');\n const selectQuery = `SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId FROM ${fullTableName} WHERE id IN (${placeholders})`;\n const existingMessages = (await this.#db.executeQuery({ sql: selectQuery, params: messageIds })) as any[];\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n // Parse content from string to object for merging\n const parsedExistingMessages = existingMessages.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg;\n });\n\n const threadIdsToUpdate = new Set<string>();\n const updateQueries: { sql: string; params: any[] }[] = [];\n\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (\n 'threadId' in updatePayload &&\n updatePayload.threadId &&\n updatePayload.threadId !== existingMessage.threadId\n ) {\n threadIdsToUpdate.add(updatePayload.threadId as string);\n }\n\n const setClauses: string[] = [];\n const values: any[] = [];\n\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content: merge in code, then update the whole field\n if (updatableFields.content) {\n const existingContent = existingMessage.content || {};\n const newContent = {\n ...existingContent,\n ...updatableFields.content,\n // Deep merge metadata if it exists on both\n ...(existingContent?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingContent.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n setClauses.push(`content = ?`);\n values.push(JSON.stringify(newContent));\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = key === 'threadId' ? 'thread_id' : key;\n setClauses.push(`${dbColumn} = ?`);\n values.push(updatableFields[key as keyof typeof updatableFields]);\n }\n }\n\n if (setClauses.length > 0) {\n values.push(id);\n const updateQuery = `UPDATE ${fullTableName} SET ${setClauses.join(', ')} WHERE id = ?`;\n updateQueries.push({ sql: updateQuery, params: values });\n }\n }\n\n // Execute all updates\n for (const query of updateQueries) {\n await this.#db.executeQuery(query);\n }\n\n // Update thread timestamps\n if (threadIdsToUpdate.size > 0) {\n const threadPlaceholders = Array.from(threadIdsToUpdate)\n .map(() => '?')\n .join(',');\n const threadUpdateQuery = `UPDATE ${threadsTableName} SET updatedAt = ? WHERE id IN (${threadPlaceholders})`;\n const threadUpdateParams = [new Date().toISOString(), ...Array.from(threadIdsToUpdate)];\n await this.#db.executeQuery({ sql: threadUpdateQuery, params: threadUpdateParams });\n }\n\n // Re-fetch updated messages\n const updatedMessages = (await this.#db.executeQuery({ sql: selectQuery, params: messageIds })) as any[];\n\n // Parse content back to objects\n return updatedMessages.map(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // ignore if not valid json\n }\n }\n return message;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messages.length },\n },\n error,\n );\n }\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (messageIds.length === 0) return;\n\n const fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n const threadsTableName = this.#db.getTableName(TABLE_THREADS);\n\n try {\n // Get unique thread IDs from messages before deleting\n const placeholders = messageIds.map(() => '?').join(',');\n const selectQuery = `SELECT DISTINCT thread_id FROM ${fullTableName} WHERE id IN (${placeholders})`;\n const threadResults = (await this.#db.executeQuery({ sql: selectQuery, params: messageIds })) as any[];\n const threadIds = threadResults.map((r: any) => r.thread_id).filter(Boolean);\n\n // Delete the messages\n const deleteQuery = createSqlBuilder()\n .delete(fullTableName)\n .where(`id IN (${placeholders})`, ...messageIds);\n const { sql, params } = deleteQuery.build();\n await this.#db.executeQuery({ sql, params });\n\n // Update thread timestamps for affected threads\n if (threadIds.length > 0) {\n const threadPlaceholders = threadIds.map(() => '?').join(',');\n const threadUpdateQuery = `UPDATE ${threadsTableName} SET updatedAt = ? WHERE id IN (${threadPlaceholders})`;\n const threadUpdateParams = [new Date().toISOString(), ...threadIds];\n await this.#db.executeQuery({ sql: threadUpdateQuery, params: threadUpdateParams });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n}\n","import { ErrorDomain, ErrorCategory, MastraError } from '@mastra/core/error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n ScoresStorage,\n TABLE_SCORERS,\n TABLE_SCHEMAS,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { D1DB, resolveD1Config } from '../../db';\nimport type { D1DomainConfig } from '../../db';\nimport { createSqlBuilder } from '../../sql-builder';\n\n/**\n * Cloudflare D1-specific score row transformation.\n * Uses Z-suffix timestamps (createdAtZ, updatedAtZ) when available.\n */\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row, {\n preferredTimestampFields: {\n createdAt: 'createdAtZ',\n updatedAt: 'updatedAtZ',\n },\n });\n}\n\nexport class ScoresStorageD1 extends ScoresStorage {\n #db: D1DB;\n\n constructor(config: D1DomainConfig) {\n super();\n this.#db = new D1DB(resolveD1Config(config));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n const query = createSqlBuilder().select('*').from(fullTableName).where('id = ?', id);\n const { sql, params } = query.build();\n\n const result = await this.#db.executeQuery({ sql, params, first: true });\n\n if (!result) {\n return null;\n }\n\n return transformScoreRow(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const id = crypto.randomUUID();\n\n try {\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Serialize all object values to JSON strings\n const serializedRecord: Record<string, any> = {};\n for (const [key, value] of Object.entries(parsedScore)) {\n if (value !== null && value !== undefined) {\n if (typeof value === 'object') {\n serializedRecord[key] = JSON.stringify(value);\n } else {\n serializedRecord[key] = value;\n }\n } else {\n serializedRecord[key] = null;\n }\n }\n\n const now = new Date();\n serializedRecord.id = id;\n serializedRecord.createdAt = now.toISOString();\n serializedRecord.updatedAt = now.toISOString();\n\n const columns = Object.keys(serializedRecord);\n const values = Object.values(serializedRecord);\n\n const query = createSqlBuilder().insert(fullTableName, columns, values);\n const { sql, params } = query.build();\n\n await this.#db.executeQuery({ sql, params });\n\n return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder().count().from(fullTableName).where('scorerId = ?', scorerId);\n if (entityId) {\n countQuery.andWhere('entityId = ?', entityId);\n }\n if (entityType) {\n countQuery.andWhere('entityType = ?', entityType);\n }\n if (source) {\n countQuery.andWhere('source = ?', source);\n }\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder().select('*').from(fullTableName).where('scorerId = ?', scorerId);\n\n if (entityId) {\n selectQuery.andWhere('entityId = ?', entityId);\n }\n if (entityType) {\n selectQuery.andWhere('entityType = ?', entityType);\n }\n if (source) {\n selectQuery.andWhere('source = ?', source);\n }\n selectQuery.limit(limitValue).offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder().count().from(fullTableName).where('runId = ?', runId);\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder()\n .select('*')\n .from(fullTableName)\n .where('runId = ?', runId)\n .limit(limitValue)\n .offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder()\n .count()\n .from(fullTableName)\n .where('entityId = ?', entityId)\n .andWhere('entityType = ?', entityType);\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder()\n .select('*')\n .from(fullTableName)\n .where('entityId = ?', entityId)\n .andWhere('entityType = ?', entityType)\n .limit(limitValue)\n .offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder()\n .count()\n .from(fullTableName)\n .where('traceId = ?', traceId)\n .andWhere('spanId = ?', spanId);\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder()\n .select('*')\n .from(fullTableName)\n .where('traceId = ?', traceId)\n .andWhere('spanId = ?', spanId)\n .orderBy('createdAt', 'DESC')\n .limit(limitValue)\n .offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_SPAN', '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 {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n ensureDate,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { D1DB, resolveD1Config } from '../../db';\nimport type { D1DomainConfig } from '../../db';\nimport { createSqlBuilder } from '../../sql-builder';\nimport type { SqlParam } from '../../sql-builder';\nimport { isArrayOfRecords } from '../utils';\n\nexport class WorkflowsStorageD1 extends WorkflowsStorage {\n #db: D1DB;\n\n constructor(config: D1DomainConfig) {\n super();\n this.#db = new D1DB(resolveD1Config(config));\n }\n\n supportsConcurrentUpdates(): boolean {\n // D1 doesn't support atomic read-modify-write operations needed for concurrent updates\n // batch() executes all statements atomically but requires all statements upfront,\n // so we can't use SELECT result to construct UPDATE in the same transaction\n return false;\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults(_args: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error(\n 'updateWorkflowResults is not implemented for Cloudflare D1 storage. D1 does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async updateWorkflowState(_args: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n throw new Error(\n 'updateWorkflowState is not implemented for Cloudflare D1 storage. D1 does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n const now = new Date().toISOString();\n\n const currentSnapshot = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n const persisting = currentSnapshot\n ? {\n ...currentSnapshot,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n updatedAt: updatedAt ? updatedAt.toISOString() : now,\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: snapshot as Record<string, any>,\n createdAt: createdAt ? createdAt.toISOString() : now,\n updatedAt: updatedAt ? updatedAt.toISOString() : now,\n };\n\n // Process record for SQL insertion\n const processedRecord = await this.#db.processRecord(persisting);\n\n const columns = Object.keys(processedRecord);\n const values = Object.values(processedRecord);\n\n // Specify which columns to update on conflict (all except PKs)\n const updateMap: Record<string, string> = {\n snapshot: 'excluded.snapshot',\n updatedAt: 'excluded.updatedAt',\n };\n\n this.logger.debug('Persisting workflow snapshot', { workflowName, runId });\n\n // Use the new insert method with ON CONFLICT\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['workflow_name', 'run_id'], updateMap);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to persist workflow snapshot: ${error instanceof Error ? error.message : String(error)}`,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot(params: { workflowName: string; runId: string }): Promise<WorkflowRunState | null> {\n const { workflowName, runId } = params;\n\n this.logger.debug('Loading workflow snapshot', { workflowName, runId });\n\n try {\n const d = await this.#db.load<{ snapshot: unknown }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n return d ? (d.snapshot as WorkflowRunState) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to load workflow snapshot: ${error instanceof Error ? error.message : String(error)}`,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n resourceId: row.resourceId,\n };\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n const builder = createSqlBuilder().select().from(fullTableName);\n const countBuilder = createSqlBuilder().count().from(fullTableName);\n\n if (workflowName) builder.whereAnd('workflow_name = ?', workflowName);\n if (status) {\n builder.whereAnd(\"json_extract(snapshot, '$.status') = ?\", status);\n countBuilder.whereAnd(\"json_extract(snapshot, '$.status') = ?\", status);\n }\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(fullTableName, 'resourceId');\n if (hasResourceId) {\n builder.whereAnd('resourceId = ?', resourceId);\n countBuilder.whereAnd('resourceId = ?', resourceId);\n } else {\n this.logger.warn(`[${fullTableName}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n if (fromDate) {\n builder.whereAnd('createdAt >= ?', fromDate instanceof Date ? fromDate.toISOString() : fromDate);\n countBuilder.whereAnd('createdAt >= ?', fromDate instanceof Date ? fromDate.toISOString() : fromDate);\n }\n if (toDate) {\n builder.whereAnd('createdAt <= ?', toDate instanceof Date ? toDate.toISOString() : toDate);\n countBuilder.whereAnd('createdAt <= ?', toDate instanceof Date ? toDate.toISOString() : toDate);\n }\n\n builder.orderBy('createdAt', 'DESC');\n if (typeof perPage === 'number' && typeof page === 'number') {\n const offset = page * perPage;\n builder.limit(perPage);\n builder.offset(offset);\n }\n\n const { sql, params } = builder.build();\n\n let total = 0;\n\n if (perPage !== undefined && page !== undefined) {\n const { sql: countSql, params: countParams } = countBuilder.build();\n const countResult = await this.#db.executeQuery({\n sql: countSql,\n params: countParams,\n first: true,\n });\n total = Number((countResult as Record<string, any>)?.count ?? 0);\n }\n\n const results = await this.#db.executeQuery({ sql, params });\n const runs = (isArrayOfRecords(results) ? results : []).map((row: any) => this.parseWorkflowRun(row));\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to retrieve workflow runs: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n workflowName: workflowName ?? '',\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n const conditions: string[] = [];\n const params: SqlParam[] = [];\n if (runId) {\n conditions.push('run_id = ?');\n params.push(runId);\n }\n if (workflowName) {\n conditions.push('workflow_name = ?');\n params.push(workflowName);\n }\n const whereClause = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';\n const sql = `SELECT * FROM ${fullTableName} ${whereClause} ORDER BY createdAt DESC LIMIT 1`;\n const result = await this.#db.executeQuery({ sql, params, first: true });\n if (!result) return null;\n return this.parseWorkflowRun(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to retrieve workflow run by ID: ${error instanceof Error ? error.message : String(error)}`,\n details: { runId, workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n const sql = `DELETE FROM ${fullTableName} WHERE workflow_name = ? AND run_id = ?`;\n const params: SqlParam[] = [workflowName, runId];\n await this.#db.executeQuery({ sql, params });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to delete workflow run by ID: ${error instanceof Error ? error.message : String(error)}`,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport Cloudflare from 'cloudflare';\nimport { MemoryStorageD1 } from './domains/memory';\nimport { ScoresStorageD1 } from './domains/scores';\nimport { WorkflowsStorageD1 } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { MemoryStorageD1, ScoresStorageD1, WorkflowsStorageD1 };\nexport type { D1DomainConfig } from './db';\n\n/**\n * Base configuration options shared across D1 configurations\n */\nexport interface D1BaseConfig {\n /** Storage instance ID */\n id: string;\n /** Optional prefix for table names */\n tablePrefix?: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new D1Store({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new D1Store({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n}\n\n/**\n * Configuration for D1 using the REST API\n */\nexport interface D1Config extends D1BaseConfig {\n /** Cloudflare account ID */\n accountId: string;\n /** Cloudflare API token with D1 access */\n apiToken: string;\n /** D1 database ID */\n databaseId: string;\n}\n\nexport interface D1ClientConfig extends D1BaseConfig {\n /** D1 Client */\n client: D1Client;\n}\n\n/**\n * Configuration for D1 using the Workers Binding API\n */\nexport interface D1WorkersConfig extends D1BaseConfig {\n /** D1 database binding from Workers environment */\n binding: D1Database; // D1Database binding from Workers\n}\n\n/**\n * Combined configuration type supporting both REST API and Workers Binding API\n */\nexport type D1StoreConfig = D1Config | D1WorkersConfig | D1ClientConfig;\n\nexport type D1QueryResult = Awaited<ReturnType<Cloudflare['d1']['database']['query']>>['result'];\nexport interface D1Client {\n query(args: { sql: string; params: string[] }): Promise<{ result: D1QueryResult }>;\n}\n\n/**\n * Cloudflare D1 storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new D1Store({ id: 'my-store', accountId: '...', apiToken: '...', databaseId: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class D1Store extends MastraCompositeStore {\n private client?: D1Client;\n private binding?: D1Database;\n private tablePrefix: string;\n\n stores: StorageDomains;\n\n /**\n * Creates a new D1Store instance\n * @param config Configuration for D1 access (either REST API or Workers Binding API)\n */\n constructor(config: D1StoreConfig) {\n try {\n super({ id: config.id, name: 'D1', disableInit: config.disableInit });\n\n if (config.tablePrefix && !/^[a-zA-Z0-9_]*$/.test(config.tablePrefix)) {\n throw new Error('Invalid tablePrefix: only letters, numbers, and underscores are allowed.');\n }\n\n this.tablePrefix = config.tablePrefix || '';\n\n // Determine which API to use based on provided config\n if ('binding' in config) {\n if (!config.binding) {\n throw new Error('D1 binding is required when using Workers Binding API');\n }\n this.binding = config.binding;\n this.logger.info('Using D1 Workers Binding API');\n } else if ('client' in config) {\n if (!config.client) {\n throw new Error('D1 client is required when using D1ClientConfig');\n }\n this.client = config.client;\n this.logger.info('Using D1 Client');\n } else {\n if (!config.accountId || !config.databaseId || !config.apiToken) {\n throw new Error('accountId, databaseId, and apiToken are required when using REST API');\n }\n const cfClient = new Cloudflare({\n apiToken: config.apiToken,\n });\n this.client = {\n query: ({ sql, params }) => {\n return cfClient.d1.database.query(config.databaseId, {\n account_id: config.accountId,\n sql,\n params,\n });\n },\n };\n\n this.logger.info('Using D1 REST API');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Error initializing D1Store',\n },\n error,\n );\n }\n\n let scores: ScoresStorageD1;\n let workflows: WorkflowsStorageD1;\n let memory: MemoryStorageD1;\n\n if (this.binding) {\n const domainConfig = { binding: this.binding, tablePrefix: this.tablePrefix };\n scores = new ScoresStorageD1(domainConfig);\n workflows = new WorkflowsStorageD1(domainConfig);\n memory = new MemoryStorageD1(domainConfig);\n } else {\n const domainConfig = { client: this.client!, tablePrefix: this.tablePrefix };\n scores = new ScoresStorageD1(domainConfig);\n workflows = new WorkflowsStorageD1(domainConfig);\n memory = new MemoryStorageD1(domainConfig);\n }\n\n this.stores = {\n scores,\n workflows,\n memory,\n };\n }\n\n /**\n * Close the database connection\n * No explicit cleanup needed for D1 in either REST or Workers Binding mode\n */\n async close(): Promise<void> {\n this.logger.debug('Closing D1 connection');\n // No explicit cleanup needed for D1\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/domains/utils.ts","../src/storage/sql-builder.ts","../src/storage/db/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["parseSqlIdentifier","Cloudflare","MastraBase","error","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","getSqlType","getDefaultValue","TABLE_WORKFLOW_SNAPSHOT","MemoryStorage","TABLE_THREADS","TABLE_SCHEMAS","TABLE_MESSAGES","TABLE_RESOURCES","ensureDate","normalizePerPage","calculatePagination","MessageList","serializeDate","list","coreTransformScoreRow","ScoresStorage","TABLE_SCORERS","saveScorePayloadSchema","WorkflowsStorage","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["export function isArrayOfRecords(value: any): value is Record<string, any>[] {\n return value && Array.isArray(value) && value.length > 0;\n}\n\nexport function deserializeValue(value: any, type?: string): any {\n if (value === null || value === undefined) return null;\n\n if (type === 'date' && typeof value === 'string') {\n return new Date(value);\n }\n\n if (type === 'jsonb' && typeof value === 'string') {\n try {\n return JSON.parse(value) as Record<string, any>;\n } catch {\n return value;\n }\n }\n\n if (typeof value === 'string' && (value.startsWith('{') || value.startsWith('['))) {\n try {\n return JSON.parse(value) as Record<string, any>;\n } catch {\n return value;\n }\n }\n\n return value;\n}\n","import { parseSqlIdentifier } from '@mastra/core/utils';\n\n/**\n * Type definition for SQL query parameters\n */\nexport type SqlParam = string | number | boolean | null | undefined;\n\n/**\n * Interface for SQL query options with generic type support\n */\nexport interface SqlQueryOptions {\n /** SQL query to execute */\n sql: string;\n /** Parameters to bind to the query */\n params?: SqlParam[];\n /** Whether to return only the first result */\n first?: boolean;\n}\n\n/**\n * SQL Builder class for constructing type-safe SQL queries\n * This helps create maintainable and secure SQL queries with proper parameter handling\n */\nexport class SqlBuilder {\n private sql: string = '';\n private params: SqlParam[] = [];\n private whereAdded: boolean = false;\n\n // Basic query building\n select(columns?: string | string[]): SqlBuilder {\n if (!columns || (Array.isArray(columns) && columns.length === 0)) {\n this.sql = 'SELECT *';\n } else {\n const cols = Array.isArray(columns) ? columns : [columns];\n const parsedCols = cols.map(col => parseSelectIdentifier(col));\n this.sql = `SELECT ${parsedCols.join(', ')}`;\n }\n return this;\n }\n\n from(table: string): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n this.sql += ` FROM ${parsedTableName}`;\n return this;\n }\n\n /**\n * Add a WHERE clause to the query\n * @param condition The condition to add\n * @param params Parameters to bind to the condition\n */\n where(condition: string, ...params: SqlParam[]): SqlBuilder {\n this.sql += ` WHERE ${condition}`;\n this.params.push(...params);\n this.whereAdded = true;\n return this;\n }\n\n /**\n * Add a WHERE clause if it hasn't been added yet, otherwise add an AND clause\n * @param condition The condition to add\n * @param params Parameters to bind to the condition\n */\n whereAnd(condition: string, ...params: SqlParam[]): SqlBuilder {\n if (this.whereAdded) {\n return this.andWhere(condition, ...params);\n } else {\n return this.where(condition, ...params);\n }\n }\n\n andWhere(condition: string, ...params: SqlParam[]): SqlBuilder {\n this.sql += ` AND ${condition}`;\n this.params.push(...params);\n return this;\n }\n\n orWhere(condition: string, ...params: SqlParam[]): SqlBuilder {\n this.sql += ` OR ${condition}`;\n this.params.push(...params);\n return this;\n }\n\n orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): SqlBuilder {\n const parsedColumn = parseSqlIdentifier(column, 'column name');\n if (!['ASC', 'DESC'].includes(direction)) {\n throw new Error(`Invalid sort direction: ${direction}`);\n }\n this.sql += ` ORDER BY ${parsedColumn} ${direction}`;\n return this;\n }\n\n limit(count: number): SqlBuilder {\n this.sql += ` LIMIT ?`;\n this.params.push(count);\n return this;\n }\n\n offset(count: number): SqlBuilder {\n this.sql += ` OFFSET ?`;\n this.params.push(count);\n return this;\n }\n\n count(): SqlBuilder {\n this.sql += 'SELECT COUNT(*) AS count';\n return this;\n }\n\n /**\n * Insert a row, or update specific columns on conflict (upsert).\n * @param table Table name\n * @param columns Columns to insert\n * @param values Values to insert\n * @param conflictColumns Columns to check for conflict (usually PK or UNIQUE)\n * @param updateMap Object mapping columns to update to their new value (e.g. { name: 'excluded.name' })\n */\n insert(\n table: string,\n columns: string[],\n values: SqlParam[],\n conflictColumns?: string[],\n updateMap?: Record<string, string>,\n ): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n const parsedColumns = columns.map(col => parseSqlIdentifier(col, 'column name'));\n const placeholders = parsedColumns.map(() => '?').join(', ');\n\n if (conflictColumns && updateMap) {\n const parsedConflictColumns = conflictColumns.map(col => parseSqlIdentifier(col, 'column name'));\n const updateClause = Object.entries(updateMap)\n .map(([col, expr]) => `${col} = ${expr}`)\n .join(', ');\n this.sql = `INSERT INTO ${parsedTableName} (${parsedColumns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${parsedConflictColumns.join(', ')}) DO UPDATE SET ${updateClause}`;\n this.params.push(...values);\n return this;\n }\n\n this.sql = `INSERT INTO ${parsedTableName} (${parsedColumns.join(', ')}) VALUES (${placeholders})`;\n this.params.push(...values);\n\n return this;\n }\n\n // Update operations\n update(table: string, columns: string[], values: SqlParam[]): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n const parsedColumns = columns.map(col => parseSqlIdentifier(col, 'column name'));\n const setClause = parsedColumns.map(col => `${col} = ?`).join(', ');\n this.sql = `UPDATE ${parsedTableName} SET ${setClause}`;\n this.params.push(...values);\n return this;\n }\n\n // Delete operations\n delete(table: string): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n this.sql = `DELETE FROM ${parsedTableName}`;\n return this;\n }\n\n /**\n * Create a table if it doesn't exist\n * @param table The table name\n * @param columnDefinitions The column definitions as an array of strings\n * @param tableConstraints Optional constraints for the table\n * @returns The builder instance\n */\n createTable(table: string, columnDefinitions: string[], tableConstraints?: string[]): SqlBuilder {\n const parsedTableName = parseSqlIdentifier(table, 'table name');\n // Naive validation: check the first word of each column definition\n const parsedColumnDefinitions = columnDefinitions.map(def => {\n const colName = def.split(/\\s+/)[0];\n if (!colName) throw new Error('Empty column name in definition');\n parseSqlIdentifier(colName, 'column name');\n return def;\n });\n const columns = parsedColumnDefinitions.join(', ');\n const constraints = tableConstraints && tableConstraints.length > 0 ? ', ' + tableConstraints.join(', ') : '';\n this.sql = `CREATE TABLE IF NOT EXISTS ${parsedTableName} (${columns}${constraints})`;\n return this;\n }\n\n /**\n * Check if an index exists in the database\n * @param indexName The name of the index to check\n * @param tableName The table the index is on\n * @returns The builder instance\n */\n checkIndexExists(indexName: string, tableName: string): SqlBuilder {\n this.sql = `SELECT name FROM sqlite_master WHERE type='index' AND name=? AND tbl_name=?`;\n this.params.push(indexName, tableName);\n return this;\n }\n\n /**\n * Create an index if it doesn't exist\n * @param indexName The name of the index to create\n * @param tableName The table to create the index on\n * @param columnName The column to index\n * @param indexType Optional index type (e.g., 'UNIQUE')\n * @returns The builder instance\n */\n createIndex(indexName: string, tableName: string, columnName: string, indexType: string = ''): SqlBuilder {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const parsedTableName = parseSqlIdentifier(tableName, 'table name');\n const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n this.sql = `CREATE ${indexType ? indexType + ' ' : ''}INDEX IF NOT EXISTS ${parsedIndexName} ON ${parsedTableName}(${parsedColumnName})`;\n return this;\n }\n\n /**\n * Add a LIKE condition to the query\n * @param column The column to check\n * @param value The value to match (will be wrapped with % for LIKE)\n * @param exact If true, will not add % wildcards\n */\n like(column: string, value: string, exact: boolean = false): SqlBuilder {\n const parsedColumnName = parseSqlIdentifier(column, 'column name');\n const likeValue = exact ? value : `%${value}%`;\n if (this.whereAdded) {\n this.sql += ` AND ${parsedColumnName} LIKE ?`;\n } else {\n this.sql += ` WHERE ${parsedColumnName} LIKE ?`;\n this.whereAdded = true;\n }\n this.params.push(likeValue);\n return this;\n }\n\n /**\n * Add a JSON LIKE condition for searching in JSON fields\n * @param column The JSON column to search in\n * @param key The JSON key to match\n * @param value The value to match\n */\n jsonLike(column: string, key: string, value: string): SqlBuilder {\n const parsedColumnName = parseSqlIdentifier(column, 'column name');\n const parsedKey = parseSqlIdentifier(key, 'key name');\n const jsonPattern = `%\"${parsedKey}\":\"${value}\"%`;\n if (this.whereAdded) {\n this.sql += ` AND ${parsedColumnName} LIKE ?`;\n } else {\n this.sql += ` WHERE ${parsedColumnName} LIKE ?`;\n this.whereAdded = true;\n }\n this.params.push(jsonPattern);\n return this;\n }\n\n /**\n * Get the built query\n * @returns Object containing the SQL string and parameters array\n */\n build(): { sql: string; params: SqlParam[] } {\n return {\n sql: this.sql,\n params: this.params,\n };\n }\n\n /**\n * Reset the builder for reuse\n * @returns The reset builder instance\n */\n reset(): SqlBuilder {\n this.sql = '';\n this.params = [];\n this.whereAdded = false;\n return this;\n }\n}\n\n// Factory function for easier creation\nexport function createSqlBuilder(): SqlBuilder {\n return new SqlBuilder();\n}\n\n/** Represents a validated SQL SELECT column identifier (or '*', optionally with 'AS alias'). */\ntype SelectIdentifier = string & { __brand: 'SelectIdentifier' };\n\nconst SQL_IDENTIFIER_PATTERN = /^[a-zA-Z0-9_]+(\\s+AS\\s+[a-zA-Z0-9_]+)?$/;\n\n/**\n * Parses and returns a valid SQL SELECT column identifier.\n * Allows a single identifier (letters, numbers, underscores), or '*', optionally with 'AS alias'.\n *\n * @param column - The column identifier string to parse.\n * @returns The validated column identifier as a branded type.\n * @throws {Error} If invalid.\n *\n * @example\n * const col = parseSelectIdentifier('user_id'); // Ok\n * parseSelectIdentifier('user_id AS uid'); // Ok\n * parseSelectIdentifier('*'); // Ok\n * parseSelectIdentifier('user id'); // Throws error\n */\nexport function parseSelectIdentifier(column: string): SelectIdentifier {\n if (column !== '*' && !SQL_IDENTIFIER_PATTERN.test(column)) {\n throw new Error(\n `Invalid column name: \"${column}\". Must be \"*\" or a valid identifier (letters, numbers, underscores), optionally with \"AS alias\".`,\n );\n }\n return column as SelectIdentifier;\n}\n","import type { D1Database } from '@cloudflare/workers-types';\nimport { MastraBase } from '@mastra/core/base';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, getDefaultValue, getSqlType, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage';\nimport type { TABLE_NAMES, StorageColumn } from '@mastra/core/storage';\nimport Cloudflare from 'cloudflare';\nimport { deserializeValue } from '../domains/utils';\nimport { createSqlBuilder } from '../sql-builder';\nimport type { SqlParam, SqlQueryOptions } from '../sql-builder';\n\nexport type D1QueryResult = Awaited<ReturnType<Cloudflare['d1']['database']['query']>>['result'];\n\nexport interface D1Client {\n query(args: { sql: string; params: string[] }): Promise<{ result: D1QueryResult }>;\n}\n\nexport interface D1DBConfig {\n client?: D1Client;\n binding?: D1Database;\n tablePrefix?: string;\n}\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing D1 client or binding\n * 2. Config to create a new client internally\n */\nexport type D1DomainConfig = D1DomainClientConfig | D1DomainBindingConfig | D1DomainRestConfig;\n\n/**\n * Pass an existing D1 client (REST API)\n */\nexport interface D1DomainClientConfig {\n client: D1Client;\n tablePrefix?: string;\n}\n\n/**\n * Pass an existing D1 binding (Workers API)\n */\nexport interface D1DomainBindingConfig {\n binding: D1Database;\n tablePrefix?: string;\n}\n\n/**\n * Pass config to create a new D1 client internally (REST API)\n */\nexport interface D1DomainRestConfig {\n accountId: string;\n apiToken: string;\n databaseId: string;\n tablePrefix?: string;\n}\n\n/**\n * Resolves D1DomainConfig to D1DBConfig.\n * Handles creating a new D1 client if apiToken is provided.\n */\nexport function resolveD1Config(config: D1DomainConfig): D1DBConfig {\n // Existing client\n if ('client' in config) {\n return {\n client: config.client,\n tablePrefix: config.tablePrefix,\n };\n }\n\n // Existing binding\n if ('binding' in config) {\n return {\n binding: config.binding,\n tablePrefix: config.tablePrefix,\n };\n }\n\n // Config to create new client (REST API)\n const cfClient = new Cloudflare({ apiToken: config.apiToken });\n return {\n client: {\n query: ({ sql, params }) => {\n return cfClient.d1.database.query(config.databaseId, {\n account_id: config.accountId,\n sql,\n params,\n });\n },\n },\n tablePrefix: config.tablePrefix,\n };\n}\n\nexport class D1DB extends MastraBase {\n private client?: D1Client;\n private binding?: D1Database;\n private tablePrefix: string;\n\n /** Cache of actual table columns: tableName -> Promise<Set<columnName>> (stores in-flight promise to coalesce concurrent calls) */\n private tableColumnsCache = new Map<string, Promise<Set<string>>>();\n\n constructor(config: D1DBConfig) {\n super({\n component: 'STORAGE',\n name: 'D1_DB',\n });\n this.client = config.client;\n this.binding = config.binding;\n this.tablePrefix = config.tablePrefix || '';\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n // For D1/SQLite, use PRAGMA table_info to get column info\n // Handle both prefixed and non-prefixed table names\n const fullTableName = table.startsWith(this.tablePrefix) ? table : `${this.tablePrefix}${table}`;\n const sql = `PRAGMA table_info(${fullTableName});`;\n const result = await this.executeQuery({ sql, params: [] });\n if (!result || !Array.isArray(result)) return false;\n return result.some((col: any) => col.name === column || col.name === column.toLowerCase());\n }\n\n getTableName(tableName: TABLE_NAMES): string {\n return `${this.tablePrefix}${tableName}`;\n }\n\n private formatSqlParams(params: SqlParam[]): string[] {\n return params.map(p => (p === undefined || p === null ? null : p) as string);\n }\n\n private async executeWorkersBindingQuery({\n sql,\n params = [],\n first = false,\n }: SqlQueryOptions): Promise<Record<string, any>[] | Record<string, any> | null> {\n if (!this.binding) {\n throw new Error('Workers binding is not configured');\n }\n\n try {\n const statement = this.binding.prepare(sql);\n const formattedParams = this.formatSqlParams(params);\n\n let result;\n if (formattedParams.length > 0) {\n if (first) {\n result = await statement.bind(...formattedParams).first();\n if (!result) return null;\n return result;\n } else {\n result = await statement.bind(...formattedParams).all();\n const results = result.results || [];\n return results;\n }\n } else {\n if (first) {\n result = await statement.first();\n if (!result) return null;\n return result;\n } else {\n result = await statement.all();\n const results = result.results || [];\n return results;\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'WORKERS_BINDING_QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sql },\n },\n error,\n );\n }\n }\n\n private async executeRestQuery({\n sql,\n params = [],\n first = false,\n }: SqlQueryOptions): Promise<Record<string, any>[] | Record<string, any> | null> {\n if (!this.client) {\n throw new Error('D1 client is not configured');\n }\n\n try {\n const formattedParams = this.formatSqlParams(params);\n const response = await this.client.query({\n sql,\n params: formattedParams,\n });\n const result = response.result || [];\n const results = result.flatMap(r => r.results || []);\n\n if (first) {\n return results[0] || null;\n }\n\n return results;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'REST_QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sql },\n },\n error,\n );\n }\n }\n\n async executeQuery(options: SqlQueryOptions): Promise<Record<string, any>[] | Record<string, any> | null> {\n if (this.binding) {\n return this.executeWorkersBindingQuery(options);\n } else if (this.client) {\n return this.executeRestQuery(options);\n } else {\n throw new Error('Neither binding nor client is configured');\n }\n }\n\n /**\n * Gets the set of column names that actually exist in the database table.\n * Results are cached; the cache is invalidated when alterTable() adds new columns.\n */\n private async getKnownColumnNames(tableName: string): Promise<Set<string>> {\n const cached = this.tableColumnsCache.get(tableName);\n if (cached) return cached;\n\n // Store the in-flight promise so concurrent callers (e.g. Promise.all in batch ops) await the same query\n const promise = this.getTableColumns(tableName).then(columns => {\n const names = new Set(columns.map(c => c.name));\n // If the query returned no columns, remove the cached promise so we retry next time\n if (names.size === 0) {\n this.tableColumnsCache.delete(tableName);\n }\n return names;\n });\n this.tableColumnsCache.set(tableName, promise);\n\n return promise;\n }\n\n /**\n * Filters a record to only include columns that exist in the actual database table.\n * Unknown columns are silently dropped to ensure forward compatibility.\n */\n private async filterRecordToKnownColumns(\n tableName: string,\n record: Record<string, any>,\n ): Promise<Record<string, any>> {\n const knownColumns = await this.getKnownColumnNames(tableName);\n if (knownColumns.size === 0) return record;\n\n const filtered: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n if (knownColumns.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n }\n\n private async getTableColumns(tableName: string): Promise<{ name: string; type: string }[]> {\n try {\n const sql = `PRAGMA table_info(${tableName})`;\n const result = await this.executeQuery({ sql });\n\n if (!result || !Array.isArray(result)) {\n return [];\n }\n\n return result.map(row => ({\n name: row.name as string,\n type: row.type as string,\n }));\n } catch (error) {\n this.logger.warn(`Failed to get table columns for ${tableName}:`, error);\n return [];\n }\n }\n\n private serializeValue(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return value;\n }\n\n protected getSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'bigint':\n return 'INTEGER'; // SQLite uses INTEGER for all integer sizes\n case 'jsonb':\n return 'TEXT'; // Store JSON as TEXT in SQLite\n case 'boolean':\n return 'INTEGER'; // SQLite uses 0/1 for booleans\n default:\n return getSqlType(type);\n }\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n return getDefaultValue(type);\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const fullTableName = this.getTableName(tableName);\n\n // Build SQL columns from schema\n const columnDefinitions = Object.entries(schema).map(([colName, colDef]) => {\n const type = this.getSqlType(colDef.type);\n const nullable = colDef.nullable === false ? 'NOT NULL' : '';\n const primaryKey = colDef.primaryKey ? 'PRIMARY KEY' : '';\n return `${colName} ${type} ${nullable} ${primaryKey}`.trim();\n });\n\n // Add table-level constraints if needed\n const tableConstraints: string[] = [];\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n tableConstraints.push('UNIQUE (workflow_name, run_id)');\n }\n\n const query = createSqlBuilder().createTable(fullTableName, columnDefinitions, tableConstraints);\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n this.logger.debug(`Created table ${fullTableName}`);\n this.tableColumnsCache.delete(fullTableName);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const fullTableName = this.getTableName(tableName);\n const query = createSqlBuilder().delete(fullTableName);\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n this.logger.debug(`Cleared table ${fullTableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n const fullTableName = this.getTableName(tableName);\n try {\n const sql = `DROP TABLE IF EXISTS ${fullTableName}`;\n await this.executeQuery({ sql });\n this.logger.debug(`Dropped table ${fullTableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(fullTableName);\n }\n }\n\n async alterTable(args: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n const fullTableName = this.getTableName(args.tableName);\n\n try {\n const existingColumns = await this.getTableColumns(fullTableName);\n const existingColumnNames = new Set(existingColumns.map(col => col.name));\n\n for (const [columnName, column] of Object.entries(args.schema)) {\n if (!existingColumnNames.has(columnName) && args.ifNotExists.includes(columnName)) {\n const sqlType = this.getSqlType(column.type);\n const defaultValue = this.getDefaultValue(column.type);\n const sql = `ALTER TABLE ${fullTableName} ADD COLUMN ${columnName} ${sqlType} ${defaultValue}`;\n await this.executeQuery({ sql });\n this.logger.debug(`Added column ${columnName} to table ${fullTableName}`);\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName: args.tableName },\n },\n error,\n );\n } finally {\n // Invalidate cached columns after DDL completes so concurrent writers see the new schema\n this.tableColumnsCache.delete(fullTableName);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n const fullTableName = this.getTableName(tableName);\n const processedRecord = await this.processRecord(record);\n // Filter out columns that don't exist in the actual database table\n const filteredRecord = await this.filterRecordToKnownColumns(fullTableName, processedRecord);\n const columns = Object.keys(filteredRecord);\n if (columns.length === 0) return; // No known columns after filtering - skip insert\n const values = Object.values(filteredRecord);\n\n const query = createSqlBuilder().insert(fullTableName, columns, values);\n const { sql, params } = query.build();\n\n await this.executeQuery({ sql, params });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', '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 try {\n if (records.length === 0) return;\n\n const fullTableName = this.getTableName(tableName);\n const processedRecords = await Promise.all(records.map(record => this.processRecord(record)));\n // Filter out columns that don't exist in the actual database table\n const filteredRecords = await Promise.all(\n processedRecords.map(r => this.filterRecordToKnownColumns(fullTableName, r)),\n );\n\n // For batch insert, we need to create multiple INSERT statements\n // Derive columns per-record and skip empty records\n for (const record of filteredRecords) {\n const columns = Object.keys(record);\n if (columns.length === 0) continue; // Skip records with no known columns\n const values = Object.values(record);\n const query = createSqlBuilder().insert(fullTableName, columns, values);\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const fullTableName = this.getTableName(tableName);\n const query = createSqlBuilder().select('*').from(fullTableName);\n\n // Add WHERE conditions for each key\n let firstKey = true;\n for (const [key, value] of Object.entries(keys)) {\n if (firstKey) {\n query.where(`${key} = ?`, value);\n firstKey = false;\n } else {\n query.andWhere(`${key} = ?`, value);\n }\n }\n\n query.orderBy('createdAt', 'DESC');\n\n query.limit(1);\n const { sql, params } = query.build();\n\n const result = await this.executeQuery({ sql, params, first: true });\n\n if (!result) {\n return null;\n }\n\n // Deserialize JSON fields\n const deserializedResult: Record<string, any> = {};\n for (const [key, value] of Object.entries(result)) {\n deserializedResult[key] = deserializeValue(value);\n }\n\n return deserializedResult as R;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async processRecord(record: Record<string, any>): Promise<Record<string, any>> {\n const processed: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n processed[key] = this.serializeValue(value);\n }\n return processed;\n }\n\n /**\n * Upsert multiple records in a batch operation\n * @param tableName The table to insert into\n * @param records The records to insert\n */\n async batchUpsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n\n const fullTableName = this.getTableName(tableName);\n\n try {\n // Process records in batches for better performance\n const batchSize = 50; // Adjust based on performance testing\n\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n\n const recordsToInsert = batch;\n\n // Filter out columns that don't exist in the actual database table\n if (recordsToInsert.length > 0) {\n const filteredRecords = await Promise.all(\n recordsToInsert.map(r => this.filterRecordToKnownColumns(fullTableName, r || {})),\n );\n\n // Create a bulk insert statement - derive columns per-record and skip empties\n for (const record of filteredRecords) {\n const columns = Object.keys(record);\n if (columns.length === 0) continue; // Skip records with no known columns\n\n const values = columns.map(col => {\n const value = record[col];\n return this.serializeValue(value);\n });\n\n const recordToUpsert = columns.reduce(\n (acc, col) => {\n if (col !== 'createdAt') acc[col] = `excluded.${col}`;\n return acc;\n },\n {} as Record<string, any>,\n );\n\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['id'], recordToUpsert);\n\n const { sql, params } = query.build();\n await this.executeQuery({ sql, params });\n }\n }\n\n this.logger.debug(\n `Processed batch ${Math.floor(i / batchSize) + 1} of ${Math.ceil(records.length / batchSize)}`,\n );\n }\n\n this.logger.debug(`Successfully batch upserted ${records.length} records into ${tableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'BATCH_UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to batch upsert into ${tableName}: ${error instanceof Error ? error.message : String(error)}`,\n details: { tableName },\n },\n error,\n );\n }\n }\n}\n","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n createStorageErrorId,\n ensureDate,\n MemoryStorage,\n serializeDate,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCHEMAS,\n normalizePerPage,\n calculatePagination,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n} from '@mastra/core/storage';\nimport { D1DB, resolveD1Config } from '../../db';\nimport type { D1DomainConfig } from '../../db';\nimport { createSqlBuilder } from '../../sql-builder';\nimport { deserializeValue, isArrayOfRecords } from '../utils';\n\nexport class MemoryStorageD1 extends MemoryStorage {\n #db: D1DB;\n\n constructor(config: D1DomainConfig) {\n super();\n this.#db = new D1DB(resolveD1Config(config));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n // Add resourceId column for backwards compatibility\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const resource = await this.#db.load<StorageResourceType>({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n });\n\n if (!resource) return null;\n\n try {\n return {\n ...resource,\n createdAt: ensureDate(resource.createdAt) as Date,\n updatedAt: ensureDate(resource.updatedAt) as Date,\n metadata:\n typeof resource.metadata === 'string'\n ? (JSON.parse(resource.metadata || '{}') as Record<string, any>)\n : resource.metadata,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Error processing resource ${resourceId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { resourceId },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return null;\n }\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n const fullTableName = this.#db.getTableName(TABLE_RESOURCES);\n\n // Prepare the record for SQL insertion\n const resourceToSave = {\n id: resource.id,\n workingMemory: resource.workingMemory,\n metadata: resource.metadata ? JSON.stringify(resource.metadata) : null,\n createdAt: resource.createdAt,\n updatedAt: resource.updatedAt,\n };\n\n // Process record for SQL insertion\n const processedRecord = await this.#db.processRecord(resourceToSave);\n\n const columns = Object.keys(processedRecord);\n const values = Object.values(processedRecord);\n\n // Specify which columns to update on conflict (all except id)\n const updateMap: Record<string, string> = {\n workingMemory: 'excluded.workingMemory',\n metadata: 'excluded.metadata',\n createdAt: 'excluded.createdAt',\n updatedAt: 'excluded.updatedAt',\n };\n\n // Use the new insert method with ON CONFLICT\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['id'], updateMap);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n return resource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to save resource to ${fullTableName}: ${error instanceof Error ? error.message : String(error)}`,\n details: { resourceId: resource.id },\n },\n error,\n );\n }\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n // Create new resource if it doesn't exist\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedAt = new Date();\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt,\n };\n\n const fullTableName = this.#db.getTableName(TABLE_RESOURCES);\n\n const columns = ['workingMemory', 'metadata', 'updatedAt'];\n const values = [updatedResource.workingMemory, JSON.stringify(updatedResource.metadata), updatedAt.toISOString()];\n\n const query = createSqlBuilder().update(fullTableName, columns, values).where('id = ?', resourceId);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n return updatedResource;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to update resource ${resourceId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { resourceId },\n },\n error,\n );\n }\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n const thread = await this.#db.load<StorageThreadType>({\n tableName: TABLE_THREADS,\n keys: { id: threadId },\n });\n\n if (!thread) return null;\n\n try {\n return {\n ...thread,\n createdAt: ensureDate(thread.createdAt) as Date,\n updatedAt: ensureDate(thread.updatedAt) as Date,\n metadata:\n typeof thread.metadata === 'string'\n ? (JSON.parse(thread.metadata || '{}') as Record<string, any>)\n : thread.metadata || {},\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Error processing thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return null;\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n },\n error instanceof Error ? error : new Error('Invalid pagination parameters'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n },\n error instanceof Error ? error : new Error('Invalid metadata key'),\n );\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n const mapRowToStorageThreadType = (row: Record<string, any>): StorageThreadType => ({\n ...(row as StorageThreadType),\n createdAt: ensureDate(row.createdAt) as Date,\n updatedAt: ensureDate(row.updatedAt) as Date,\n metadata:\n typeof row.metadata === 'string'\n ? (JSON.parse(row.metadata || '{}') as Record<string, any>)\n : row.metadata || {},\n });\n\n try {\n let countQuery = createSqlBuilder().count().from(fullTableName);\n let selectQuery = createSqlBuilder().select('*').from(fullTableName);\n\n // Add resourceId filter if provided\n if (filter?.resourceId) {\n countQuery = countQuery.whereAnd('resourceId = ?', filter.resourceId);\n selectQuery = selectQuery.whereAnd('resourceId = ?', filter.resourceId);\n }\n\n // Add metadata filters if provided (AND logic)\n // Keys are validated above to prevent SQL injection\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n // Validate filter value type - only allow scalar types\n if (value !== null && typeof value === 'object') {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'INVALID_METADATA_VALUE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Metadata filter value for key \"${key}\" must be a scalar type (string, number, boolean, or null), got ${Array.isArray(value) ? 'array' : 'object'}`,\n details: { key, valueType: Array.isArray(value) ? 'array' : 'object' },\n },\n new Error('Invalid metadata filter value type'),\n );\n }\n\n // Handle null values specially: json_extract returns NULL for null values,\n // and NULL = NULL evaluates to NULL (not true) in SQL\n if (value === null) {\n const condition = `json_extract(metadata, '$.${key}') IS NULL`;\n countQuery = countQuery.whereAnd(condition);\n selectQuery = selectQuery.whereAnd(condition);\n } else {\n // json_extract returns the raw value (unquoted for strings, native for numbers/booleans)\n // Pass native values directly so SQLite compares types correctly\n const condition = `json_extract(metadata, '$.${key}') = ?`;\n // Type assertion is safe here because we've validated above that value is a scalar type\n const filterValue = value as string | number | boolean;\n countQuery = countQuery.whereAnd(condition, filterValue);\n selectQuery = selectQuery.whereAnd(condition, filterValue);\n }\n }\n }\n\n const countResult = (await this.#db.executeQuery(countQuery.build())) as {\n count: number;\n }[];\n const total = Number(countResult?.[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n selectQuery = selectQuery.orderBy(field, direction).limit(limitValue).offset(offset);\n\n const results = (await this.#db.executeQuery(selectQuery.build())) as Record<string, any>[];\n const threads = results.map(mapRowToStorageThreadType);\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n // Re-throw USER errors (validation errors) directly so callers get proper 400 responses\n if (error instanceof MastraError && error.category === ErrorCategory.USER) {\n throw error;\n }\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Error listing threads: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n // Prepare the record for SQL insertion\n const threadToSave = {\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.toISOString(),\n updatedAt: thread.updatedAt.toISOString(),\n };\n\n // Process record for SQL insertion\n const processedRecord = await this.#db.processRecord(threadToSave);\n\n const columns = Object.keys(processedRecord);\n const values = Object.values(processedRecord);\n\n // Specify which columns to update on conflict (all except id)\n const updateMap: Record<string, string> = {\n resourceId: 'excluded.resourceId',\n title: 'excluded.title',\n metadata: 'excluded.metadata',\n createdAt: 'excluded.createdAt',\n updatedAt: 'excluded.updatedAt',\n };\n\n // Use the new insert method with ON CONFLICT\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['id'], updateMap);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to save thread to ${fullTableName}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const thread = await this.getThreadById({ threadId: id });\n try {\n if (!thread) {\n throw new Error(`Thread ${id} not found`);\n }\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n const mergedMetadata = {\n ...(typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata),\n ...(metadata as Record<string, any>),\n };\n\n const updatedAt = new Date();\n const columns = ['title', 'metadata', 'updatedAt'];\n const values = [title, JSON.stringify(mergedMetadata), updatedAt.toISOString()];\n\n const query = createSqlBuilder().update(fullTableName, columns, values).where('id = ?', id);\n\n const { sql, params } = query.build();\n\n await this.#db.executeQuery({ sql, params });\n\n return {\n ...thread,\n title,\n metadata: {\n ...(typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata),\n ...(metadata as Record<string, any>),\n },\n updatedAt,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to update thread ${id}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId: id },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const fullTableName = this.#db.getTableName(TABLE_THREADS);\n\n try {\n // Delete the thread\n const deleteThreadQuery = createSqlBuilder().delete(fullTableName).where('id = ?', threadId);\n\n const { sql: threadSql, params: threadParams } = deleteThreadQuery.build();\n await this.#db.executeQuery({ sql: threadSql, params: threadParams });\n\n // Also delete associated messages\n const messagesTableName = this.#db.getTableName(TABLE_MESSAGES);\n const deleteMessagesQuery = createSqlBuilder().delete(messagesTableName).where('thread_id = ?', threadId);\n\n const { sql: messagesSql, params: messagesParams } = deleteMessagesQuery.build();\n await this.#db.executeQuery({ sql: messagesSql, params: messagesParams });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to delete thread ${threadId}: ${error instanceof Error ? error.message : String(error)}`,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n async saveMessages(args: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n const { messages } = args;\n if (messages.length === 0) return { messages: [] };\n\n try {\n const now = new Date();\n const threadId = messages[0]?.threadId;\n\n // Validate all messages before insert\n for (const [i, message] of messages.entries()) {\n if (!message.id) throw new Error(`Message at index ${i} missing id`);\n if (!message.threadId) {\n throw new Error(`Message at index ${i} missing threadId`);\n }\n if (!message.content) {\n throw new Error(`Message at index ${i} missing content`);\n }\n if (!message.role) {\n throw new Error(`Message at index ${i} missing role`);\n }\n if (!message.resourceId) {\n throw new Error(`Message at index ${i} missing resourceId`);\n }\n const thread = await this.getThreadById({ threadId: message.threadId });\n if (!thread) {\n throw new Error(`Thread ${message.threadId} not found`);\n }\n }\n\n // Prepare all messages for insertion (set timestamps, thread_id, etc.)\n const messagesToInsert = messages.map(message => {\n const createdAt = message.createdAt ? new Date(message.createdAt) : now;\n return {\n id: message.id,\n thread_id: message.threadId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: createdAt.toISOString(),\n role: message.role,\n type: message.type || 'v2',\n resourceId: message.resourceId,\n };\n });\n\n // Insert messages and update thread's updatedAt in parallel\n await Promise.all([\n this.#db.batchUpsert({\n tableName: TABLE_MESSAGES,\n records: messagesToInsert,\n }),\n // Update thread's updatedAt timestamp\n this.#db.executeQuery({\n sql: `UPDATE ${this.#db.getTableName(TABLE_THREADS)} SET updatedAt = ? WHERE id = ?`,\n params: [now.toISOString(), threadId],\n }),\n ]);\n\n this.logger.debug(`Saved ${messages.length} messages`);\n const list = new MessageList().add(messages, 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to save messages: ${error instanceof Error ? error.message : String(error)}`,\n },\n error,\n );\n }\n }\n\n private _sortMessages(messages: MastraDBMessage[], field: string, direction: string): MastraDBMessage[] {\n return messages.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 (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\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\n private async _getIncludedMessages(include: StorageListMessagesInput['include']) {\n if (!include || include.length === 0) return null;\n\n const tableName = this.#db.getTableName(TABLE_MESSAGES);\n\n // Phase 1: Batch-fetch metadata for all target messages in a single query.\n // This eliminates the correlated subselects that previously ran per-subquery.\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 targetResult = await this.#db.executeQuery({\n sql: `SELECT id, thread_id, createdAt FROM ${tableName} WHERE id IN (${idPlaceholders})`,\n params: targetIds,\n });\n\n if (!Array.isArray(targetResult) || targetResult.length === 0) return null;\n\n const targetMap = new Map(\n targetResult.map((r: any) => [r.id as string, { threadId: r.thread_id as string, createdAt: r.createdAt }]),\n );\n\n // Phase 2: Build cursor-based subqueries and execute in batches to stay under\n // D1's compound SELECT limit. D1 sets SQLITE_LIMIT_COMPOUND_SELECT well below\n // SQLite's default of 500 — empirically it fails at 10 terms, so we use a\n // conservative batch size of 5 terms.\n const MAX_UNION_TERMS = 5;\n const unionQueries: string[] = [];\n const unionParams: any[] = [];\n const allMessages: Record<string, any>[] = [];\n\n const flushBatch = async () => {\n if (unionQueries.length === 0) return;\n const sql =\n unionQueries.length === 1\n ? unionQueries[0]!\n : `${unionQueries.join(' UNION ALL ')} ORDER BY createdAt ASC, id ASC`;\n const result = await this.#db.executeQuery({ sql, params: unionParams });\n if (Array.isArray(result)) {\n allMessages.push(...result);\n }\n unionQueries.length = 0;\n unionParams.length = 0;\n };\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 // Check if adding this target's subqueries would exceed the batch limit\n const termsNeeded = withNextMessages > 0 ? 2 : 1;\n if (unionQueries.length + termsNeeded > MAX_UNION_TERMS) {\n await flushBatch();\n }\n\n unionQueries.push(`SELECT * FROM (\n SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId\n FROM ${tableName}\n WHERE thread_id = ?\n AND createdAt <= ?\n ORDER BY createdAt DESC, id DESC\n LIMIT ?\n )`);\n unionParams.push(target.threadId, target.createdAt, withPreviousMessages + 1);\n\n if (withNextMessages > 0) {\n unionQueries.push(`SELECT * FROM (\n SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId\n FROM ${tableName}\n WHERE thread_id = ?\n AND createdAt > ?\n ORDER BY createdAt ASC, id ASC\n LIMIT ?\n )`);\n unionParams.push(target.threadId, target.createdAt, withNextMessages);\n }\n }\n\n await flushBatch();\n\n // Parse message content and deduplicate\n const seen = new Set<string>();\n const processedMessages = allMessages\n .filter((message: Record<string, any>) => {\n const id = message.id as string;\n if (seen.has(id)) return false;\n seen.add(id);\n return true;\n })\n .map((message: Record<string, any>) => {\n const processedMsg: Record<string, any> = {};\n for (const [key, value] of Object.entries(message)) {\n if (key === `type` && value === `v2`) continue;\n processedMsg[key] = deserializeValue(value);\n }\n return processedMsg;\n });\n\n return processedMessages;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n const fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n const messages: any[] = [];\n\n try {\n const query = createSqlBuilder()\n .select(['id', 'content', 'role', 'type', 'createdAt', 'thread_id AS threadId', 'resourceId'])\n .from(fullTableName)\n .where(`id in (${messageIds.map(() => '?').join(',')})`, ...messageIds);\n\n query.orderBy('createdAt', 'DESC');\n\n const { sql, params } = query.build();\n\n const result = await this.#db.executeQuery({ sql, params });\n\n if (Array.isArray(result)) messages.push(...result);\n\n // Parse message content\n const processedMessages = messages.map(message => {\n const processedMsg: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(message)) {\n if (key === `type` && value === `v2`) continue;\n processedMsg[key] = deserializeValue(value);\n }\n\n return processedMsg;\n });\n this.logger.debug(`Retrieved ${messages.length} messages`);\n const list = new MessageList().add(processedMessages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to retrieve messages by ID: ${error instanceof Error ? error.message : String(error)}`,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n this.logger?.error(mastraError.toString());\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Normalize threadId to array\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? threadId.join(',') : threadId },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', '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 fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n\n // Step 1: Get paginated messages from the thread first (without excluding included ones)\n let query = `\n SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId\n FROM ${fullTableName}\n WHERE thread_id = ?\n `;\n const queryParams: any[] = [threadId];\n\n if (resourceId) {\n query += ` AND resourceId = ?`;\n queryParams.push(resourceId);\n }\n\n const dateRange = filter?.dateRange;\n if (dateRange?.start) {\n const startDate =\n dateRange.start instanceof Date ? serializeDate(dateRange.start) : serializeDate(new Date(dateRange.start));\n const startOp = dateRange.startExclusive ? '>' : '>=';\n query += ` AND createdAt ${startOp} ?`;\n queryParams.push(startDate);\n }\n\n if (dateRange?.end) {\n const endDate =\n dateRange.end instanceof Date ? serializeDate(dateRange.end) : serializeDate(new Date(dateRange.end));\n const endOp = dateRange.endExclusive ? '<' : '<=';\n query += ` AND createdAt ${endOp} ?`;\n queryParams.push(endDate);\n }\n\n // Build ORDER BY clause\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n\n // When perPage is 0 with no includes, there's nothing to return.\n if (perPage === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // When perPage is 0 and we have include targets, skip COUNT and data queries.\n // This is the semantic recall path where we only need the included messages.\n if (perPage === 0 && include && include.length > 0) {\n const includeResult = await this._getIncludedMessages(include);\n if (!Array.isArray(includeResult) || includeResult.length === 0) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n const list = new MessageList().add(includeResult as MastraMessageV1[] | MastraDBMessage[], 'memory');\n return {\n messages: this._sortMessages(list.get.all.db(), field, direction),\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n query += ` ORDER BY \"${field}\" ${direction}`;\n\n // Apply pagination\n if (perPage !== Number.MAX_SAFE_INTEGER) {\n query += ` LIMIT ? OFFSET ?`;\n queryParams.push(perPage, offset);\n }\n\n const results = await this.#db.executeQuery({ sql: query, params: queryParams });\n\n // Parse message content\n const paginatedMessages = (isArrayOfRecords(results) ? results : []).map((message: Record<string, any>) => {\n const processedMsg: Record<string, any> = {};\n for (const [key, value] of Object.entries(message)) {\n if (key === `type` && value === `v2`) continue;\n processedMsg[key] = deserializeValue(value);\n }\n return processedMsg;\n });\n\n const paginatedCount = paginatedMessages.length;\n\n // Get total count\n let countQuery = `SELECT count() as count FROM ${fullTableName} WHERE thread_id = ?`;\n const countParams: any[] = [threadId];\n\n if (resourceId) {\n countQuery += ` AND resourceId = ?`;\n countParams.push(resourceId);\n }\n\n if (dateRange?.start) {\n const startDate =\n dateRange.start instanceof Date ? serializeDate(dateRange.start) : serializeDate(new Date(dateRange.start));\n const startOp = dateRange.startExclusive ? '>' : '>=';\n countQuery += ` AND createdAt ${startOp} ?`;\n countParams.push(startDate);\n }\n\n if (dateRange?.end) {\n const endDate =\n dateRange.end instanceof Date ? serializeDate(dateRange.end) : serializeDate(new Date(dateRange.end));\n const endOp = dateRange.endExclusive ? '<' : '<=';\n countQuery += ` AND createdAt ${endOp} ?`;\n countParams.push(endDate);\n }\n\n const countResult = (await this.#db.executeQuery({ sql: countQuery, params: countParams })) as {\n count: number;\n }[];\n const total = Number(countResult[0]?.count ?? 0);\n\n // Only return early if there are no messages AND no includes to process\n if (total === 0 && paginatedCount === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Step 2: Add included messages with context (if any), excluding duplicates\n const messageIds = new Set(paginatedMessages.map((m: Record<string, any>) => m.id as string));\n let includeMessages: MastraDBMessage[] = [];\n\n if (include && include.length > 0) {\n // Use the existing _getIncludedMessages helper, but adapt it for listMessages format\n const includeResult = (await this._getIncludedMessages(include)) as MastraDBMessage[];\n if (Array.isArray(includeResult)) {\n includeMessages = includeResult;\n\n // Deduplicate: only add messages that aren't already in the paginated results\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n paginatedMessages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n // Use MessageList for proper deduplication and format conversion to V2\n const list = new MessageList().add(paginatedMessages as MastraMessageV1[] | MastraDBMessage[], 'memory');\n const finalMessages = this._sortMessages(list.get.all.db(), field, direction);\n\n // Calculate hasMore based on pagination window\n // If all thread messages have been returned (through pagination or include), hasMore = false\n // Otherwise, check if there are more pages in the pagination window\n const returnedThreadMessageIds = new Set(finalMessages.filter(m => m.threadId === threadId).map(m => m.id));\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore =\n perPageInput === false ? false : allThreadMessagesReturned ? false : offset + paginatedCount < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to list messages for thread ${Array.isArray(threadId) ? threadId.join(',') : threadId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async updateMessages(args: {\n messages: Partial<Omit<MastraDBMessage, 'createdAt'>> &\n {\n id: string;\n content?: {\n metadata?: MastraMessageContentV2['metadata'];\n content?: MastraMessageContentV2['content'];\n };\n }[];\n }): Promise<MastraDBMessage[]> {\n const { messages } = args;\n this.logger.debug('Updating messages', { count: messages.length });\n\n if (!messages.length) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n const fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n const threadsTableName = this.#db.getTableName(TABLE_THREADS);\n\n try {\n // Get existing messages\n const placeholders = messageIds.map(() => '?').join(',');\n const selectQuery = `SELECT id, content, role, type, createdAt, thread_id AS threadId, resourceId FROM ${fullTableName} WHERE id IN (${placeholders})`;\n const existingMessages = (await this.#db.executeQuery({ sql: selectQuery, params: messageIds })) as any[];\n\n if (existingMessages.length === 0) {\n return [];\n }\n\n // Parse content from string to object for merging\n const parsedExistingMessages = existingMessages.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg;\n });\n\n const threadIdsToUpdate = new Set<string>();\n const updateQueries: { sql: string; params: any[] }[] = [];\n\n for (const existingMessage of parsedExistingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (\n 'threadId' in updatePayload &&\n updatePayload.threadId &&\n updatePayload.threadId !== existingMessage.threadId\n ) {\n threadIdsToUpdate.add(updatePayload.threadId as string);\n }\n\n const setClauses: string[] = [];\n const values: any[] = [];\n\n const updatableFields = { ...fieldsToUpdate };\n\n // Special handling for content: merge in code, then update the whole field\n if (updatableFields.content) {\n const existingContent = existingMessage.content || {};\n const newContent = {\n ...existingContent,\n ...updatableFields.content,\n // Deep merge metadata if it exists on both\n ...(existingContent?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingContent.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n setClauses.push(`content = ?`);\n values.push(JSON.stringify(newContent));\n delete updatableFields.content;\n }\n\n // Handle other fields\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = key === 'threadId' ? 'thread_id' : key;\n setClauses.push(`${dbColumn} = ?`);\n values.push(updatableFields[key as keyof typeof updatableFields]);\n }\n }\n\n if (setClauses.length > 0) {\n values.push(id);\n const updateQuery = `UPDATE ${fullTableName} SET ${setClauses.join(', ')} WHERE id = ?`;\n updateQueries.push({ sql: updateQuery, params: values });\n }\n }\n\n // Execute all updates\n for (const query of updateQueries) {\n await this.#db.executeQuery(query);\n }\n\n // Update thread timestamps\n if (threadIdsToUpdate.size > 0) {\n const threadPlaceholders = Array.from(threadIdsToUpdate)\n .map(() => '?')\n .join(',');\n const threadUpdateQuery = `UPDATE ${threadsTableName} SET updatedAt = ? WHERE id IN (${threadPlaceholders})`;\n const threadUpdateParams = [new Date().toISOString(), ...Array.from(threadIdsToUpdate)];\n await this.#db.executeQuery({ sql: threadUpdateQuery, params: threadUpdateParams });\n }\n\n // Re-fetch updated messages\n const updatedMessages = (await this.#db.executeQuery({ sql: selectQuery, params: messageIds })) as any[];\n\n // Parse content back to objects\n return updatedMessages.map(message => {\n if (typeof message.content === 'string') {\n try {\n message.content = JSON.parse(message.content);\n } catch {\n // ignore if not valid json\n }\n }\n return message;\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: messages.length },\n },\n error,\n );\n }\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (messageIds.length === 0) return;\n\n const fullTableName = this.#db.getTableName(TABLE_MESSAGES);\n const threadsTableName = this.#db.getTableName(TABLE_THREADS);\n\n try {\n // Get unique thread IDs from messages before deleting\n const placeholders = messageIds.map(() => '?').join(',');\n const selectQuery = `SELECT DISTINCT thread_id FROM ${fullTableName} WHERE id IN (${placeholders})`;\n const threadResults = (await this.#db.executeQuery({ sql: selectQuery, params: messageIds })) as any[];\n const threadIds = threadResults.map((r: any) => r.thread_id).filter(Boolean);\n\n // Delete the messages\n const deleteQuery = createSqlBuilder()\n .delete(fullTableName)\n .where(`id IN (${placeholders})`, ...messageIds);\n const { sql, params } = deleteQuery.build();\n await this.#db.executeQuery({ sql, params });\n\n // Update thread timestamps for affected threads\n if (threadIds.length > 0) {\n const threadPlaceholders = threadIds.map(() => '?').join(',');\n const threadUpdateQuery = `UPDATE ${threadsTableName} SET updatedAt = ? WHERE id IN (${threadPlaceholders})`;\n const threadUpdateParams = [new Date().toISOString(), ...threadIds];\n await this.#db.executeQuery({ sql: threadUpdateQuery, params: threadUpdateParams });\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n }\n }\n}\n","import { ErrorDomain, ErrorCategory, MastraError } from '@mastra/core/error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport {\n createStorageErrorId,\n ScoresStorage,\n TABLE_SCORERS,\n TABLE_SCHEMAS,\n calculatePagination,\n normalizePerPage,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport type { StoragePagination } from '@mastra/core/storage';\nimport { D1DB, resolveD1Config } from '../../db';\nimport type { D1DomainConfig } from '../../db';\nimport { createSqlBuilder } from '../../sql-builder';\n\n/**\n * Cloudflare D1-specific score row transformation.\n * Uses Z-suffix timestamps (createdAtZ, updatedAtZ) when available.\n */\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row, {\n preferredTimestampFields: {\n createdAt: 'createdAtZ',\n updatedAt: 'updatedAtZ',\n },\n });\n}\n\nexport class ScoresStorageD1 extends ScoresStorage {\n #db: D1DB;\n\n constructor(config: D1DomainConfig) {\n super();\n this.#db = new D1DB(resolveD1Config(config));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SCORERS });\n }\n\n async getScoreById({ id }: { id: string }): Promise<ScoreRowData | null> {\n try {\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n const query = createSqlBuilder().select('*').from(fullTableName).where('id = ?', id);\n const { sql, params } = query.build();\n\n const result = await this.#db.executeQuery({ sql, params, first: true });\n\n if (!result) {\n return null;\n }\n\n return transformScoreRow(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n const id = crypto.randomUUID();\n\n try {\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Serialize all object values to JSON strings\n const serializedRecord: Record<string, any> = {};\n for (const [key, value] of Object.entries(parsedScore)) {\n if (value !== null && value !== undefined) {\n if (typeof value === 'object') {\n serializedRecord[key] = JSON.stringify(value);\n } else {\n serializedRecord[key] = value;\n }\n } else {\n serializedRecord[key] = null;\n }\n }\n\n const now = new Date();\n serializedRecord.id = id;\n serializedRecord.createdAt = now.toISOString();\n serializedRecord.updatedAt = now.toISOString();\n\n const columns = Object.keys(serializedRecord);\n const values = Object.values(serializedRecord);\n\n const query = createSqlBuilder().insert(fullTableName, columns, values);\n const { sql, params } = query.build();\n\n await this.#db.executeQuery({ sql, params });\n\n return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async listScoresByScorerId({\n scorerId,\n entityId,\n entityType,\n source,\n pagination,\n }: {\n scorerId: string;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder().count().from(fullTableName).where('scorerId = ?', scorerId);\n if (entityId) {\n countQuery.andWhere('entityId = ?', entityId);\n }\n if (entityType) {\n countQuery.andWhere('entityType = ?', entityType);\n }\n if (source) {\n countQuery.andWhere('source = ?', source);\n }\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder().select('*').from(fullTableName).where('scorerId = ?', scorerId);\n\n if (entityId) {\n selectQuery.andWhere('entityId = ?', entityId);\n }\n if (entityType) {\n selectQuery.andWhere('entityType = ?', entityType);\n }\n if (source) {\n selectQuery.andWhere('source = ?', source);\n }\n selectQuery.limit(limitValue).offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder().count().from(fullTableName).where('runId = ?', runId);\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder()\n .select('*')\n .from(fullTableName)\n .where('runId = ?', runId)\n .limit(limitValue)\n .offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder()\n .count()\n .from(fullTableName)\n .where('entityId = ?', entityId)\n .andWhere('entityType = ?', entityType);\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder()\n .select('*')\n .from(fullTableName)\n .where('entityId = ?', entityId)\n .andWhere('entityType = ?', entityType)\n .limit(limitValue)\n .offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n const fullTableName = this.#db.getTableName(TABLE_SCORERS);\n\n // Get total count\n const countQuery = createSqlBuilder()\n .count()\n .from(fullTableName)\n .where('traceId = ?', traceId)\n .andWhere('spanId = ?', spanId);\n const countResult = await this.#db.executeQuery(countQuery.build());\n const total = Array.isArray(countResult) ? Number(countResult?.[0]?.count ?? 0) : Number(countResult?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const end = perPageInput === false ? total : start + perPage;\n const limitValue = perPageInput === false ? total : perPage;\n\n // Get paginated results\n const selectQuery = createSqlBuilder()\n .select('*')\n .from(fullTableName)\n .where('traceId = ?', traceId)\n .andWhere('spanId = ?', spanId)\n .orderBy('createdAt', 'DESC')\n .limit(limitValue)\n .offset(start);\n\n const { sql, params } = selectQuery.build();\n const results = await this.#db.executeQuery({ sql, params });\n const scores = Array.isArray(results) ? results.map(transformScoreRow) : [];\n\n return {\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: end < total,\n },\n scores,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_SCORES_BY_SPAN', '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 {\n WorkflowRun,\n WorkflowRuns,\n StorageListWorkflowRunsInput,\n UpdateWorkflowStateOptions,\n} from '@mastra/core/storage';\nimport {\n createStorageErrorId,\n ensureDate,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { D1DB, resolveD1Config } from '../../db';\nimport type { D1DomainConfig } from '../../db';\nimport { createSqlBuilder } from '../../sql-builder';\nimport type { SqlParam } from '../../sql-builder';\nimport { isArrayOfRecords } from '../utils';\n\nexport class WorkflowsStorageD1 extends WorkflowsStorage {\n #db: D1DB;\n\n constructor(config: D1DomainConfig) {\n super();\n this.#db = new D1DB(resolveD1Config(config));\n }\n\n supportsConcurrentUpdates(): boolean {\n // D1 doesn't support atomic read-modify-write operations needed for concurrent updates\n // batch() executes all statements atomically but requires all statements upfront,\n // so we can't use SELECT result to construct UPDATE in the same transaction\n return false;\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT] });\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n async updateWorkflowResults(_args: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error(\n 'updateWorkflowResults is not implemented for Cloudflare D1 storage. D1 does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async updateWorkflowState(_args: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n throw new Error(\n 'updateWorkflowState is not implemented for Cloudflare D1 storage. D1 does not support atomic read-modify-write operations needed for concurrent workflow updates.',\n );\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n const now = new Date().toISOString();\n\n const currentSnapshot = await this.#db.load({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n const persisting = currentSnapshot\n ? {\n ...currentSnapshot,\n resourceId,\n snapshot: JSON.stringify(snapshot),\n updatedAt: updatedAt ? updatedAt.toISOString() : now,\n }\n : {\n workflow_name: workflowName,\n run_id: runId,\n resourceId,\n snapshot: snapshot as Record<string, any>,\n createdAt: createdAt ? createdAt.toISOString() : now,\n updatedAt: updatedAt ? updatedAt.toISOString() : now,\n };\n\n // Process record for SQL insertion\n const processedRecord = await this.#db.processRecord(persisting);\n\n const columns = Object.keys(processedRecord);\n const values = Object.values(processedRecord);\n\n // Specify which columns to update on conflict (all except PKs)\n const updateMap: Record<string, string> = {\n snapshot: 'excluded.snapshot',\n updatedAt: 'excluded.updatedAt',\n };\n\n this.logger.debug('Persisting workflow snapshot', { workflowName, runId });\n\n // Use the new insert method with ON CONFLICT\n const query = createSqlBuilder().insert(fullTableName, columns, values, ['workflow_name', 'run_id'], updateMap);\n\n const { sql, params } = query.build();\n\n try {\n await this.#db.executeQuery({ sql, params });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to persist workflow snapshot: ${error instanceof Error ? error.message : String(error)}`,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot(params: { workflowName: string; runId: string }): Promise<WorkflowRunState | null> {\n const { workflowName, runId } = params;\n\n this.logger.debug('Loading workflow snapshot', { workflowName, runId });\n\n try {\n const d = await this.#db.load<{ snapshot: unknown }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: {\n workflow_name: workflowName,\n run_id: runId,\n },\n });\n\n return d ? (d.snapshot as WorkflowRunState) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to load workflow snapshot: ${error instanceof Error ? error.message : String(error)}`,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n private parseWorkflowRun(row: any): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n // If parsing fails, return the raw snapshot string\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n\n return {\n workflowName: row.workflow_name,\n runId: row.run_id,\n snapshot: parsedSnapshot,\n createdAt: ensureDate(row.createdAt)!,\n updatedAt: ensureDate(row.updatedAt)!,\n resourceId: row.resourceId,\n };\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n const builder = createSqlBuilder().select().from(fullTableName);\n const countBuilder = createSqlBuilder().count().from(fullTableName);\n\n if (workflowName) builder.whereAnd('workflow_name = ?', workflowName);\n if (status) {\n builder.whereAnd(\"json_extract(snapshot, '$.status') = ?\", status);\n countBuilder.whereAnd(\"json_extract(snapshot, '$.status') = ?\", status);\n }\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(fullTableName, 'resourceId');\n if (hasResourceId) {\n builder.whereAnd('resourceId = ?', resourceId);\n countBuilder.whereAnd('resourceId = ?', resourceId);\n } else {\n this.logger.warn(`[${fullTableName}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n if (fromDate) {\n builder.whereAnd('createdAt >= ?', fromDate instanceof Date ? fromDate.toISOString() : fromDate);\n countBuilder.whereAnd('createdAt >= ?', fromDate instanceof Date ? fromDate.toISOString() : fromDate);\n }\n if (toDate) {\n builder.whereAnd('createdAt <= ?', toDate instanceof Date ? toDate.toISOString() : toDate);\n countBuilder.whereAnd('createdAt <= ?', toDate instanceof Date ? toDate.toISOString() : toDate);\n }\n\n builder.orderBy('createdAt', 'DESC');\n if (typeof perPage === 'number' && typeof page === 'number') {\n const offset = page * perPage;\n builder.limit(perPage);\n builder.offset(offset);\n }\n\n const { sql, params } = builder.build();\n\n let total = 0;\n\n if (perPage !== undefined && page !== undefined) {\n const { sql: countSql, params: countParams } = countBuilder.build();\n const countResult = await this.#db.executeQuery({\n sql: countSql,\n params: countParams,\n first: true,\n });\n total = Number((countResult as Record<string, any>)?.count ?? 0);\n }\n\n const results = await this.#db.executeQuery({ sql, params });\n const runs = (isArrayOfRecords(results) ? results : []).map((row: any) => this.parseWorkflowRun(row));\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to retrieve workflow runs: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n workflowName: workflowName ?? '',\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n const conditions: string[] = [];\n const params: SqlParam[] = [];\n if (runId) {\n conditions.push('run_id = ?');\n params.push(runId);\n }\n if (workflowName) {\n conditions.push('workflow_name = ?');\n params.push(workflowName);\n }\n const whereClause = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';\n const sql = `SELECT * FROM ${fullTableName} ${whereClause} ORDER BY createdAt DESC LIMIT 1`;\n const result = await this.#db.executeQuery({ sql, params, first: true });\n if (!result) return null;\n return this.parseWorkflowRun(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to retrieve workflow run by ID: ${error instanceof Error ? error.message : String(error)}`,\n details: { runId, workflowName: workflowName ?? '' },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const fullTableName = this.#db.getTableName(TABLE_WORKFLOW_SNAPSHOT);\n try {\n const sql = `DELETE FROM ${fullTableName} WHERE workflow_name = ? AND run_id = ?`;\n const params: SqlParam[] = [workflowName, runId];\n await this.#db.executeQuery({ sql, params });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Failed to delete workflow run by ID: ${error instanceof Error ? error.message : String(error)}`,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n}\n","import type { D1Database } from '@cloudflare/workers-types';\nimport { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport Cloudflare from 'cloudflare';\nimport { MemoryStorageD1 } from './domains/memory';\nimport { ScoresStorageD1 } from './domains/scores';\nimport { WorkflowsStorageD1 } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { MemoryStorageD1, ScoresStorageD1, WorkflowsStorageD1 };\nexport type { D1DomainConfig } from './db';\n\n/**\n * Base configuration options shared across D1 configurations\n */\nexport interface D1BaseConfig {\n /** Storage instance ID */\n id: string;\n /** Optional prefix for table names */\n tablePrefix?: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new D1Store({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new D1Store({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n}\n\n/**\n * Configuration for D1 using the REST API\n */\nexport interface D1Config extends D1BaseConfig {\n /** Cloudflare account ID */\n accountId: string;\n /** Cloudflare API token with D1 access */\n apiToken: string;\n /** D1 database ID */\n databaseId: string;\n}\n\nexport interface D1ClientConfig extends D1BaseConfig {\n /** D1 Client */\n client: D1Client;\n}\n\n/**\n * Configuration for D1 using the Workers Binding API\n */\nexport interface D1WorkersConfig extends D1BaseConfig {\n /** D1 database binding from Workers environment */\n binding: D1Database; // D1Database binding from Workers\n}\n\n/**\n * Combined configuration type supporting both REST API and Workers Binding API\n */\nexport type D1StoreConfig = D1Config | D1WorkersConfig | D1ClientConfig;\n\nexport type D1QueryResult = Awaited<ReturnType<Cloudflare['d1']['database']['query']>>['result'];\nexport interface D1Client {\n query(args: { sql: string; params: string[] }): Promise<{ result: D1QueryResult }>;\n}\n\n/**\n * Cloudflare D1 storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new D1Store({ id: 'my-store', accountId: '...', apiToken: '...', databaseId: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class D1Store extends MastraCompositeStore {\n private client?: D1Client;\n private binding?: D1Database;\n private tablePrefix: string;\n\n stores: StorageDomains;\n\n /**\n * Creates a new D1Store instance\n * @param config Configuration for D1 access (either REST API or Workers Binding API)\n */\n constructor(config: D1StoreConfig) {\n try {\n super({ id: config.id, name: 'D1', disableInit: config.disableInit });\n\n if (config.tablePrefix && !/^[a-zA-Z0-9_]*$/.test(config.tablePrefix)) {\n throw new Error('Invalid tablePrefix: only letters, numbers, and underscores are allowed.');\n }\n\n this.tablePrefix = config.tablePrefix || '';\n\n // Determine which API to use based on provided config\n if ('binding' in config) {\n if (!config.binding) {\n throw new Error('D1 binding is required when using Workers Binding API');\n }\n this.binding = config.binding;\n this.logger.info('Using D1 Workers Binding API');\n } else if ('client' in config) {\n if (!config.client) {\n throw new Error('D1 client is required when using D1ClientConfig');\n }\n this.client = config.client;\n this.logger.info('Using D1 Client');\n } else {\n if (!config.accountId || !config.databaseId || !config.apiToken) {\n throw new Error('accountId, databaseId, and apiToken are required when using REST API');\n }\n const cfClient = new Cloudflare({\n apiToken: config.apiToken,\n });\n this.client = {\n query: ({ sql, params }) => {\n return cfClient.d1.database.query(config.databaseId, {\n account_id: config.accountId,\n sql,\n params,\n });\n },\n };\n\n this.logger.info('Using D1 REST API');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('CLOUDFLARE_D1', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: 'Error initializing D1Store',\n },\n error,\n );\n }\n\n let scores: ScoresStorageD1;\n let workflows: WorkflowsStorageD1;\n let memory: MemoryStorageD1;\n\n if (this.binding) {\n const domainConfig = { binding: this.binding, tablePrefix: this.tablePrefix };\n scores = new ScoresStorageD1(domainConfig);\n workflows = new WorkflowsStorageD1(domainConfig);\n memory = new MemoryStorageD1(domainConfig);\n } else {\n const domainConfig = { client: this.client!, tablePrefix: this.tablePrefix };\n scores = new ScoresStorageD1(domainConfig);\n workflows = new WorkflowsStorageD1(domainConfig);\n memory = new MemoryStorageD1(domainConfig);\n }\n\n this.stores = {\n scores,\n workflows,\n memory,\n };\n }\n\n /**\n * Close the database connection\n * No explicit cleanup needed for D1 in either REST or Workers Binding mode\n */\n async close(): Promise<void> {\n this.logger.debug('Closing D1 connection');\n // No explicit cleanup needed for D1\n }\n}\n"]}
|