@mastra/spanner 1.0.0 → 1.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/mcp-servers/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/metrics.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/schedules/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts"],"names":["parseSqlIdentifier","TABLE_SCHEMAS","spanner","Spanner","MastraBase","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","getDefaultValue","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","error","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","AGENTS_SCHEMA","AGENT_VERSIONS_SCHEMA","normalizePerPage","calculatePagination","TABLE_BACKGROUND_TASKS","BackgroundTasksStorage","BlobStore","TABLE_SKILL_BLOBS","SKILL_BLOBS_SCHEMA","MCPClientsStorage","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","MCP_CLIENTS_SCHEMA","MCP_CLIENT_VERSIONS_SCHEMA","MCPServersStorage","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","MCP_SERVERS_SCHEMA","MCP_SERVER_VERSIONS_SCHEMA","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MessageList","METRIC_DISTINCT_COLUMNS","alias","randomUUID","listMetricsArgsSchema","rows","ObservabilityStorage","listTracesArgsSchema","TraceStatus","toTraceSpans","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","PROMPT_BLOCKS_SCHEMA","PROMPT_BLOCK_VERSIONS_SCHEMA","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","SchedulesStorage","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","SCORER_DEFINITIONS_SCHEMA","SCORER_DEFINITION_VERSIONS_SCHEMA","TABLE_SCORERS","coreTransformScoreRow","ScoresStorage","saveScorePayloadSchema","SkillsStorage","TABLE_SKILLS","TABLE_SKILL_VERSIONS","SKILLS_SCHEMA","SKILL_VERSIONS_SCHEMA","WorkflowsStorage","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\n/**\n * Quote a Spanner identifier with backticks. GoogleSQL uses backticks for\n * identifiers that may collide with reserved keywords.\n */\nexport function quoteIdent(name: string, kind = 'identifier'): string {\n const parsed = parseSqlIdentifier(name, kind);\n return `\\`${parsed}\\``;\n}\n\n/**\n * Returns the GoogleSQL type literal corresponding to a storage column type.\n */\nexport function getSpannerType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return 'STRING(MAX)';\n case 'uuid':\n return 'STRING(36)';\n case 'jsonb':\n // Stored as JSON in Spanner. JSON columns can hold up to 10 MB.\n return 'JSON';\n case 'timestamp':\n return 'TIMESTAMP';\n case 'integer':\n case 'bigint':\n return 'INT64';\n case 'float':\n return 'FLOAT64';\n case 'boolean':\n return 'BOOL';\n default:\n throw new Error(`Unsupported Spanner storage column type: ${type as string}`);\n }\n}\n\n/**\n * Returns the @google-cloud/spanner param type spec for a storage column type.\n * Used when binding `null` values where Spanner needs an explicit type hint.\n */\nexport function getSpannerParamType(type: StorageColumn['type'] | undefined): string {\n switch (type) {\n case 'jsonb':\n return 'json';\n case 'timestamp':\n return 'timestamp';\n case 'integer':\n case 'bigint':\n return 'int64';\n case 'float':\n return 'float64';\n case 'boolean':\n return 'bool';\n case 'uuid':\n case 'text':\n default:\n return 'string';\n }\n}\n\n/**\n * Look up the storage column definition for a (table, column) pair.\n * Returns undefined for columns not defined in the schema (e.g. internal columns).\n */\nexport function getColumnDef(table: TABLE_NAMES, column: string): StorageColumn | undefined {\n return TABLE_SCHEMAS[table]?.[column];\n}\n\n/**\n * Returns true if the value is the `$in` operator object used by storage filters.\n */\nexport function isInOperator(value: unknown): value is { $in: unknown[] } {\n return (\n typeof value === 'object' && value !== null && '$in' in value && Array.isArray((value as { $in: unknown[] }).$in)\n );\n}\n","import { Spanner } from '@google-cloud/spanner';\nimport type { Database, Transaction } from '@google-cloud/spanner';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_SPANS,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n getDefaultValue,\n} from '@mastra/core/storage';\nimport type {\n StorageColumn,\n TABLE_NAMES,\n CreateIndexOptions,\n IndexInfo,\n StorageIndexStats,\n} from '@mastra/core/storage';\nimport { getColumnDef, getSpannerParamType, getSpannerType, isInOperator, quoteIdent } from './utils';\n\n// Re-export the shared types for downstream consumers\nexport type { CreateIndexOptions, IndexInfo, StorageIndexStats };\n\n/**\n * Controls whether `init()` is allowed to apply schema changes.\n *\n * - `'sync'` (default): the adapter creates missing tables, columns, and\n * indexes during `init()`. This is the historical behavior.\n * - `'validate'`: the adapter applies no DDL during `init()` and instead\n * verifies that every table, column (from `alterTable.ifNotExists`), and\n * default/custom index it would have created already exists. Missing\n * schema elements throw a typed user error.\n *\n * `'validate'` is intended for environments where another process (Terraform,\n * Liquibase, a release pipeline, etc.) owns the schema and Mastra should only\n * verify that the live database matches what the adapter expects.\n */\nexport type SpannerInitMode = 'sync' | 'validate';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. A pre-configured `database` (the domain reuses it as-is), or\n * 2. Connection details from which the domain creates a Spanner client internally.\n */\nexport type SpannerDomainConfig = SpannerDomainDatabaseConfig | SpannerDomainConnectionConfig;\n\n/**\n * Reuse an existing Spanner Database handle.\n */\nexport interface SpannerDomainDatabaseConfig {\n database: Database;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n /** When true, skips creation of default indexes */\n skipDefaultIndexes?: boolean;\n /** See {@link SpannerInitMode}. Defaults to `'sync'`. */\n initMode?: SpannerInitMode;\n /**\n * When true, versioned domains (agents / skills / prompt-blocks /\n * mcp-clients / mcp-servers / scorer-definitions) sweep orphaned draft\n * thin-row records during `init()` i.e. drafts whose paired version row\n * was never written. Useful for cleaning up after process crashes that\n * pre-date the transactional `create()` rewrite, or for environments\n * where data integrity outweighs the small startup cost.\n * @default false\n */\n cleanupStaleDraftsOnStartup?: boolean;\n /**\n * Maximum acceptable staleness (in milliseconds) for read-only dashboard\n * queries in the observability domain (metrics list / aggregates /\n * breakdowns / time-series / percentiles / discovery). When > 0, these\n * reads are issued as single-use read-only transactions with\n * `maxStaleness`, which lets Spanner serve them from any replica that has\n * data at least that fresh — they stop contending with leader writes and\n * can be routed to a closer replica.\n *\n * Default is 0 (strong reads) for backwards compatibility and to keep\n * write-then-read paths in tests deterministic. For real dashboards,\n * 10000 (10 s) is a common sweet spot.\n * @default 0\n */\n dashboardStalenessMs?: number;\n /**\n * When true (the default), the observability domain's metric methods\n * (`batchCreateMetrics`, `listMetrics`, `getMetricAggregate`, etc.) throw\n * the base-class `*_NOT_IMPLEMENTED` errors and the metrics table is not\n * created during `init()`. The `MastraStorageExporter` treats these\n * errors as a signal to silently drop metric emissions, which is the\n * recommended default for Spanner deployments: Spanner is row-oriented\n * and OLTP-shaped, which makes it a poor fit for the high-volume,\n * write-heavy, scan-heavy metrics workload. Pair Spanner spans with a\n * dedicated OLAP store for metrics (BigQuery, DuckDB, ClickHouse) via a\n * `MastraCompositeStore`-level wrapper that fans out by signal.\n *\n * Set to `false` to opt back in to the Spanner metrics implementation.\n * It is correct and bounded at small scale (sustained < ~50 metrics/sec,\n * < 1 yr retention), but past that you will hit hot-tail write\n * contention on the leading-name index and analytical queries will start\n * competing with span writes for node CPU.\n * @default true\n */\n disableMetrics?: boolean;\n}\n\n/**\n * Create a Spanner client internally from connection details.\n */\nexport interface SpannerDomainConnectionConfig {\n projectId: string;\n instanceId: string;\n databaseId: string;\n /** Optional pass-through to the Spanner client constructor (auth, servicePath, etc.) */\n spannerOptions?: ConstructorParameters<typeof Spanner>[0];\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n /** When true, skips creation of default indexes */\n skipDefaultIndexes?: boolean;\n /** See {@link SpannerInitMode}. Defaults to `'sync'`. */\n initMode?: SpannerInitMode;\n /** See {@link SpannerDomainDatabaseConfig.cleanupStaleDraftsOnStartup}. Defaults to `false`. */\n cleanupStaleDraftsOnStartup?: boolean;\n /** See {@link SpannerDomainDatabaseConfig.dashboardStalenessMs}. Defaults to `0`. */\n dashboardStalenessMs?: number;\n /** See {@link SpannerDomainDatabaseConfig.disableMetrics}. Defaults to `true`. */\n disableMetrics?: boolean;\n}\n\n/**\n * Resolves a SpannerDomainConfig into a concrete Database handle plus options.\n */\nexport function resolveSpannerConfig(config: SpannerDomainConfig): {\n database: Database;\n indexes?: CreateIndexOptions[];\n skipDefaultIndexes?: boolean;\n initMode?: SpannerInitMode;\n cleanupStaleDraftsOnStartup?: boolean;\n dashboardStalenessMs?: number;\n disableMetrics?: boolean;\n ownsClient: boolean;\n} {\n if ('database' in config && config.database) {\n return {\n database: config.database,\n indexes: config.indexes,\n skipDefaultIndexes: config.skipDefaultIndexes,\n initMode: config.initMode,\n cleanupStaleDraftsOnStartup: config.cleanupStaleDraftsOnStartup,\n dashboardStalenessMs: config.dashboardStalenessMs,\n disableMetrics: config.disableMetrics,\n ownsClient: false,\n };\n }\n\n const connectionConfig = config as SpannerDomainConnectionConfig;\n const spanner = new Spanner({\n projectId: connectionConfig.projectId,\n ...(connectionConfig.spannerOptions ?? {}),\n });\n const database = spanner.instance(connectionConfig.instanceId).database(connectionConfig.databaseId);\n\n return {\n database,\n indexes: connectionConfig.indexes,\n skipDefaultIndexes: connectionConfig.skipDefaultIndexes,\n initMode: connectionConfig.initMode,\n cleanupStaleDraftsOnStartup: connectionConfig.cleanupStaleDraftsOnStartup,\n dashboardStalenessMs: connectionConfig.dashboardStalenessMs,\n disableMetrics: connectionConfig.disableMetrics,\n ownsClient: true,\n };\n}\n\n/**\n * Internal helper that performs all GoogleSQL Spanner work for the various domain\n * implementations (memory, workflows, scores, background-tasks).\n */\nexport class SpannerDB extends MastraBase {\n public database: Database;\n public skipDefaultIndexes?: boolean;\n /** See {@link SpannerInitMode}. Public so domains can branch on it for\n * domain-specific schema work that doesn't go through this class\n * (e.g. the workflows snapshotStatus generated column). */\n public readonly initMode: SpannerInitMode;\n /** Public so versioned domains can decide whether to call their\n * cleanupStaleDrafts() helper during init(). Default false. */\n public readonly cleanupStaleDraftsOnStartup: boolean;\n\n /** Cache of actual table columns: tableName -> Set<columnName> */\n private tableColumnsCache = new Map<string, Set<string>>();\n\n constructor({\n database,\n skipDefaultIndexes,\n initMode,\n cleanupStaleDraftsOnStartup,\n }: {\n database: Database;\n skipDefaultIndexes?: boolean;\n initMode?: SpannerInitMode;\n cleanupStaleDraftsOnStartup?: boolean;\n }) {\n super({ component: 'STORAGE', name: 'SpannerDB' });\n this.database = database;\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.initMode = initMode ?? 'sync';\n this.cleanupStaleDraftsOnStartup = cleanupStaleDraftsOnStartup ?? false;\n }\n\n /**\n * Builds a typed user-facing error for validate-mode schema mismatches so\n * operators get a clear signal that the externally-managed schema is out\n * of date relative to what the adapter expects.\n */\n private validateError(\n action: string,\n message: string,\n details: Record<string, string | number | boolean | null>,\n ): MastraError {\n return new MastraError({\n id: createStorageErrorId('SPANNER', action, 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: message,\n details,\n });\n }\n\n /** Returns the set of column names that actually exist in the database table. */\n private async getTableColumns(tableName: TABLE_NAMES): Promise<Set<string>> {\n const cached = this.tableColumnsCache.get(tableName);\n if (cached) return cached;\n\n const [rows] = await this.database.run({\n sql: `SELECT COLUMN_NAME\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n const columns = new Set((rows as Array<{ COLUMN_NAME: string }>).map(r => r.COLUMN_NAME));\n if (columns.size > 0) {\n this.tableColumnsCache.set(tableName, columns);\n }\n return columns;\n }\n\n /** Returns true if the named table exists. */\n private async tableExists(tableName: string): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n /** Returns true if `column` exists on `table`. */\n async hasColumn(table: string, column: string): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @table AND COLUMN_NAME = @column`,\n params: { table, column },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n /** Returns true if the named index exists. */\n private async indexExists(indexName: string): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found\n FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n /**\n * Filter a record to only contain columns that exist in the live database table.\n * Unknown columns are silently dropped to ensure forward compatibility with newer\n * code writing columns the database hasn't been migrated to yet.\n */\n private async filterRecordToKnownColumns(\n tableName: TABLE_NAMES,\n record: Record<string, any>,\n ): Promise<Record<string, any>> {\n const knownColumns = await this.getTableColumns(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 protected getDefaultLiteral(type: StorageColumn['type']): string {\n switch (type) {\n case 'timestamp':\n // Spanner uses CURRENT_TIMESTAMP() rather than NOW()\n return 'DEFAULT (CURRENT_TIMESTAMP())';\n case 'jsonb':\n return \"DEFAULT (JSON '{}')\";\n case 'boolean':\n return 'DEFAULT (FALSE)';\n case 'integer':\n case 'bigint':\n return 'DEFAULT (0)';\n case 'float':\n return 'DEFAULT (0.0)';\n case 'text':\n case 'uuid':\n return getDefaultValue(type);\n default:\n return getDefaultValue(type);\n }\n }\n\n /** Build the column definition fragment for a CREATE TABLE statement. */\n private buildColumnDefinition(name: string, def: StorageColumn): string {\n const fragments = [`${quoteIdent(name, 'column name')} ${getSpannerType(def.type)}`];\n if (!def.nullable) {\n fragments.push('NOT NULL');\n }\n return fragments.join(' ');\n }\n\n /** Apply DDL statements via `database.updateSchema` and wait for the operation. */\n private async runDdl(statements: string[]): Promise<void> {\n if (statements.length === 0) return;\n const [operation] = await this.database.updateSchema(statements);\n await operation.promise();\n }\n\n /**\n * Run a single DML statement either inside the provided transaction or by\n * starting a new short-lived read-write transaction. Spanner's `Database`\n * surface exposes only `run` (read-only); DML must always go through a\n * transaction.\n *\n * Auto-retries on `ABORTED` (gRPC code 10) Spanner aborts read-write\n * transactions when they conflict with another, and the official guidance is\n * to retry from the start. The emulator hits this much more often than\n * managed Spanner because it serializes all read-write work.\n */\n async runDml(\n request: { sql: string; params?: Record<string, any>; types?: Record<string, any> },\n transaction?: Transaction,\n ): Promise<number> {\n if (transaction) {\n const [count] = await transaction.runUpdate(request);\n return Number(count ?? 0);\n }\n return this.runWithAbortRetry(async () => {\n let count = 0;\n await this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n const [c] = await tx.runUpdate(request);\n count = Number(c ?? 0);\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // explicitly release the transaction so its row locks are freed.\n await tx.rollback().catch(() => {});\n throw err;\n }\n });\n return count;\n });\n }\n\n /**\n * Retries `fn` on Spanner ABORTED errors with exponential backoff.\n * Caps at 5 attempts (~1.5s total backoff) before surfacing the error.\n *\n * Public so domain implementations can wrap their own\n * `database.runTransactionAsync` calls when running concurrent writes.\n */\n async runWithAbortRetry<T>(fn: () => Promise<T>): Promise<T> {\n const maxAttempts = 5;\n let attempt = 0;\n let delay = 50;\n while (true) {\n try {\n return await fn();\n } catch (error: any) {\n attempt++;\n const aborted = error && (error.code === 10 || /ABORTED/i.test(String(error?.message ?? '')));\n if (!aborted || attempt >= maxAttempts) {\n throw error;\n }\n await new Promise(resolve => setTimeout(resolve, delay + Math.random() * delay));\n delay *= 2;\n }\n }\n }\n\n /**\n * Determine the primary-key column list for a table. Some core tables (like\n * `mastra_workflow_snapshot`) don't carry a single-column PK in the schema,\n * so we hardcode known composite PKs here.\n */\n private getPrimaryKeyColumns(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): string[] {\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n return ['workflow_name', 'run_id'];\n }\n if (tableName === TABLE_SPANS) {\n return ['traceId', 'spanId'];\n }\n const pk = Object.entries(schema)\n .filter(([, col]) => col.primaryKey)\n .map(([name]) => name);\n if (pk.length > 0) return pk;\n const first = Object.keys(schema)[0];\n return first ? [first] : [];\n }\n\n private async validateTableSchema(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): Promise<void> {\n const [rows] = await this.database.run({\n sql: `SELECT COLUMN_NAME, SPANNER_TYPE, IS_NULLABLE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n const actual = new Map<string, { type: string; nullable: boolean }>();\n for (const row of rows as Array<{\n COLUMN_NAME: string;\n SPANNER_TYPE: string;\n IS_NULLABLE: string | boolean;\n }>) {\n actual.set(row.COLUMN_NAME, {\n type: row.SPANNER_TYPE,\n nullable: row.IS_NULLABLE === true || row.IS_NULLABLE === 'YES',\n });\n }\n\n const missing: string[] = [];\n const wrongType: string[] = [];\n const wrongNullability: string[] = [];\n for (const [columnName, expected] of Object.entries(schema)) {\n const live = actual.get(columnName);\n if (!live) {\n missing.push(columnName);\n continue;\n }\n // Compare canonical Spanner types so STRING/STRING(MAX) etc. don't\n // false-positive. Reuse the same type generator that createTable would\n // emit; INFORMATION_SCHEMA reports STRING(MAX) as `STRING(MAX)` (and\n // similarly for BYTES/NUMERIC).\n const expectedType = getSpannerType(expected.type).toUpperCase();\n const actualType = live.type.toUpperCase();\n if (expectedType !== actualType) {\n wrongType.push(`${columnName} (expected ${expectedType}, actual ${live.type})`);\n }\n // Match buildColumnDefinition: a column is NOT NULL unless `nullable`\n // is explicitly true. Plain `undefined` defaults to NOT NULL, mirroring\n // the DDL we would have emitted.\n const expectedNullable = expected.nullable === true;\n if (expectedNullable !== live.nullable) {\n wrongNullability.push(\n `${columnName} (expected ${expectedNullable ? 'NULLABLE' : 'NOT NULL'}, actual ${live.nullable ? 'NULLABLE' : 'NOT NULL'})`,\n );\n }\n }\n\n if (missing.length === 0 && wrongType.length === 0 && wrongNullability.length === 0) return;\n\n const segments: string[] = [];\n if (missing.length > 0) segments.push(`missing columns: ${missing.join(', ')}`);\n if (wrongType.length > 0) segments.push(`type mismatch: ${wrongType.join('; ')}`);\n if (wrongNullability.length > 0) segments.push(`nullability mismatch: ${wrongNullability.join('; ')}`);\n throw this.validateError(\n 'CREATE_TABLE',\n `Table ${tableName} does not match expected schema (${segments.join(' | ')})`,\n {\n tableName,\n missing: missing.join(','),\n wrongType: wrongType.join(';'),\n wrongNullability: wrongNullability.join(';'),\n },\n );\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 exists = await this.tableExists(tableName);\n if (this.initMode === 'validate') {\n if (!exists) {\n throw this.validateError(\n 'CREATE_TABLE',\n `Table ${tableName} does not exist (initMode='validate' will not create it)`,\n { tableName },\n );\n }\n await this.validateTableSchema(tableName, schema);\n return;\n }\n if (exists) return;\n\n const columnFragments = Object.entries(schema).map(([name, def]) => this.buildColumnDefinition(name, def));\n const pkColumns = this.getPrimaryKeyColumns(tableName, schema);\n if (pkColumns.length === 0) {\n throw new Error(`Cannot create table ${tableName}: no primary key columns determined`);\n }\n\n const pkClause = `PRIMARY KEY (${pkColumns.map(c => quoteIdent(c, 'column name')).join(', ')})`;\n const ddl = `CREATE TABLE ${quoteIdent(tableName, 'table name')} (\\n ${columnFragments.join(',\\n ')}\\n) ${pkClause}`;\n await this.runDdl([ddl]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n /**\n * Adds columns from `schema` that don't yet exist on the table.\n * Useful for forward-compatible schema migrations.\n */\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n if (this.initMode === 'validate') {\n const missing: string[] = [];\n for (const columnName of ifNotExists) {\n // Only validate columns that actually appear in the schema.\n if (!schema[columnName]) continue;\n if (!(await this.hasColumn(tableName, columnName))) missing.push(columnName);\n }\n if (missing.length > 0) {\n throw this.validateError(\n 'ALTER_TABLE',\n `Missing columns on ${tableName}: ${missing.join(', ')} (initMode='validate' will not add them)`,\n { tableName, missing: missing.join(',') },\n );\n }\n return;\n }\n const statements: string[] = [];\n for (const columnName of ifNotExists) {\n const columnDef = schema[columnName];\n if (!columnDef) continue;\n if (await this.hasColumn(tableName, columnName)) continue;\n // Spanner cannot add NOT NULL columns to existing tables without a default,\n // so newly-added columns are always nullable initially.\n const fragment = `${quoteIdent(columnName, 'column name')} ${getSpannerType(columnDef.type)}`;\n statements.push(`ALTER TABLE ${quoteIdent(tableName, 'table name')} ADD COLUMN ${fragment}`);\n }\n await this.runDdl(statements);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const exists = await this.tableExists(tableName);\n if (!exists) return;\n // Drop indexes first - Spanner refuses to drop tables with indexes attached.\n const indexes = await this.listIndexes(tableName);\n const dropIndexStmts = indexes\n // PRIMARY_KEY index is auto-managed and cannot be dropped via DROP INDEX.\n .filter(idx => idx.name && idx.name !== 'PRIMARY_KEY')\n .map(idx => `DROP INDEX ${quoteIdent(idx.name, 'index name')}`);\n const stmts = [...dropIndexStmts, `DROP TABLE ${quoteIdent(tableName, 'table name')}`];\n await this.runDdl(stmts);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', '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(tableName);\n }\n }\n\n /** Spanner has no TRUNCATE fall back to `DELETE WHERE TRUE`. */\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n // Skip if the table hasn't been created yet (e.g. during test teardown\n // after a failed init).\n if (!(await this.tableExists(tableName))) return;\n await this.runDml({ sql: `DELETE FROM ${quoteIdent(tableName, 'table name')} WHERE TRUE` });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Converts a JS value into the form Spanner expects for the column.\n * - jsonb: serialize to JSON string (caller must pass type 'json' in `types`).\n * - integer/bigint: pass through (numbers are accepted; Spanner will coerce).\n * - timestamp: ISO string when given a Date.\n * - boolean: pass through as boolean.\n * - text/uuid: stringify objects (legacy callers pass already-stringified JSON).\n */\n prepareValue(value: any, columnName: string, tableName: TABLE_NAMES): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n const columnSchema = getColumnDef(tableName, columnName);\n\n if (columnSchema?.type === 'jsonb') {\n // Pass JSON values as serialized strings; the calling code attaches a\n // `json` param-type hint so Spanner stores them as native JSON.\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n try {\n // Validate by round-tripping through JSON.parse / JSON.stringify so we\n // emit canonical JSON to Spanner.\n return JSON.stringify(JSON.parse(trimmed));\n } catch {\n return JSON.stringify(value);\n }\n }\n return JSON.stringify(value);\n }\n if (typeof value === 'bigint') {\n return JSON.stringify(value.toString());\n }\n return JSON.stringify(value);\n }\n\n if (columnSchema?.type === 'timestamp') {\n if (value instanceof Date) return value.toISOString();\n return value;\n }\n\n if (columnSchema?.type === 'boolean') {\n return Boolean(value);\n }\n\n if (columnSchema?.type === 'integer' || columnSchema?.type === 'bigint') {\n if (typeof value === 'number') return value;\n if (typeof value === 'bigint') return value.toString();\n return value;\n }\n\n // Default: for text/uuid columns a stray object value is best-effort-stringified\n // to retain backwards compatibility with callers passing structured data.\n if (typeof value === 'object' && !(value instanceof Date)) {\n return JSON.stringify(value);\n }\n return value;\n }\n\n /**\n * Convert a value into the shape the Spanner Mutations API expects for the\n * given column. Mutations encoding differs from DML in three places:\n *\n * - JSON columns: the codec serializes plain JS objects with\n * `JSON.stringify`, but it encodes arrays as protobuf `list_value`,\n * which the server rejects for JSON-typed columns\n * (\"Could not parse list_value … as JSON\"). Pre-stringifying every\n * JSON value sidesteps that fork.\n * - FLOAT64 columns: whole-number JS values like `100` get either\n * INT64-inferred or string-encoded by the client when sent as a bare\n * number — the server then refuses them. `Spanner.float()` is the\n * documented escape hatch.\n * - TIMESTAMP columns: the codec already handles `Date` instances via\n * `.toJSON()`, so we pass them through as-is (DML's `prepareValue`\n * converts to an ISO string because DML wants `'timestamp'` type\n * hints; mutations don't take per-row hints).\n *\n * Everything else (text/uuid/bool/int) goes through `prepareValue` for\n * parity with the DML path.\n */\n prepareValueForMutation(value: any, columnName: string, tableName: TABLE_NAMES): any {\n if (value === null || value === undefined) return null;\n const colType = getColumnDef(tableName, columnName)?.type;\n\n if (colType === 'jsonb') {\n // Reuse prepareValue's canonicalisation (round-trip strings through\n // parse/stringify so we don't double-encode pre-stringified payloads).\n return this.prepareValue(value, columnName, tableName);\n }\n if (colType === 'timestamp') {\n // Mutations API: Date pass-through (codec serializes via .toJSON()).\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n return value;\n }\n if (colType === 'float') {\n return Spanner.float(Number(value));\n }\n if (colType === 'boolean') return Boolean(value);\n if (colType === 'integer' || colType === 'bigint') {\n if (typeof value === 'number') return value;\n if (typeof value === 'bigint') return value.toString();\n return value;\n }\n // text / uuid / unknown — best-effort stringify objects same as\n // prepareValue does, so structured-data callers stay backwards compatible.\n if (typeof value === 'object' && !(value instanceof Date)) {\n return JSON.stringify(value);\n }\n return value;\n }\n\n async insert({\n tableName,\n record,\n transaction,\n }: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n transaction?: Transaction;\n }): Promise<void> {\n try {\n const filtered = await this.filterRecordToKnownColumns(tableName, record);\n const columns = Object.keys(filtered);\n if (columns.length === 0) return;\n\n const sql = `INSERT INTO ${quoteIdent(tableName, 'table name')} (${columns\n .map(c => quoteIdent(c, 'column name'))\n .join(', ')}) VALUES (${columns.map(c => `@${c}`).join(', ')})`;\n\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n for (const col of columns) {\n const value = this.prepareValue(filtered[col], col, tableName);\n params[col] = value;\n const colType = getColumnDef(tableName, col)?.type;\n if (value === null || colType === 'jsonb' || colType === 'timestamp') {\n types[col] = getSpannerParamType(colType);\n }\n }\n\n await this.runDml({ sql, params, types }, transaction);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * INSERT OR UPDATE upsert. Spanner cannot emit RETURNING-style results from\n * INSERT OR UPDATE so callers must re-load the row when they need the post-write\n * state.\n */\n async upsert({\n tableName,\n record,\n transaction,\n }: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n transaction?: Transaction;\n }): Promise<void> {\n try {\n const filtered = await this.filterRecordToKnownColumns(tableName, record);\n const columns = Object.keys(filtered);\n if (columns.length === 0) return;\n\n const sql = `INSERT OR UPDATE INTO ${quoteIdent(tableName, 'table name')} (${columns\n .map(c => quoteIdent(c, 'column name'))\n .join(', ')}) VALUES (${columns.map(c => `@${c}`).join(', ')})`;\n\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n for (const col of columns) {\n const value = this.prepareValue(filtered[col], col, tableName);\n params[col] = value;\n const colType = getColumnDef(tableName, col)?.type;\n if (value === null || colType === 'jsonb' || colType === 'timestamp') {\n types[col] = getSpannerParamType(colType);\n }\n }\n\n await this.runDml({ sql, params, types }, transaction);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async update({\n tableName,\n keys,\n data,\n transaction,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n transaction?: Transaction;\n }): Promise<void> {\n try {\n if (!data || Object.keys(data).length === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE', 'EMPTY_DATA'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot update with empty data payload',\n });\n }\n if (!keys || Object.keys(keys).length === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE', 'EMPTY_KEYS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot update without keys to identify records',\n });\n }\n const filtered = await this.filterRecordToKnownColumns(tableName, data);\n if (Object.keys(filtered).length === 0) return;\n\n const setClauses: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n\n for (const [col, value] of Object.entries(filtered)) {\n const param = `set_${i++}`;\n setClauses.push(`${quoteIdent(col, 'column name')} = @${param}`);\n const prepared = this.prepareValue(value, col, tableName);\n params[param] = prepared;\n const colType = getColumnDef(tableName, col)?.type;\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = getSpannerParamType(colType);\n }\n }\n\n const whereClauses: string[] = [];\n for (const [col, value] of Object.entries(keys)) {\n const param = `where_${i++}`;\n whereClauses.push(`${quoteIdent(col, 'column name')} = @${param}`);\n const prepared = this.prepareValue(value, col, tableName);\n params[param] = prepared;\n const colType = getColumnDef(tableName, col)?.type;\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = getSpannerParamType(colType);\n }\n }\n\n const sql = `UPDATE ${quoteIdent(tableName, 'table name')} SET ${setClauses.join(', ')} WHERE ${whereClauses.join(' AND ')}`;\n\n await this.runDml({ sql, params, types }, transaction);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n try {\n // Filter + encode all rows up front, before opening the transaction,\n // so we don't hold row locks while waiting on JSON.stringify of large\n // payloads. The column filter is per-call cached anyway.\n const encoded: Record<string, any>[] = [];\n for (const record of records) {\n const filtered = await this.filterRecordToKnownColumns(tableName, record);\n const row: Record<string, any> = {};\n for (const [col, value] of Object.entries(filtered)) {\n row[col] = this.prepareValueForMutation(value, col, tableName);\n }\n if (Object.keys(row).length > 0) encoded.push(row);\n }\n if (encoded.length === 0) return;\n\n await this.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n tx.insert(tableName, encoded);\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // explicitly release the transaction so its row locks are freed.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: records.length },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{ keys: Record<string, any>; data: Record<string, any> }>;\n }): Promise<void> {\n if (updates.length === 0) return;\n try {\n await this.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n for (const { keys, data } of updates) {\n await this.update({ tableName, keys, data, transaction: tx });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: updates.length },\n },\n error,\n );\n }\n }\n\n async batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any>[] }): Promise<void> {\n if (keys.length === 0) return;\n try {\n await this.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n for (const keySet of keys) {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n for (const [col, value] of Object.entries(keySet)) {\n i = this.aggregateParams(i, conditions, col, value, tableName, params, types);\n }\n if (conditions.length === 0) continue;\n const sql = `DELETE FROM ${quoteIdent(tableName, 'table name')} WHERE ${conditions.join(' AND ')}`;\n await tx.runUpdate({ sql, params, types });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: keys.length },\n },\n error,\n );\n }\n }\n\n /**\n * Binds a single (column, value) pair into the SQL conditions/params/types\n * accumulators and returns the next available parameter index.\n *\n * The previous version of this helper accepted `i` as a primitive argument\n * and used `i++` internally, which only mutated the local copy every\n * call ended up emitting `@p0`. Returning the new counter value forces\n * callers to thread the index forward and makes that footgun impossible.\n */\n private aggregateParams(\n i: number,\n conditions: string[],\n col: string,\n value: any,\n tableName: TABLE_NAMES,\n params: Record<string, any>,\n types: Record<string, any>,\n ): number {\n const param = `p${i}`;\n conditions.push(`${quoteIdent(col, 'column name')} = @${param}`);\n const prepared = this.prepareValue(value, col, tableName);\n params[param] = prepared;\n const colType = getColumnDef(tableName, col)?.type;\n // Always emit a Spanner type hint for JSON and TIMESTAMP columns\n // (jsonb because prepareValue serialises to string and Spanner needs\n // the `json` type to round-trip; timestamp because prepareValue\n // serialises Date → ISO string and the client otherwise infers\n // `string`, which fails STRING → TIMESTAMP coercion in predicates).\n // For other column types we only emit a hint when the value is null.\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = getSpannerParamType(colType);\n }\n return i + 1;\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null> {\n try {\n if (!keys || Object.keys(keys).length === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LOAD', 'EMPTY_KEYS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot load without keys to identify records',\n });\n }\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n for (const [col, value] of Object.entries(keys)) {\n i = this.aggregateParams(i, conditions, col, value, tableName, params, types);\n }\n const sql = `SELECT * FROM ${quoteIdent(tableName, 'table name')} WHERE ${conditions.join(' AND ')} LIMIT 1`;\n const [rows] = await this.database.run({ sql, params, types, json: true });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n const result = this.transformRow(tableName, row);\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = result as any;\n if (typeof snapshot.snapshot === 'string') {\n try {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n } catch {\n // leave as-is if not valid JSON\n }\n }\n return snapshot;\n }\n return result as R;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Convert a raw Spanner JSON row into the storage layer's expected shape.\n * Handles JSON-string values, timestamp strings, and bigint integers returned\n * by the Spanner client.\n */\n transformRow<T = Record<string, any>>(tableName: TABLE_NAMES, row: Record<string, any>): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(row)) {\n const colDef = schema?.[key];\n if (value === null || value === undefined) {\n result[key] = value;\n continue;\n }\n if (colDef?.type === 'jsonb') {\n if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'timestamp') {\n if (value instanceof Date) {\n // Spanner returns PreciseDate which extends Date normalize to a\n // plain Date so .toISOString() emits millisecond precision.\n result[key] = new Date(value.getTime());\n } else if (typeof value === 'string') {\n result[key] = new Date(value);\n } else if (typeof value === 'object' && typeof (value as any).value === 'string') {\n result[key] = new Date((value as any).value);\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'integer' || colDef?.type === 'bigint') {\n if (typeof value === 'string') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value;\n } else if (typeof value === 'bigint') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value.toString();\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'boolean') {\n result[key] = Boolean(value);\n } else {\n result[key] = value;\n }\n }\n return result as T;\n }\n\n /**\n * Build a parameterized WHERE fragment from a filter object.\n * Supports `_gte`/`_gt`/`_lte`/`_lt` suffixes, `$in` operator, array-as-IN,\n * and `null` IS NULL comparisons.\n */\n prepareWhereClause(\n filters: Record<string, any>,\n tableName?: TABLE_NAMES,\n ): { sql: string; params: Record<string, any>; types: Record<string, any> } {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n const bind = (col: string, value: unknown): string => {\n const param = `w${i++}`;\n let prepared: any;\n if (value instanceof Date) {\n prepared = value.toISOString();\n } else if (tableName) {\n prepared = this.prepareValue(value, col, tableName);\n } else {\n prepared = value;\n }\n params[param] = prepared;\n const colType = tableName ? getColumnDef(tableName, col)?.type : undefined;\n // Always emit a Spanner type hint for JSON and TIMESTAMP columns\n // (see aggregateParams above for the rationale). Other types only\n // get a hint when the value is null.\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = tableName ? getSpannerParamType(colType) : 'string';\n }\n return param;\n };\n\n for (const [key, value] of Object.entries(filters)) {\n if (value === undefined) continue;\n\n const handleOp = (suffix: string, op: string) => {\n const fieldName = key.slice(0, -suffix.length);\n const param = bind(fieldName, value);\n conditions.push(`${quoteIdent(fieldName, 'field name')} ${op} @${param}`);\n };\n\n if (key.endsWith('_gte')) {\n handleOp('_gte', '>=');\n } else if (key.endsWith('_gt')) {\n handleOp('_gt', '>');\n } else if (key.endsWith('_lte')) {\n handleOp('_lte', '<=');\n } else if (key.endsWith('_lt')) {\n handleOp('_lt', '<');\n } else if (value === null) {\n conditions.push(`${quoteIdent(key, 'field name')} IS NULL`);\n } else if (isInOperator(value)) {\n const inValues = value.$in;\n if (inValues.length === 0) {\n conditions.push('1 = 0');\n } else if (inValues.length === 1) {\n const param = bind(key, inValues[0]);\n conditions.push(`${quoteIdent(key, 'field name')} = @${param}`);\n } else {\n const paramNames: string[] = [];\n for (const item of inValues) {\n paramNames.push(`@${bind(key, item)}`);\n }\n conditions.push(`${quoteIdent(key, 'field name')} IN (${paramNames.join(', ')})`);\n }\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n conditions.push('1 = 0');\n } else if (value.length === 1) {\n const param = bind(key, value[0]);\n conditions.push(`${quoteIdent(key, 'field name')} = @${param}`);\n } else {\n const paramNames: string[] = [];\n for (const item of value) {\n paramNames.push(`@${bind(key, item)}`);\n }\n conditions.push(`${quoteIdent(key, 'field name')} IN (${paramNames.join(', ')})`);\n }\n } else {\n const param = bind(key, value);\n conditions.push(`${quoteIdent(key, 'field name')} = @${param}`);\n }\n }\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n params,\n types,\n };\n }\n\n /**\n * Reads an index from INFORMATION_SCHEMA and compares its table, column list\n * (with ordering), and unique flag against the expected definition. Throws a\n * typed VALIDATE_FAILED error when anything diverges so the operator can\n * reconcile their externally-managed schema.\n */\n private async validateIndexDefinition(expected: {\n name: string;\n table: string;\n columns: string[];\n unique: boolean;\n }): Promise<void> {\n const [indexRows] = await this.database.run({\n sql: `SELECT TABLE_NAME, IS_UNIQUE\n FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName: expected.name },\n json: true,\n });\n const indexRow = (indexRows as Array<{ TABLE_NAME: string; IS_UNIQUE: boolean | string }>)[0];\n if (!indexRow) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} on ${expected.table} does not exist (initMode='validate' will not create it)`,\n { indexName: expected.name, tableName: expected.table },\n );\n }\n\n if (indexRow.TABLE_NAME !== expected.table) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} is on table ${indexRow.TABLE_NAME}, expected ${expected.table}`,\n {\n indexName: expected.name,\n expectedTable: expected.table,\n actualTable: indexRow.TABLE_NAME,\n },\n );\n }\n\n const actualUnique = indexRow.IS_UNIQUE === true || indexRow.IS_UNIQUE === 'YES';\n if (actualUnique !== expected.unique) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} unique flag mismatch (expected ${expected.unique}, actual ${actualUnique})`,\n {\n indexName: expected.name,\n tableName: expected.table,\n expectedUnique: expected.unique,\n actualUnique,\n },\n );\n }\n\n const [colRows] = await this.database.run({\n sql: `SELECT COLUMN_NAME, COLUMN_ORDERING\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName\n ORDER BY ORDINAL_POSITION`,\n params: { indexName: expected.name },\n json: true,\n });\n // Spanner reports COLUMN_ORDERING as 'ASC' / 'DESC' for indexed columns and\n // NULL for STORING columns; we never declare STORING columns, so any null\n // ordering still represents an indexed column with default ASC ordering.\n const actualColumns = (colRows as Array<{ COLUMN_NAME: string; COLUMN_ORDERING: string | null }>).map(\n c => `${c.COLUMN_NAME}${c.COLUMN_ORDERING && c.COLUMN_ORDERING !== 'ASC' ? ` ${c.COLUMN_ORDERING}` : ''}`,\n );\n const normalisedExpected = expected.columns.map(col => {\n // Strip an explicit \"ASC\" so it round-trips against the schema's default.\n if (col.endsWith(' ASC')) return col.slice(0, -' ASC'.length);\n return col;\n });\n\n const matches =\n actualColumns.length === normalisedExpected.length && actualColumns.every((c, i) => c === normalisedExpected[i]);\n if (!matches) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} column list mismatch (expected [${normalisedExpected.join(', ')}], actual [${actualColumns.join(', ')}])`,\n {\n indexName: expected.name,\n tableName: expected.table,\n expectedColumns: normalisedExpected.join(','),\n actualColumns: actualColumns.join(','),\n },\n );\n }\n }\n\n async createIndex(options: CreateIndexOptions): Promise<void> {\n try {\n const { name, table, columns, unique = false } = options;\n const indexNameSafe = name; // parsed inside quoteIdent\n if (this.initMode === 'validate') {\n await this.validateIndexDefinition({ name: indexNameSafe, table, columns, unique });\n return;\n }\n if (await this.indexExists(indexNameSafe)) return;\n\n const columnsStr = columns\n .map(col => {\n if (col.endsWith(' DESC') || col.endsWith(' ASC')) {\n const idx = col.lastIndexOf(' ');\n const colName = col.slice(0, idx);\n const direction = col.slice(idx + 1);\n return `${quoteIdent(colName, 'column name')} ${direction}`;\n }\n return quoteIdent(col, 'column name');\n })\n .join(', ');\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const ddl = `CREATE ${uniqueStr}INDEX ${quoteIdent(indexNameSafe, 'index name')} ON ${quoteIdent(table, 'table name')} (${columnsStr})`;\n await this.runDdl([ddl]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_CREATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: options.name, tableName: options.table },\n },\n error,\n );\n }\n }\n\n /**\n * Creates a batch of indexes, swallowing per-index failures with a logger\n * warning. Two classes of failure ALWAYS propagate:\n *\n * - validate-mode mismatches, so the operator sees the missing-index\n * error instead of a silent no-op;\n * - failures on `unique: true` indexes, because a unique index encodes a\n * data-integrity invariant (e.g. duplicate-version prevention). If we\n * swallowed those failures the invariant would silently not be in\n * force, so we surface the error and let init() abort.\n *\n * Non-unique indexes are best-effort: domains use this for both default\n * and custom index creation, and the swallow behavior keeps `init()`\n * resilient to transient races (another process creating the same index\n * concurrently, etc.).\n */\n async createIndexes(indexes: CreateIndexOptions[]): Promise<void> {\n for (const indexDef of indexes) {\n try {\n await this.createIndex(indexDef);\n } catch (error) {\n if (error instanceof MastraError && /VALIDATE_FAILED/.test(error.id)) {\n throw error;\n }\n if (indexDef.unique) {\n throw error;\n }\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n async dropIndex(indexName: string): Promise<void> {\n try {\n if (!(await this.indexExists(indexName))) return;\n await this.runDdl([`DROP INDEX ${quoteIdent(indexName, 'index name')}`]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_DROP', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async listIndexes(tableName?: string): Promise<IndexInfo[]> {\n try {\n const sqlBase = `SELECT i.INDEX_NAME, i.TABLE_NAME, i.IS_UNIQUE\n FROM INFORMATION_SCHEMA.INDEXES i\n WHERE i.TABLE_SCHEMA = '' AND i.INDEX_TYPE = 'INDEX'`;\n const [rows] = tableName\n ? await this.database.run({\n sql: `${sqlBase} AND i.TABLE_NAME = @table`,\n params: { table: tableName },\n json: true,\n })\n : await this.database.run({ sql: sqlBase, json: true });\n\n const indexes: IndexInfo[] = [];\n for (const row of rows as Array<{ INDEX_NAME: string; TABLE_NAME: string; IS_UNIQUE: boolean | string }>) {\n const [colRows] = await this.database.run({\n sql: `SELECT COLUMN_NAME\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @table AND INDEX_NAME = @index\n ORDER BY ORDINAL_POSITION`,\n params: { table: row.TABLE_NAME, index: row.INDEX_NAME },\n json: true,\n });\n indexes.push({\n name: row.INDEX_NAME,\n table: row.TABLE_NAME,\n columns: (colRows as Array<{ COLUMN_NAME: string }>).map(c => c.COLUMN_NAME),\n unique: Boolean(row.IS_UNIQUE === true || row.IS_UNIQUE === 'YES'),\n size: '0 MB',\n definition: '',\n });\n }\n return indexes;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_LIST', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: tableName ? { tableName } : {},\n },\n error,\n );\n }\n }\n\n async describeIndex(indexName: string): Promise<StorageIndexStats> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT INDEX_NAME, TABLE_NAME, IS_UNIQUE\n FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @index`,\n params: { index: indexName },\n json: true,\n });\n const row = (rows as Array<{ INDEX_NAME: string; TABLE_NAME: string; IS_UNIQUE: boolean | string }>)[0];\n if (!row) {\n throw new Error(`Index \"${indexName}\" not found`);\n }\n const [colRows] = await this.database.run({\n sql: `SELECT COLUMN_NAME\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @index\n ORDER BY ORDINAL_POSITION`,\n params: { index: indexName },\n json: true,\n });\n return {\n name: row.INDEX_NAME,\n table: row.TABLE_NAME,\n columns: (colRows as Array<{ COLUMN_NAME: string }>).map(c => c.COLUMN_NAME),\n unique: Boolean(row.IS_UNIQUE === true || row.IS_UNIQUE === 'YES'),\n size: '0 MB',\n definition: '',\n method: 'btree',\n scans: 0,\n tuples_read: 0,\n tuples_fetched: 0,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_DESCRIBE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n}\n","import type { DateRange, TABLE_NAMES } from '@mastra/core/storage';\nimport { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { quoteIdent } from '../db/utils';\n\nexport { quoteIdent };\n\n/**\n * Build storage filter entries for a date range, using the operator suffixes\n * understood by `SpannerDB.prepareWhereClause`.\n */\nexport function buildDateRangeFilter(dateRange: DateRange | undefined, fieldName: string): Record<string, any> {\n const filters: Record<string, any> = {};\n if (dateRange?.start) {\n const suffix = dateRange.startExclusive ? '_gt' : '_gte';\n filters[`${fieldName}${suffix}`] = dateRange.start;\n }\n if (dateRange?.end) {\n const suffix = dateRange.endExclusive ? '_lt' : '_lte';\n filters[`${fieldName}${suffix}`] = dateRange.end;\n }\n return filters;\n}\n\n/**\n * Convert a Spanner JSON-serialized row into the storage-layer expected shape.\n * Mirrors the helper exported by other adapters so domain code can stay similar.\n */\nexport function transformFromSpannerRow<T>({\n tableName,\n row,\n}: {\n tableName: TABLE_NAMES;\n row: Record<string, any>;\n}): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(row)) {\n const colDef = schema?.[key];\n if (value === null || value === undefined) {\n result[key] = value;\n continue;\n }\n if (colDef?.type === 'jsonb' && typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else if (colDef?.type === 'timestamp') {\n if (value instanceof Date) {\n // Spanner returns PreciseDate (which extends Date) for TIMESTAMP columns.\n // Normalize to a plain Date so .toISOString() emits millisecond precision\n // matching the values the storage layer expects.\n result[key] = new Date(value.getTime());\n } else if (typeof value === 'string') {\n result[key] = new Date(value);\n } else if (typeof value === 'object' && typeof (value as any).value === 'string') {\n result[key] = new Date((value as any).value);\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'integer' || colDef?.type === 'bigint') {\n if (typeof value === 'string') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value;\n } else if (typeof value === 'bigint') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value.toString();\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'boolean') {\n result[key] = Boolean(value);\n } else {\n result[key] = value;\n }\n }\n return result as T;\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n AGENTS_SCHEMA,\n AGENT_VERSIONS_SCHEMA,\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n AgentInstructionBlock,\n AgentVersion,\n CreateIndexOptions,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n StorageAgentType,\n StorageCreateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageUpdateAgentInput,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n// Fields the version row already carries as metadata; everything else is\n// snapshot config (pulled in by the abstract class via versionMetadataFields).\nconst VERSION_CONFIG_KEYS = [\n 'name',\n 'description',\n 'instructions',\n 'model',\n 'tools',\n 'defaultOptions',\n 'workflows',\n 'agents',\n 'integrationTools',\n 'inputProcessors',\n 'outputProcessors',\n 'memory',\n 'scorers',\n 'mcpClients',\n 'requestContextSchema',\n 'workspace',\n 'skills',\n 'skillsFormat',\n] as const;\n\nexport class AgentsSpanner extends AgentsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (AgentsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` because that mode owns the schema and\n * data externally and must never issue destructive DML.\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENTS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('agentId', 'column name')}\n FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('agentId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft agents:', error);\n }\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_agents_status_createdat_idx',\n table: TABLE_AGENTS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_agents_authorid_idx',\n table: TABLE_AGENTS,\n columns: ['authorId'],\n },\n // Unique index on (agentId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls and keeps getVersionByNumber /\n // getLatestVersion consistent.\n {\n name: 'mastra_agent_versions_agentid_versionnumber_idx',\n table: TABLE_AGENT_VERSIONS,\n columns: ['agentId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_AGENT_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_AGENTS });\n }\n\n private parseAgentRow(row: Record<string, any>): StorageAgentType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_AGENTS, row });\n // visibility and favoriteCount were added to StorageAgentType after the\n // initial Spanner adapter shipped; the stale dist .d.ts published with\n // older core releases doesn't carry them yet so we widen the return\n // shape here to keep the build green until the next core release.\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n visibility: (transformed.visibility as 'private' | 'public' | undefined) ?? undefined,\n metadata: transformed.metadata ?? undefined,\n favoriteCount:\n transformed.favoriteCount === null || transformed.favoriteCount === undefined\n ? 0\n : Number(transformed.favoriteCount),\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n } as StorageAgentType;\n }\n\n /** Coerces stored instructions (string or JSON-stringified array of blocks) back to its API shape. */\n private deserializeInstructions(raw: unknown): string | AgentInstructionBlock[] {\n if (raw == null) return '';\n if (typeof raw !== 'string') return raw as any;\n const trimmed = raw.trim();\n if (!trimmed.startsWith('[')) return raw;\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n } catch {\n // Not JSON treat as plain string.\n }\n return raw;\n }\n\n private serializeInstructions(value: string | AgentInstructionBlock[] | undefined): string {\n if (value == null) return '';\n return Array.isArray(value) ? JSON.stringify(value) : value;\n }\n\n private parseVersionRow(row: Record<string, any>): AgentVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_AGENT_VERSIONS, row });\n return {\n id: transformed.id,\n agentId: transformed.agentId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n instructions: this.deserializeInstructions(transformed.instructions),\n model: transformed.model,\n tools: transformed.tools ?? undefined,\n defaultOptions: transformed.defaultOptions ?? undefined,\n workflows: transformed.workflows ?? undefined,\n agents: transformed.agents ?? undefined,\n integrationTools: transformed.integrationTools ?? undefined,\n inputProcessors: transformed.inputProcessors ?? undefined,\n outputProcessors: transformed.outputProcessors ?? undefined,\n memory: transformed.memory ?? undefined,\n scorers: transformed.scorers ?? undefined,\n mcpClients: transformed.mcpClients ?? undefined,\n requestContextSchema: transformed.requestContextSchema ?? undefined,\n workspace: transformed.workspace ?? undefined,\n skills: transformed.skills ?? undefined,\n skillsFormat: transformed.skillsFormat ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENTS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseAgentRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_AGENT_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n const { agent } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, visibility: _visibility, metadata: _metadata, ...snapshot } = agent as any;\n // Default visibility to 'private' for owned agents so multi-tenant\n // reads stay scoped; legacy/unowned agents keep their nullable status.\n const visibility = (agent as any).visibility ?? (agent.authorId ? 'private' : null);\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n const versionRecord: Record<string, any> = {\n id: versionId,\n agentId: agent.id,\n versionNumber: 1,\n name: (snapshot as any).name ?? null,\n description: (snapshot as any).description ?? null,\n instructions: this.serializeInstructions((snapshot as any).instructions),\n model: (snapshot as any).model ?? {},\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n };\n for (const key of VERSION_CONFIG_KEYS) {\n if (key === 'name' || key === 'description' || key === 'instructions' || key === 'model') continue;\n const value = (snapshot as any)[key];\n versionRecord[key] = value === undefined ? null : value;\n }\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agent.id,\n status: 'draft',\n activeVersionId: null,\n authorId: agent.authorId ?? null,\n visibility,\n metadata: agent.metadata ?? null,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_AGENT_VERSIONS,\n record: versionRecord,\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(agent.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_AGENT', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${agent.id} not found after creation`,\n details: { agentId: agent.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: agent.id },\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_AGENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Agent ${id} not found`,\n details: { agentId: id },\n });\n }\n\n // The base update only touches thin-record fields. Config updates are made\n // through `createVersion` by the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if ((updates as any).visibility !== undefined) updateData.visibility = (updates as any).visibility;\n // Replace metadata wholesale, matching the documented DB-adapter semantics.\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_AGENTS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${id} not found after update`,\n details: { agentId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n /** Removes an agent and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n // Both deletes share a transaction so a partial failure can't leave\n // versions without a parent (or vice versa). Spanner has no FK cascades\n // for non-interleaved tables so the parent has to be cleared explicitly.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENTS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n // Default to status='published' so list() never leaks drafts/archived to\n // callers that omit the filter.\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_AGENTS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_AGENTS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_AGENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return { agents: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const agents = (rows as Array<Record<string, any>>).map(r => this.parseAgentRow(r));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_AGENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n try {\n const now = new Date();\n const record: Record<string, any> = {\n id: input.id,\n agentId: input.agentId,\n versionNumber: input.versionNumber,\n name: input.name ?? null,\n description: input.description ?? null,\n instructions: this.serializeInstructions(input.instructions),\n model: input.model ?? {},\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n };\n // Pass through optional config fields when present.\n for (const key of VERSION_CONFIG_KEYS) {\n if (key === 'name' || key === 'description' || key === 'instructions' || key === 'model') continue;\n const value = (input as any)[key];\n record[key] = value === undefined ? null : value;\n }\n\n await this.db.insert({ tableName: TABLE_AGENT_VERSIONS, record });\n\n return {\n ...input,\n createdAt: now,\n } as AgentVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, agentId: input.agentId },\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<AgentVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('agentId', 'column name')} = @agentId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { agentId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId, versionNumber },\n },\n error,\n );\n }\n }\n\n async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('agentId', 'column name')} = @agentId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { agentId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_AGENT_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('agentId', 'column name')} = @agentId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { agentId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_VERSIONS_BY_AGENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(agentId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport type {\n BackgroundTask,\n BackgroundTaskStatus,\n TaskFilter,\n TaskListResult,\n UpdateBackgroundTask,\n} from '@mastra/core/background-tasks';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport {\n BackgroundTasksStorage,\n createStorageErrorId,\n TABLE_BACKGROUND_TASKS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction buildStatusCondition(\n filter: TaskFilter,\n params: Record<string, any>,\n startIdx: number,\n): { kind: 'no-filter' } | { kind: 'empty' } | { kind: 'sql'; sql: string; nextIdx: number } {\n if (filter.status === undefined) return { kind: 'no-filter' };\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n if (statuses.length === 0) return { kind: 'empty' };\n const placeholders: string[] = [];\n let idx = startIdx;\n for (const status of statuses) {\n const name = `p${idx++}`;\n params[name] = status;\n placeholders.push(`@${name}`);\n }\n return {\n kind: 'sql',\n sql: `${quoteIdent('status', 'column name')} IN (${placeholders.join(', ')})`,\n nextIdx: idx,\n };\n}\n\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_BACKGROUND_TASKS, row });\n const parseJson = (val: unknown): any => {\n if (val == null) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n const suspendPayload = parseJson(transformed.suspend_payload);\n return {\n id: transformed.id,\n status: transformed.status as BackgroundTaskStatus,\n toolName: transformed.tool_name,\n toolCallId: transformed.tool_call_id,\n args: parseJson(transformed.args) ?? {},\n agentId: transformed.agent_id,\n threadId: transformed.thread_id ?? undefined,\n resourceId: transformed.resource_id ?? undefined,\n runId: transformed.run_id ?? '',\n result: parseJson(transformed.result),\n error: parseJson(transformed.error),\n suspendPayload: suspendPayload === null ? undefined : suspendPayload,\n retryCount: Number(transformed.retry_count),\n maxRetries: Number(transformed.max_retries),\n timeoutMs: Number(transformed.timeout_ms),\n createdAt: transformed.createdAt instanceof Date ? transformed.createdAt : new Date(transformed.createdAt),\n startedAt: transformed.startedAt\n ? transformed.startedAt instanceof Date\n ? transformed.startedAt\n : new Date(transformed.startedAt)\n : undefined,\n suspendedAt: transformed.suspendedAt\n ? transformed.suspendedAt instanceof Date\n ? transformed.suspendedAt\n : new Date(transformed.suspendedAt)\n : undefined,\n completedAt: transformed.completedAt\n ? transformed.completedAt instanceof Date\n ? transformed.completedAt\n : new Date(transformed.completedAt)\n : undefined,\n };\n}\n\nexport class BackgroundTasksSpanner extends BackgroundTasksStorage {\n private database: Database;\n private db: SpannerDB;\n private skipDefaultIndexes?: boolean;\n private indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_BACKGROUND_TASKS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx =>\n (BackgroundTasksSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async init(): Promise<void> {\n await this.db.createTable({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n // Indexes here cover every filter shape that listTasks / deleteTasks\n // accept (status, agent_id, thread_id, tool_call_id, run_id,\n // resource_id, tool_name) plus the createdAt ordering used as the\n // default sort. Operators with workloads that would hot-spot on the\n // monotonically-increasing createdAt column can opt out via\n // `skipDefaultIndexes` and supply hashed alternatives.\n return [\n {\n name: 'mastra_bg_tasks_status_created_at_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['status', 'createdAt'],\n },\n {\n name: 'mastra_bg_tasks_agent_status_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['agent_id', 'status'],\n },\n {\n name: 'mastra_bg_tasks_thread_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['thread_id', 'createdAt'],\n },\n {\n name: 'mastra_bg_tasks_tool_call_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['tool_call_id'],\n },\n // listTasks({ runId }) runs scoped to a single workflow run.\n {\n name: 'mastra_bg_tasks_run_id_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['run_id'],\n },\n // listTasks({ resourceId, ... }) resource-scoped listings.\n {\n name: 'mastra_bg_tasks_resource_id_created_at_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['resource_id', 'createdAt'],\n },\n // listTasks({ toolName, ... }) per-tool dashboards / metrics.\n {\n name: 'mastra_bg_tasks_tool_name_created_at_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['tool_name', 'createdAt'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n }\n\n private tableName(): string {\n return quoteIdent(TABLE_BACKGROUND_TASKS, 'table name');\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n await this.db.insert({\n tableName: TABLE_BACKGROUND_TASKS,\n record: {\n id: task.id,\n tool_call_id: task.toolCallId,\n tool_name: task.toolName,\n agent_id: task.agentId,\n thread_id: task.threadId ?? null,\n resource_id: task.resourceId ?? null,\n run_id: task.runId,\n status: task.status,\n args: task.args,\n result: task.result ?? null,\n error: task.error ?? null,\n suspend_payload: task.suspendPayload ?? null,\n retry_count: task.retryCount,\n max_retries: task.maxRetries,\n timeout_ms: task.timeoutMs,\n createdAt: task.createdAt,\n startedAt: task.startedAt ?? null,\n suspendedAt: task.suspendedAt ?? null,\n completedAt: task.completedAt ?? null,\n },\n });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void> {\n const data: Record<string, any> = {};\n if ('status' in update) data.status = update.status;\n if ('result' in update) data.result = update.result ?? null;\n if ('error' in update) data.error = update.error ?? null;\n if ('suspendPayload' in update) data.suspend_payload = update.suspendPayload ?? null;\n if ('retryCount' in update) data.retry_count = update.retryCount;\n if ('startedAt' in update) data.startedAt = update.startedAt ?? null;\n if ('suspendedAt' in update) data.suspendedAt = update.suspendedAt ?? null;\n if ('completedAt' in update) data.completedAt = update.completedAt ?? null;\n if (Object.keys(data).length === 0) return;\n await this.db.update({ tableName: TABLE_BACKGROUND_TASKS, keys: { id: taskId }, data });\n }\n\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${this.tableName()} WHERE id = @id LIMIT 1`,\n params: { id: taskId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return rowToTask(row);\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n if (filter.page !== undefined && filter.page < 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_TASKS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'page must be >= 0',\n details: { page: filter.page },\n });\n }\n if (filter.perPage !== undefined && filter.perPage < 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_TASKS', 'INVALID_PER_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'perPage must be >= 0',\n details: { perPage: filter.perPage },\n });\n }\n\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n // Spanner needs an explicit `timestamp` type hint for date params bound as\n // ISO strings (otherwise the client infers `string` and the predicate\n // fails the STRING -> TIMESTAMP coercion).\n const types: Record<string, any> = {};\n let idx = 1;\n\n const statusCondition = buildStatusCondition(filter, params, idx);\n if (statusCondition.kind === 'empty') {\n // Explicit empty status array means \"match nothing\" short-circuit\n // so we never emit invalid `status IN ()` SQL.\n return { tasks: [], total: 0 };\n }\n if (statusCondition.kind === 'sql') {\n conditions.push(statusCondition.sql);\n idx = statusCondition.nextIdx;\n }\n if (filter.agentId) {\n const name = `p${idx++}`;\n params[name] = filter.agentId;\n conditions.push(`${quoteIdent('agent_id', 'column name')} = @${name}`);\n }\n if (filter.threadId) {\n const name = `p${idx++}`;\n params[name] = filter.threadId;\n conditions.push(`${quoteIdent('thread_id', 'column name')} = @${name}`);\n }\n if (filter.resourceId) {\n const name = `p${idx++}`;\n params[name] = filter.resourceId;\n conditions.push(`${quoteIdent('resource_id', 'column name')} = @${name}`);\n }\n if (filter.runId) {\n const name = `p${idx++}`;\n params[name] = filter.runId;\n conditions.push(`${quoteIdent('run_id', 'column name')} = @${name}`);\n }\n if (filter.toolName) {\n const name = `p${idx++}`;\n params[name] = filter.toolName;\n conditions.push(`${quoteIdent('tool_name', 'column name')} = @${name}`);\n }\n if (filter.toolCallId) {\n const name = `p${idx++}`;\n params[name] = filter.toolCallId;\n conditions.push(`${quoteIdent('tool_call_id', 'column name')} = @${name}`);\n }\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdent('startedAt', 'column name')\n : filter.dateFilterBy === 'suspendedAt'\n ? quoteIdent('suspendedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdent('completedAt', 'column name')\n : quoteIdent('createdAt', 'column name');\n if (filter.fromDate) {\n const name = `p${idx++}`;\n params[name] = filter.fromDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} >= @${name}`);\n }\n if (filter.toDate) {\n const name = `p${idx++}`;\n params[name] = filter.toDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} < @${name}`);\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const usePagination = filter.perPage != null;\n\n let total = 0;\n if (usePagination) {\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${this.tableName()} ${whereSql}`,\n params,\n types,\n json: true,\n });\n total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n\n const orderCol =\n filter.orderBy === 'startedAt'\n ? quoteIdent('startedAt', 'column name')\n : filter.orderBy === 'suspendedAt'\n ? quoteIdent('suspendedAt', 'column name')\n : filter.orderBy === 'completedAt'\n ? quoteIdent('completedAt', 'column name')\n : quoteIdent('createdAt', 'column name');\n const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n\n let sql = `SELECT * FROM ${this.tableName()} ${whereSql} ORDER BY ${orderCol} ${direction}, id ${direction}`;\n if (usePagination) {\n const offset = filter.page != null ? filter.page * filter.perPage! : 0;\n const limitName = `p${idx++}`;\n const offsetName = `p${idx++}`;\n params[limitName] = filter.perPage!;\n params[offsetName] = offset;\n sql += ` LIMIT @${limitName} OFFSET @${offsetName}`;\n }\n\n const [rows] = await this.database.run({ sql, params, types, json: true });\n const tasks = (rows as Array<Record<string, any>>).map(rowToTask);\n return { tasks, total: usePagination ? total : tasks.length };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.db.runDml({\n sql: `DELETE FROM ${this.tableName()} WHERE id = @id`,\n params: { id: taskId },\n });\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n // Spanner needs an explicit `timestamp` type hint for date params bound as\n // ISO strings (see listTasks for the full rationale).\n const types: Record<string, any> = {};\n let idx = 1;\n\n const statusCondition = buildStatusCondition(filter, params, idx);\n if (statusCondition.kind === 'empty') {\n return;\n }\n if (statusCondition.kind === 'sql') {\n conditions.push(statusCondition.sql);\n idx = statusCondition.nextIdx;\n }\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdent('startedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdent('completedAt', 'column name')\n : quoteIdent('createdAt', 'column name');\n if (filter.fromDate) {\n const name = `p${idx++}`;\n params[name] = filter.fromDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} >= @${name}`);\n }\n if (filter.toDate) {\n const name = `p${idx++}`;\n params[name] = filter.toDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} < @${name}`);\n }\n if (filter.agentId) {\n const name = `p${idx++}`;\n params[name] = filter.agentId;\n conditions.push(`${quoteIdent('agent_id', 'column name')} = @${name}`);\n }\n if (filter.threadId) {\n const name = `p${idx++}`;\n params[name] = filter.threadId;\n conditions.push(`${quoteIdent('thread_id', 'column name')} = @${name}`);\n }\n if (filter.resourceId) {\n const name = `p${idx++}`;\n params[name] = filter.resourceId;\n conditions.push(`${quoteIdent('resource_id', 'column name')} = @${name}`);\n }\n if (filter.runId) {\n const name = `p${idx++}`;\n params[name] = filter.runId;\n conditions.push(`${quoteIdent('run_id', 'column name')} = @${name}`);\n }\n if (filter.toolName) {\n const name = `p${idx++}`;\n params[name] = filter.toolName;\n conditions.push(`${quoteIdent('tool_name', 'column name')} = @${name}`);\n }\n\n // Refuse to issue an unscoped DELETE callers that really want to wipe\n // the table should reach for `dangerouslyClearAll()`.\n if (conditions.length === 0) return;\n await this.db.runDml({\n sql: `DELETE FROM ${this.tableName()} WHERE ${conditions.join(' AND ')}`,\n params,\n types,\n });\n }\n\n async getRunningCount(): Promise<number> {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${this.tableName()} WHERE ${quoteIdent('status', 'column name')} = 'running'`,\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${this.tableName()} WHERE ${quoteIdent('status', 'column name')} = 'running' AND ${quoteIdent('agent_id', 'column name')} = @agentId`,\n params: { agentId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { BlobStore, createStorageErrorId, SKILL_BLOBS_SCHEMA, TABLE_SKILL_BLOBS } from '@mastra/core/storage';\nimport type { CreateIndexOptions, StorageBlobEntry } from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Content-addressable blob store backed by Spanner. Blobs are keyed by their\n * SHA-256 hash; duplicate puts are no-ops thanks to `INSERT OR IGNORE`.\n */\nexport class BlobsSpanner extends BlobStore {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SKILL_BLOBS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (BlobsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the blobs table and any caller-supplied custom indexes. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SKILL_BLOBS, schema: SKILL_BLOBS_SCHEMA });\n await this.createCustomIndexes();\n }\n\n /** Creates custom indexes routed to the blobs table; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from the blobs table. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SKILL_BLOBS });\n }\n\n /** Decodes a raw Spanner row into the public `StorageBlobEntry` shape. */\n private parseRow(row: Record<string, any>): StorageBlobEntry {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SKILL_BLOBS, row });\n return {\n hash: transformed.hash,\n content: transformed.content,\n size: Number(transformed.size),\n mimeType: transformed.mimeType ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Stores a single blob keyed by its hash. Idempotent: a repeat hash is a no-op. */\n async put(entry: StorageBlobEntry): Promise<void> {\n try {\n // INSERT OR IGNORE makes the call idempotent for content-addressable\n // hashes. A repeat put with the same hash is a no-op.\n const sql = `INSERT OR IGNORE INTO ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} (\n ${quoteIdent('hash', 'column name')},\n ${quoteIdent('content', 'column name')},\n ${quoteIdent('size', 'column name')},\n ${quoteIdent('mimeType', 'column name')},\n ${quoteIdent('createdAt', 'column name')}\n ) VALUES (@hash, @content, @size, @mimeType, @createdAt)`;\n await this.db.runDml({\n sql,\n params: {\n hash: entry.hash,\n content: entry.content,\n size: entry.size,\n mimeType: entry.mimeType ?? null,\n createdAt: (entry.createdAt ?? new Date()).toISOString(),\n },\n // createdAt must be hinted as TIMESTAMP, otherwise the client infers\n // STRING from the ISO payload and the bind fails the STRING -> TIMESTAMP\n // coercion (matches the rule applied in SpannerDB.insert).\n types: {\n createdAt: 'timestamp',\n ...(entry.mimeType == null ? { mimeType: 'string' } : {}),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_PUT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash: entry.hash },\n },\n error,\n );\n }\n }\n\n /** Fetches a blob by its hash, or `null` when no row matches. */\n async get(hash: string): Promise<StorageBlobEntry | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} WHERE ${quoteIdent('hash', 'column name')} = @hash LIMIT 1`,\n params: { hash },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseRow(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_GET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash },\n },\n error,\n );\n }\n }\n\n /** Returns true when a blob with the given hash exists; cheaper than `get`. */\n async has(hash: string): Promise<boolean> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found FROM ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} WHERE ${quoteIdent('hash', 'column name')} = @hash LIMIT 1`,\n params: { hash },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_HAS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash },\n },\n error,\n );\n }\n }\n\n /** Deletes the blob with the given hash. Returns true when a row was removed. */\n async delete(hash: string): Promise<boolean> {\n try {\n const rowCount = await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} WHERE ${quoteIdent('hash', 'column name')} = @hash`,\n params: { hash },\n });\n return rowCount > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash },\n },\n error,\n );\n }\n }\n\n /** Atomically stores a batch of blobs in a single Spanner transaction. */\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n try {\n // Wrap all inserts in a single transaction so that the whole batch either\n // commits or fails together. INSERT OR IGNORE keeps repeat hashes safe.\n const tableName = quoteIdent(TABLE_SKILL_BLOBS, 'table name');\n const insertSql = `INSERT OR IGNORE INTO ${tableName} (\n ${quoteIdent('hash', 'column name')},\n ${quoteIdent('content', 'column name')},\n ${quoteIdent('size', 'column name')},\n ${quoteIdent('mimeType', 'column name')},\n ${quoteIdent('createdAt', 'column name')}\n ) VALUES (@hash, @content, @size, @mimeType, @createdAt)`;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n for (const entry of entries) {\n await tx.runUpdate({\n sql: insertSql,\n params: {\n hash: entry.hash,\n content: entry.content,\n size: entry.size,\n mimeType: entry.mimeType ?? null,\n createdAt: (entry.createdAt ?? new Date()).toISOString(),\n },\n types: {\n createdAt: 'timestamp',\n ...(entry.mimeType == null ? { mimeType: 'string' } : {}),\n },\n });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_PUT_MANY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: entries.length },\n },\n error,\n );\n }\n }\n\n /** Fetches multiple blobs by hash in chunks of 500. Missing hashes are absent from the map. */\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n try {\n const tableName = quoteIdent(TABLE_SKILL_BLOBS, 'table name');\n const batchSize = 500;\n for (let i = 0; i < hashes.length; i += batchSize) {\n const batch = hashes.slice(i, i + batchSize);\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('hash', 'column name')} IN UNNEST(@hashes)`,\n params: { hashes: batch },\n types: { hashes: { type: 'array', child: { type: 'string' } } },\n json: true,\n });\n for (const row of rows as Array<Record<string, any>>) {\n const entry = this.parseRow(row);\n result.set(entry.hash, entry);\n }\n }\n return result;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_GET_MANY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: hashes.length },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n MCPClientsStorage,\n MCP_CLIENTS_SCHEMA,\n MCP_CLIENT_VERSIONS_SCHEMA,\n normalizePerPage,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageMCPClientType,\n StorageCreateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageUpdateMCPClientInput,\n} from '@mastra/core/storage';\nimport type {\n CreateMCPClientVersionInput,\n ListMCPClientVersionsInput,\n ListMCPClientVersionsOutput,\n MCPClientVersion,\n} from '@mastra/core/storage/domains/mcp-clients';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for MCP-client definitions and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/prompt-blocks.\n */\nexport class MCPClientsSpanner extends MCPClientsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (MCPClientsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the MCP-client tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_MCP_CLIENTS, schema: MCP_CLIENTS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_MCP_CLIENT_VERSIONS, schema: MCP_CLIENT_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENTS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('mcpClientId', 'column name')}\n FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpClientId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft MCP clients:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_mcp_clients_status_createdat_idx',\n table: TABLE_MCP_CLIENTS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_mcp_clients_authorid_idx',\n table: TABLE_MCP_CLIENTS,\n columns: ['authorId'],\n },\n // Unique index on (mcpClientId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_mcp_client_versions_unique_idx',\n table: TABLE_MCP_CLIENT_VERSIONS,\n columns: ['mcpClientId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_MCP_CLIENTS });\n }\n\n /** Decodes a raw Spanner thin-row into the public MCP-client shape. */\n private parseClientRow(row: Record<string, any>): StorageMCPClientType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MCP_CLIENTS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): MCPClientVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n mcpClientId: transformed.mcpClientId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n servers: transformed.servers ?? {},\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin MCP-client record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENTS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseClientRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n const { mcpClient } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = mcpClient;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Wrap the thin-record insert and the seed-version insert in a single\n // Spanner read-write transaction so they commit or roll back together,\n // making orphaned drafts impossible. runWithAbortRetry handles the\n // ABORTED retry loop; the inner block must be idempotent.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_MCP_CLIENTS,\n record: {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpClient.authorId ?? null,\n metadata: mcpClient.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n record: {\n id: versionId,\n mcpClientId: mcpClient.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n servers: (snapshot as any).servers ?? {},\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(mcpClient.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_CLIENT', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP client ${mcpClient.id} not found after creation`,\n details: { mcpClientId: mcpClient.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: mcpClient.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_CLIENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP client ${id} not found`,\n details: { mcpClientId: id },\n });\n }\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_MCP_CLIENTS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_CLIENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP client ${id} not found after update`,\n details: { mcpClientId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: id },\n },\n error,\n );\n }\n }\n\n /** Removes an MCP client and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENTS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing; defaults to `status='published'` so drafts never leak. */\n async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n // Default to status='published' so list() never leaks drafts to callers\n // that omit the filter.\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENTS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_MCP_CLIENTS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { mcpClients: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const mcpClients = (rows as Array<Record<string, any>>).map(r => this.parseClientRow(r));\n return {\n mcpClients,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing MCP client. */\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n record: {\n id: input.id,\n mcpClientId: input.mcpClientId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n servers: input.servers ?? {},\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as MCPClientVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, mcpClientId: input.mcpClientId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<MCPClientVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(mcpClientId, versionNumber)`. */\n async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { mcpClientId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for an MCP client. */\n async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { mcpClientId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single MCP client. */\n async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENT_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { mcpClientId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given MCP client. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_CLIENT_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given MCP client. */\n async countVersions(mcpClientId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n MCPServersStorage,\n MCP_SERVERS_SCHEMA,\n MCP_SERVER_VERSIONS_SCHEMA,\n normalizePerPage,\n TABLE_MCP_SERVERS,\n TABLE_MCP_SERVER_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageMCPServerType,\n StorageCreateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageUpdateMCPServerInput,\n} from '@mastra/core/storage';\nimport type {\n CreateMCPServerVersionInput,\n ListMCPServerVersionsInput,\n ListMCPServerVersionsOutput,\n MCPServerVersion,\n} from '@mastra/core/storage/domains/mcp-servers';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for MCP-server definitions and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/prompt-blocks.\n */\nexport class MCPServersSpanner extends MCPServersStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (MCPServersSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the MCP-server tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_MCP_SERVERS, schema: MCP_SERVERS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_MCP_SERVER_VERSIONS, schema: MCP_SERVER_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVERS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('mcpServerId', 'column name')}\n FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpServerId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft MCP servers:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_mcp_servers_status_createdat_idx',\n table: TABLE_MCP_SERVERS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_mcp_servers_authorid_idx',\n table: TABLE_MCP_SERVERS,\n columns: ['authorId'],\n },\n // Unique index on (mcpServerId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_mcp_server_versions_unique_idx',\n table: TABLE_MCP_SERVER_VERSIONS,\n columns: ['mcpServerId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_MCP_SERVER_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_MCP_SERVERS });\n }\n\n /** Decodes a raw Spanner thin-row into the public MCP-server shape. */\n private parseServerRow(row: Record<string, any>): StorageMCPServerType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MCP_SERVERS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): MCPServerVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n mcpServerId: transformed.mcpServerId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n version: transformed.version,\n description: transformed.description ?? undefined,\n instructions: transformed.instructions ?? undefined,\n repository: transformed.repository ?? undefined,\n releaseDate: transformed.releaseDate ?? undefined,\n isLatest: transformed.isLatest ?? undefined,\n packageCanonical: transformed.packageCanonical ?? undefined,\n tools: transformed.tools ?? undefined,\n agents: transformed.agents ?? undefined,\n workflows: transformed.workflows ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin MCP-server record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageMCPServerType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVERS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseServerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { mcpServer: StorageCreateMCPServerInput }): Promise<StorageMCPServerType> {\n const { mcpServer } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = mcpServer;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_MCP_SERVERS,\n record: {\n id: mcpServer.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpServer.authorId ?? null,\n metadata: mcpServer.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n record: {\n id: versionId,\n mcpServerId: mcpServer.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n version: (snapshot as any).version,\n description: (snapshot as any).description ?? null,\n instructions: (snapshot as any).instructions ?? null,\n repository: (snapshot as any).repository ?? null,\n releaseDate: (snapshot as any).releaseDate ?? null,\n isLatest: (snapshot as any).isLatest ?? null,\n packageCanonical: (snapshot as any).packageCanonical ?? null,\n tools: (snapshot as any).tools ?? null,\n agents: (snapshot as any).agents ?? null,\n workflows: (snapshot as any).workflows ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(mcpServer.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_SERVER', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP server ${mcpServer.id} not found after creation`,\n details: { mcpServerId: mcpServer.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: mcpServer.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdateMCPServerInput): Promise<StorageMCPServerType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_SERVER', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP server ${id} not found`,\n details: { mcpServerId: id },\n });\n }\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_MCP_SERVERS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_SERVER', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP server ${id} not found after update`,\n details: { mcpServerId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: id },\n },\n error,\n );\n }\n }\n\n /** Removes an MCP server and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVERS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing; defaults to `status='published'` so drafts never leak. */\n async list(args?: StorageListMCPServersInput): Promise<StorageListMCPServersOutput> {\n // Default to status='published' so list() never leaks drafts/archived\n // to callers that omit the filter.\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVERS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_MCP_SERVERS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVERS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { mcpServers: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const mcpServers = (rows as Array<Record<string, any>>).map(r => this.parseServerRow(r));\n return {\n mcpServers,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing MCP server. */\n async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n record: {\n id: input.id,\n mcpServerId: input.mcpServerId,\n versionNumber: input.versionNumber,\n name: input.name,\n version: input.version,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n repository: input.repository ?? null,\n releaseDate: input.releaseDate ?? null,\n isLatest: input.isLatest ?? null,\n packageCanonical: input.packageCanonical ?? null,\n tools: input.tools ?? null,\n agents: input.agents ?? null,\n workflows: input.workflows ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as MCPServerVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, mcpServerId: input.mcpServerId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<MCPServerVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(mcpServerId, versionNumber)`. */\n async getVersionByNumber(mcpServerId: string, versionNumber: number): Promise<MCPServerVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { mcpServerId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for an MCP server. */\n async getLatestVersion(mcpServerId: string): Promise<MCPServerVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { mcpServerId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single MCP server. */\n async listVersions(input: ListMCPServerVersionsInput): Promise<ListMCPServerVersionsOutput> {\n const { mcpServerId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVER_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { mcpServerId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given MCP server. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_SERVER_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given MCP server. */\n async countVersions(mcpServerId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { buildDateRangeFilter, transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for memory primitives: threads, messages, and resources\n * (the durable state surface used by `@mastra/memory`).\n */\nexport class MemorySpanner extends MemoryStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (MemorySpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the threads/messages/resources tables and any indexes. */\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 await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_threads_resourceid_createdat_idx',\n table: TABLE_THREADS,\n columns: ['resourceId', 'createdAt DESC'],\n },\n {\n name: 'mastra_messages_thread_id_createdat_idx',\n table: TABLE_MESSAGES,\n columns: ['thread_id', 'createdAt DESC'],\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from threads/messages/resources tables. Intended for tests. */\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 /**\n * Fetches a thread row by id, or `null` when absent.\n *\n * When `resourceId` is supplied (including the empty string) it scopes the\n * lookup so callers can enforce multi-tenant isolation: a thread that\n * exists under a different resourceId is reported as missing rather than\n * leaking across tenants.\n */\n async getThreadById({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise<StorageThreadType | null> {\n try {\n const params: Record<string, any> = { threadId };\n let where = `id = @threadId`;\n if (resourceId !== undefined) {\n where += ` AND ${quoteIdent('resourceId', 'column name')} = @resourceId`;\n params.resourceId = resourceId;\n }\n const [rows] = await this.database.run({\n sql: `SELECT id, ${quoteIdent('resourceId', 'column name')}, title, metadata, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${quoteIdent(TABLE_THREADS, 'table name')}\n WHERE ${where}`,\n params,\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return this.formatThreadRow(row);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n private formatThreadRow(row: Record<string, any>): StorageThreadType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_THREADS, row });\n return {\n id: transformed.id,\n resourceId: transformed.resourceId,\n title: transformed.title,\n metadata: transformed.metadata ?? {},\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Paginated thread listing with optional resourceId/metadata/date-range filters. */\n async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n try {\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: error instanceof Error ? error.message : 'Invalid pagination parameters',\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n });\n }\n const perPage = normalizePerPage(perPageInput, 100);\n\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: error instanceof Error ? error.message : 'Invalid metadata key',\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n });\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n const tableName = quoteIdent(TABLE_THREADS, 'table name');\n const whereClauses: string[] = [];\n const params: Record<string, any> = {};\n\n if (filter?.resourceId) {\n whereClauses.push(`${quoteIdent('resourceId', 'column name')} = @resourceId`);\n params.resourceId = filter.resourceId;\n }\n\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n let metadataIndex = 0;\n for (const [key, value] of Object.entries(filter.metadata)) {\n if (value !== null && typeof value === 'object') {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', '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, got ${Array.isArray(value) ? 'array' : 'object'}`,\n details: { key, valueType: Array.isArray(value) ? 'array' : 'object' },\n });\n }\n if (value === null) {\n whereClauses.push(`JSON_VALUE(metadata, '$.${key}') IS NULL`);\n } else {\n const paramName = `metadata${metadataIndex}`;\n whereClauses.push(`JSON_VALUE(metadata, '$.${key}') = @${paramName}`);\n if (typeof value === 'string') {\n params[paramName] = value;\n } else if (typeof value === 'boolean') {\n params[paramName] = value ? 'true' : 'false';\n } else {\n params[paramName] = String(value);\n }\n }\n metadataIndex++;\n }\n }\n\n const whereSql = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS total FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ total: number | string }>)[0]?.total ?? 0);\n if (total === 0) {\n return { threads: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const orderField = field === 'createdAt' ? 'createdAt' : 'updatedAt';\n const dir = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const limit = perPageInput === false ? total : perPage;\n const dataSql = `SELECT id, ${quoteIdent('resourceId', 'column name')}, title, metadata, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(orderField, 'column name')} ${dir}, id ${dir}\n LIMIT @limit OFFSET @offset`;\n const [rows] = await this.database.run({\n sql: dataSql,\n params: { ...params, limit, offset },\n json: true,\n });\n const threads = (rows as Array<Record<string, any>>).map(r => this.formatThreadRow(r));\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n page,\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n /** Upserts a thread row by id (`INSERT OR UPDATE` semantics). */\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.db.upsert({\n tableName: TABLE_THREADS,\n record: {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: thread.metadata ?? {},\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n },\n });\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n /** Updates a thread's title and merges the metadata payload. */\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 tableThreads = quoteIdent(TABLE_THREADS, 'table name');\n const now = new Date();\n let merged: Record<string, unknown> = {};\n let existingThread: StorageThreadType | null = null;\n try {\n // Read the row inside the transaction so it acquires a row lock; this\n // protects the metadata merge from a lost-update race against another\n // concurrent updateThread call.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT * FROM ${tableThreads} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_THREAD', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: { threadId: id, title },\n });\n }\n existingThread = this.formatThreadRow(row);\n merged = { ...(existingThread.metadata ?? {}), ...metadata };\n await this.db.update({\n tableName: TABLE_THREADS,\n keys: { id },\n data: {\n title,\n metadata: merged,\n updatedAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return {\n ...(existingThread as unknown as StorageThreadType),\n title,\n metadata: merged,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, title },\n },\n error,\n );\n }\n }\n\n /** Deletes a thread and all its messages atomically. */\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const messagesTable = quoteIdent(TABLE_MESSAGES, 'table name');\n const threadsTable = quoteIdent(TABLE_THREADS, 'table name');\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${messagesTable} WHERE ${quoteIdent('thread_id', 'column name')} = @threadId`,\n params: { threadId },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${threadsTable} WHERE id = @threadId`,\n params: { threadId },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n /** Parses raw message rows and converts them into the requested API format ('v1' or 'v2'). */\n private parseAndFormatMessages(messages: any[], format?: 'v1' | 'v2') {\n const parsed = messages.map(message => {\n if (typeof message.content === 'string') {\n try {\n return { ...message, content: JSON.parse(message.content) };\n } catch {\n return message;\n }\n }\n return message;\n });\n const list = new MessageList().add(parsed as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return format === 'v2' ? list.get.all.db() : list.get.all.v1();\n }\n\n /** Fetches a batch of messages by id; missing ids are silently dropped. */\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n try {\n const params: Record<string, any> = {};\n const placeholders = messageIds\n .map((id, i) => {\n const name = `id${i}`;\n params[name] = id;\n return `@${name}`;\n })\n .join(', ');\n const sql = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE id IN (${placeholders})\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, id DESC`;\n const [rows] = await this.database.run({ sql, params, json: true });\n const transformed = (rows as Array<Record<string, any>>).map(r =>\n transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: r }),\n );\n transformed.sort((a, b) => {\n const at = a.createdAt instanceof Date ? a.createdAt.getTime() : new Date(a.createdAt).getTime();\n const bt = b.createdAt instanceof Date ? b.createdAt.getTime() : new Date(b.createdAt).getTime();\n if (at !== bt) return at - bt;\n return String(a.id).localeCompare(String(b.id));\n });\n return { messages: this.parseAndFormatMessages(transformed, 'v2') as MastraDBMessage[] };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return { messages: [] };\n }\n }\n\n /** Resolves the `include` clause: pinned messages plus their before/after windows. */\n private async getIncludedMessages({ include }: { include: StorageListMessagesInput['include'] }) {\n if (!include || include.length === 0) return null;\n\n const ids = include.map(i => i.id);\n const placeholders: string[] = [];\n const idParams: Record<string, any> = {};\n ids.forEach((id, i) => {\n const name = `tid${i}`;\n placeholders.push(`@${name}`);\n idParams[name] = id;\n });\n const targetsSql = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE id IN (${placeholders.join(', ')})`;\n const [targetRows] = await this.database.run({ sql: targetsSql, params: idParams, json: true });\n const targetsById = new Map<string, Record<string, any>>();\n for (const t of targetRows as Array<Record<string, any>>) targetsById.set(t.id as string, t);\n\n const allRows: Record<string, any>[] = [];\n const seen = new Set<string>();\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const target = targetsById.get(id);\n if (!target) continue;\n\n const threadId = target.threadId as string;\n const targetCreatedAt =\n target.createdAt instanceof Date ? target.createdAt.toISOString() : (target.createdAt as string);\n\n if (!seen.has(target.id)) {\n seen.add(target.id);\n allRows.push(target);\n }\n\n if (withPreviousMessages > 0) {\n const [prev] = await this.database.run({\n sql: `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE ${quoteIdent('thread_id', 'column name')} = @threadId\n AND (${quoteIdent('createdAt', 'column name')} < @ts OR (${quoteIdent('createdAt', 'column name')} = @ts AND id < @id))\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, id DESC\n LIMIT @lim`,\n params: { threadId, ts: targetCreatedAt, id: target.id, lim: withPreviousMessages },\n json: true,\n });\n for (const row of (prev as Array<Record<string, any>>).reverse()) {\n if (!seen.has(row.id)) {\n seen.add(row.id);\n allRows.push(row);\n }\n }\n }\n\n if (withNextMessages > 0) {\n const [next] = await this.database.run({\n sql: `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE ${quoteIdent('thread_id', 'column name')} = @threadId\n AND (${quoteIdent('createdAt', 'column name')} > @ts OR (${quoteIdent('createdAt', 'column name')} = @ts AND id > @id))\n ORDER BY ${quoteIdent('createdAt', 'column name')} ASC, id ASC\n LIMIT @lim`,\n params: { threadId, ts: targetCreatedAt, id: target.id, lim: withNextMessages },\n json: true,\n });\n for (const row of next as Array<Record<string, any>>) {\n if (!seen.has(row.id)) {\n seen.add(row.id);\n allRows.push(row);\n }\n }\n }\n }\n\n return allRows.map(r => transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: r }));\n }\n\n /** Paginated message listing for a thread, with optional pinned-include and date-range filters. */\n async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n if (threadIds.length === 0 || threadIds.some(id => !id || !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', '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 // Reuse the base-class pagination contract (matches listThreads above).\n // It throws a clear Error which the outer try/catch wraps into a typed\n // MastraError below.\n this.validatePaginationInput(page, perPageInput ?? 40);\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderClause = `ORDER BY ${quoteIdent(field, 'column name')} ${direction}, id ${direction}`;\n const tableName = quoteIdent(TABLE_MESSAGES, 'table name');\n\n const filters: Record<string, any> = {\n thread_id: threadIds.length === 1 ? threadIds[0] : { $in: threadIds },\n ...(resourceId ? { resourceId } : {}),\n ...buildDateRangeFilter(filter?.dateRange, 'createdAt'),\n };\n const {\n sql: whereSql,\n params: whereParams,\n types: whereTypes,\n } = this.db.prepareWhereClause(filters, TABLE_MESSAGES);\n\n if (perPage === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // perPage=0 with includes: skip COUNT and base queries; only fetch the\n // included messages.\n if (perPage === 0 && include && include.length > 0) {\n const includeMessages = (await this.getIncludedMessages({ include })) ?? [];\n const parsedIncludes = this.parseAndFormatMessages(includeMessages, 'v2') as MastraDBMessage[];\n const dirMul = direction === 'ASC' ? 1 : -1;\n const sortedIncludes = parsedIncludes.sort((a, b) => {\n const aVal = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bVal = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n if (aVal == null || bVal == null) {\n return aVal == null && bVal == null ? a.id.localeCompare(b.id) : aVal == null ? 1 : -1;\n }\n const diff =\n (typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal))) * dirMul;\n return diff !== 0 ? diff : a.id.localeCompare(b.id) * dirMul;\n });\n return {\n messages: sortedIncludes,\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Total count\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS total FROM ${tableName}${whereSql}`,\n params: whereParams,\n types: whereTypes,\n json: true,\n });\n const total = Number((countRows as Array<{ total: number | string }>)[0]?.total ?? 0);\n\n // Paginated rows\n const baseRows: Record<string, any>[] = [];\n if (perPage > 0) {\n const baseQuery = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${tableName}${whereSql}\n ${orderClause}\n ${perPageInput === false ? '' : 'LIMIT @limit OFFSET @offset'}`;\n const dataParams: Record<string, any> = { ...whereParams };\n const dataTypes: Record<string, any> = { ...whereTypes };\n if (perPageInput !== false) {\n dataParams.limit = perPage;\n dataParams.offset = offset;\n }\n const [rows] = await this.database.run({\n sql: baseQuery,\n params: dataParams,\n types: dataTypes,\n json: true,\n });\n baseRows.push(...(rows as Array<Record<string, any>>));\n }\n\n const messages: Record<string, any>[] = baseRows.map(r =>\n transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: r }),\n );\n\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // Includes\n if (include?.length) {\n const seen = new Set(messages.map(m => m.id));\n const includeMessages = await this.getIncludedMessages({ include });\n includeMessages?.forEach(msg => {\n if (!seen.has(msg.id)) {\n messages.push(msg);\n seen.add(msg.id);\n }\n });\n }\n\n const parsed = this.parseAndFormatMessages(messages, 'v2') as MastraDBMessage[];\n const mult = direction === 'ASC' ? 1 : -1;\n const finalMessages = parsed.sort((a, b) => {\n const aVal = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bVal = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n if (aVal == null || bVal == null) {\n return aVal == null && bVal == null ? a.id.localeCompare(b.id) : aVal == null ? 1 : -1;\n }\n const diff =\n (typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal))) * mult;\n if (diff !== 0) return diff;\n return a.id.localeCompare(b.id) * mult;\n });\n\n // Counting `include`d rows toward \"all returned\" is intentional: the\n // shared storage contract treats hasMore=false once the caller has the\n // entire thread in hand, regardless of whether the base page or the\n // include path delivered the trailing messages. The shared\n // `should respect pagination when using include` test pins this.\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n /** Upserts a batch of messages and bumps every touched thread's `updatedAt` in a single transaction. */\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n // Collect every distinct threadId touched by this batch and verify each\n // one exists. Previously only messages[0] was validated, so a batch\n // spanning multiple threads could insert orphaned messages and only bump\n // one parent's updatedAt.\n const threadIds = new Set<string>();\n for (const message of messages) {\n if (!message.threadId) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'SAVE_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: 'Thread ID is required for every message',\n details: { messageId: message.id ?? '' },\n });\n }\n threadIds.add(message.threadId);\n }\n const orderedThreadIds = Array.from(threadIds);\n const errorContext = orderedThreadIds.join(',');\n\n for (const tid of orderedThreadIds) {\n const thread = await this.getThreadById({ threadId: tid });\n if (!thread) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'SAVE_MESSAGES', 'THREAD_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Thread ${tid} not found`,\n details: { threadId: tid },\n });\n }\n }\n\n const tableMessages = quoteIdent(TABLE_MESSAGES, 'table name');\n const tableThreads = quoteIdent(TABLE_THREADS, 'table name');\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n for (const message of messages) {\n if (!message.resourceId) {\n throw new Error('Expected to find a resourceId for message');\n }\n const sql = `INSERT OR UPDATE INTO ${tableMessages} (id, ${quoteIdent('thread_id', 'column name')}, content, ${quoteIdent('createdAt', 'column name')}, role, type, ${quoteIdent('resourceId', 'column name')})\n VALUES (@id, @thread_id, @content, @createdAt, @role, @type, @resourceId)`;\n await tx.runUpdate({\n sql,\n params: {\n id: message.id,\n thread_id: message.threadId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: message.createdAt instanceof Date ? message.createdAt.toISOString() : message.createdAt,\n role: message.role,\n type: message.type || 'v2',\n resourceId: message.resourceId,\n },\n });\n }\n // Bump updatedAt for every thread touched by this batch using a\n // single IN-list UPDATE (cheaper than per-thread round-trips and\n // keeps the change atomic with the message inserts).\n const updatedAt = new Date().toISOString();\n const inParams: Record<string, any> = { updatedAt };\n const placeholders = orderedThreadIds.map((tid, i) => {\n const name = `tid${i}`;\n inParams[name] = tid;\n return `@${name}`;\n });\n await tx.runUpdate({\n sql: `UPDATE ${tableThreads} SET ${quoteIdent('updatedAt', 'column name')} = @updatedAt WHERE id IN (${placeholders.join(', ')})`,\n params: inParams,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n const list = new MessageList().add(messages as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: errorContext },\n },\n error,\n );\n }\n }\n\n /** Merges partial updates onto existing messages and bumps affected thread `updatedAt`. */\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: {\n metadata?: MastraMessageContentV2['metadata'];\n content?: MastraMessageContentV2['content'];\n };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (!messages || messages.length === 0) return [];\n const messageIds = messages.map(m => m.id);\n\n const params: Record<string, any> = {};\n const placeholders = messageIds\n .map((id, i) => {\n const name = `id${i}`;\n params[name] = id;\n return `@${name}`;\n })\n .join(', ');\n\n const selectSql = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE id IN (${placeholders})`;\n\n const payloadById = new Map<string, (typeof messages)[number]>();\n for (const m of messages) payloadById.set(m.id, m);\n\n const threadIdsToUpdate = new Set<string>();\n let anyExisting = false;\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n // Re-read existing rows on every retry. Doing this *outside* the\n // retry let an aborted transaction merge stale row state on the next\n // attempt, under contention that produces lost updates.\n const [existingRows] = await tx.run({ sql: selectSql, params, json: true });\n const existingMessages = (existingRows as Array<Record<string, any>>).map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // leave as-is\n }\n }\n return msg as MastraDBMessage;\n });\n if (existingMessages.length === 0) {\n await tx.commit();\n return;\n }\n anyExisting = true;\n for (const existing of existingMessages) {\n const updatePayload = payloadById.get(existing.id);\n if (!updatePayload) continue;\n const { id, ...fields } = updatePayload;\n if (Object.keys(fields).length === 0) continue;\n if (existing.threadId) threadIdsToUpdate.add(existing.threadId);\n if (updatePayload.threadId && updatePayload.threadId !== existing.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n const setClauses: string[] = [];\n const updateParams: Record<string, any> = { id };\n const columnMapping: Record<string, string> = { threadId: 'thread_id' };\n const updatable: Record<string, any> = { ...fields };\n if (updatable.content) {\n const newContent = {\n ...existing.content,\n ...updatable.content,\n ...(existing.content?.metadata && updatable.content.metadata\n ? { metadata: { ...existing.content.metadata, ...updatable.content.metadata } }\n : {}),\n };\n setClauses.push('content = @content');\n updateParams.content = JSON.stringify(newContent);\n delete updatable.content;\n }\n for (const key of Object.keys(updatable)) {\n const dbColumn = columnMapping[key] || key;\n setClauses.push(`${quoteIdent(dbColumn, 'column name')} = @${dbColumn}`);\n updateParams[dbColumn] = updatable[key];\n }\n if (setClauses.length === 0) continue;\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(TABLE_MESSAGES, 'table name')} SET ${setClauses.join(', ')} WHERE id = @id`,\n params: updateParams,\n });\n }\n if (threadIdsToUpdate.size > 0) {\n const threadParams: Record<string, any> = {};\n const inClauses = Array.from(threadIdsToUpdate).map((tid, i) => {\n const name = `tid${i}`;\n threadParams[name] = tid;\n return `@${name}`;\n });\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(TABLE_THREADS, 'table name')} SET ${quoteIdent('updatedAt', 'column name')} = @updatedAt WHERE id IN (${inClauses.join(', ')})`,\n params: { ...threadParams, updatedAt: new Date().toISOString() },\n });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n\n if (!anyExisting) return [];\n const [refetched] = await this.database.run({ sql: selectSql, params, json: true });\n return (refetched as Array<Record<string, any>>).map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // leave as-is\n }\n }\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: msg });\n return transformed as MastraDBMessage;\n });\n }\n\n /** Deletes a batch of messages and bumps the affected threads' `updatedAt`. */\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) return;\n try {\n const messageTableName = quoteIdent(TABLE_MESSAGES, 'table name');\n const threadTableName = quoteIdent(TABLE_THREADS, 'table name');\n const params: Record<string, any> = {};\n const placeholders = messageIds\n .map((id, i) => {\n const name = `p${i}`;\n params[name] = id;\n return `@${name}`;\n })\n .join(', ');\n\n const [threadRows] = await this.database.run({\n sql: `SELECT DISTINCT ${quoteIdent('thread_id', 'column name')} AS thread_id FROM ${messageTableName} WHERE id IN (${placeholders})`,\n params,\n json: true,\n });\n const threadIds = (threadRows as Array<Record<string, any>>).map(r => r.thread_id).filter(Boolean) as string[];\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${messageTableName} WHERE id IN (${placeholders})`,\n params,\n });\n if (threadIds.length > 0) {\n for (const tid of threadIds) {\n await tx.runUpdate({\n sql: `UPDATE ${threadTableName} SET ${quoteIdent('updatedAt', 'column name')} = CURRENT_TIMESTAMP() WHERE id = @id`,\n params: { id: tid },\n });\n }\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n /** Fetches a resource row by id, or `null` when absent. */\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT id, ${quoteIdent('workingMemory', 'column name')}, metadata, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${quoteIdent(TABLE_RESOURCES, 'table name')}\n WHERE id = @id LIMIT 1`,\n params: { id: resourceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_RESOURCES, row });\n return {\n id: transformed.id,\n workingMemory: transformed.workingMemory,\n metadata: transformed.metadata,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n } as StorageResourceType;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n /** Upserts a resource row by id (`INSERT OR UPDATE` semantics). */\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n await this.db.upsert({\n tableName: TABLE_RESOURCES,\n record: {\n id: resource.id,\n workingMemory: resource.workingMemory ?? null,\n metadata: resource.metadata ?? {},\n createdAt: resource.createdAt,\n updatedAt: resource.updatedAt,\n },\n });\n return resource;\n }\n\n /** Updates a resource's `workingMemory` and merges its `metadata`. */\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 tableResources = quoteIdent(TABLE_RESOURCES, 'table name');\n const now = new Date();\n let updated: StorageResourceType | null = null;\n let createdNew = false;\n try {\n // Read the row inside the transaction so the metadata merge can't lose\n // updates from a concurrent updateResource call.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT * FROM ${tableResources} WHERE id = @id LIMIT 1`,\n params: { id: resourceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) {\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n await this.db.upsert({\n tableName: TABLE_RESOURCES,\n record: {\n id: newResource.id,\n workingMemory: newResource.workingMemory ?? null,\n metadata: newResource.metadata ?? {},\n createdAt: newResource.createdAt,\n updatedAt: newResource.updatedAt,\n },\n transaction: tx,\n });\n updated = newResource;\n createdNew = true;\n await tx.commit();\n return;\n }\n\n const existing = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_RESOURCES,\n row,\n });\n const merged: StorageResourceType = {\n id: existing.id,\n workingMemory: workingMemory !== undefined ? workingMemory : existing.workingMemory,\n metadata: { ...(existing.metadata ?? {}), ...metadata },\n createdAt: existing.createdAt,\n updatedAt: now,\n };\n const data: Record<string, any> = { updatedAt: merged.updatedAt };\n if (workingMemory !== undefined) data.workingMemory = workingMemory;\n if (metadata) data.metadata = merged.metadata;\n await this.db.update({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n data,\n transaction: tx,\n });\n updated = merged;\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n // `createdNew` is set inside the closure so subsequent reads in tests\n // don't rely on a stale row image.\n void createdNew;\n return updated as unknown as StorageResourceType;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { Spanner } from '@google-cloud/spanner';\nimport type { Database, Transaction } from '@google-cloud/spanner';\nimport type { ExecuteSqlRequest, TimestampBounds } from '@google-cloud/spanner/build/src/transaction';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, listMetricsArgsSchema, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateMetricsArgs,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n ListMetricsArgs,\n ListMetricsResponse,\n MetricDistinctColumn,\n MetricRecord,\n} from '@mastra/core/storage';\nimport type { SpannerInitMode } from '../../db';\nimport { quoteIdent } from '../../db/utils';\n\n/** Physical table name. Not exposed by `@mastra/core/storage` (no TABLE_METRICS\n * constant exists), so the Spanner adapter owns the name itself. Follows the\n * same `mastra_ai_*` convention as `TABLE_SPANS = 'mastra_ai_spans'`. */\nexport const TABLE_AI_METRICS = 'mastra_ai_metrics';\n\n/**\n * Ordered column list for `INSERT INTO mastra_ai_metrics (...)`. The order\n * matches the DDL below so the batched insert can render value tuples without\n * having to dictionary-resolve each column.\n */\nconst METRIC_COLUMNS = [\n 'metricId',\n 'timestamp',\n 'name',\n 'value',\n 'traceId',\n 'spanId',\n 'experimentId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'source',\n 'executionSource',\n 'serviceName',\n 'provider',\n 'model',\n 'estimatedCost',\n 'costUnit',\n 'tags',\n 'labels',\n 'costMetadata',\n 'metadata',\n 'scope',\n 'createdAt',\n] as const;\n\ntype MetricColumn = (typeof METRIC_COLUMNS)[number];\n\nconst JSON_COLUMNS = new Set<MetricColumn>(['tags', 'labels', 'costMetadata', 'metadata', 'scope']);\n\nconst TIMESTAMP_COLUMNS = new Set<MetricColumn>(['timestamp', 'createdAt']);\n\nconst NUMERIC_COLUMNS = new Set<MetricColumn>(['value', 'estimatedCost']);\n\n/** Plain SCALAR columns that are safe targets for groupBy / equality filters. */\nconst SCALAR_GROUPBY_COLUMNS = new Set<string>([\n 'name',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'source',\n 'executionSource',\n 'serviceName',\n 'provider',\n 'model',\n 'costUnit',\n 'traceId',\n 'spanId',\n 'experimentId',\n]);\n\nconst QUOTED_METRIC_COLUMNS_SQL = METRIC_COLUMNS.map(c => quoteIdent(c, 'column name')).join(', ');\n\n/** Build the CREATE TABLE statement for the metrics events table. */\nfunction buildCreateTableDdl(): string {\n const lines: string[] = [];\n for (const col of METRIC_COLUMNS) {\n let type: string;\n if (JSON_COLUMNS.has(col)) type = 'JSON';\n else if (TIMESTAMP_COLUMNS.has(col)) type = 'TIMESTAMP';\n else if (NUMERIC_COLUMNS.has(col)) type = 'FLOAT64';\n else type = 'STRING(MAX)';\n const nullable =\n col === 'metricId' || col === 'timestamp' || col === 'name' || col === 'value' || col === 'createdAt'\n ? ' NOT NULL'\n : '';\n lines.push(` ${quoteIdent(col, 'column name')} ${type}${nullable}`);\n }\n return `CREATE TABLE ${quoteIdent(TABLE_AI_METRICS, 'table name')} (\\n${lines.join(',\\n')}\\n) PRIMARY KEY (${quoteIdent(\n 'metricId',\n 'column name',\n )})`;\n}\n\nexport type MetricIndexDef = {\n name: string;\n columns: string[];\n /**\n * Non-key columns copied into the secondary index so common aggregate reads\n * can be index-only instead of joining back to the base metrics table.\n */\n storing?: string[];\n};\n\n/**\n * Default secondary indexes. Every analytical query starts with a name filter\n * and a timestamp range, so the leading composite index is `(name, timestamp DESC)`.\n *\n * Intentionally NOT here: a bare `(timestamp DESC)` index. A monotonically\n * increasing leading column funnels every new row through a single Spanner\n * split until the planner re-splits, capping per-region write throughput\n * regardless of node count. The `(name, ...)` and `(provider, model, ...)`\n * composites give the planner index access for the common queries while\n * smearing writes across many splits via the leading low-cardinality column.\n * Unfiltered \"latest metrics\" reads fall back to a full scan + sort, which\n * is acceptable because they're bounded by `perPage` and rarely on the\n * dashboard hot path.\n */\nexport function defaultMetricIndexDefs(): MetricIndexDef[] {\n return [\n {\n name: 'mastra_ai_metrics_name_ts_idx',\n columns: ['name', 'timestamp DESC'],\n storing: [\n 'value',\n 'estimatedCost',\n 'costUnit',\n 'provider',\n 'model',\n 'environment',\n 'serviceName',\n 'executionSource',\n 'entityType',\n 'entityName',\n ],\n },\n { name: 'mastra_ai_metrics_traceid_spanid_idx', columns: ['traceId', 'spanId'] },\n { name: 'mastra_ai_metrics_entitytype_entityname_idx', columns: ['entityType', 'entityName'] },\n { name: 'mastra_ai_metrics_orgid_userid_idx', columns: ['organizationId', 'userId'] },\n {\n name: 'mastra_ai_metrics_provider_model_ts_idx',\n columns: ['provider', 'model', 'timestamp DESC'],\n storing: ['name', 'value', 'estimatedCost', 'costUnit'],\n },\n { name: 'mastra_ai_metrics_environment_idx', columns: ['environment'] },\n { name: 'mastra_ai_metrics_service_name_idx', columns: ['serviceName'] },\n ];\n}\n\nfunction renderIndexColumns(columns: string[]): string {\n return columns\n .map(col => {\n if (col.endsWith(' DESC') || col.endsWith(' ASC')) {\n const i = col.lastIndexOf(' ');\n return `${quoteIdent(col.slice(0, i), 'column name')} ${col.slice(i + 1)}`;\n }\n return quoteIdent(col, 'column name');\n })\n .join(', ');\n}\n\nfunction normalizeIndexColumns(columns: string[]): string[] {\n return columns.map(col => (col.endsWith(' ASC') ? col.slice(0, -' ASC'.length) : col));\n}\n\nfunction sameStringSet(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const sortedA = [...a].sort();\n const sortedB = [...b].sort();\n return sortedA.every((value, index) => value === sortedB[index]);\n}\n\nfunction buildCreateIndexDdl(idx: MetricIndexDef): string {\n const cols = renderIndexColumns(idx.columns);\n const storing =\n idx.storing && idx.storing.length > 0\n ? ` STORING (${idx.storing.map(col => quoteIdent(col, 'column name')).join(', ')})`\n : '';\n return `CREATE INDEX ${quoteIdent(idx.name, 'index name')} ON ${quoteIdent(\n TABLE_AI_METRICS,\n 'table name',\n )} (${cols})${storing}`;\n}\n\nasync function tableExists(database: Database, tableName: string): Promise<boolean> {\n const [rows] = await database.run({\n sql: `SELECT 1 AS found FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n}\n\nasync function indexExists(database: Database, indexName: string): Promise<boolean> {\n const [rows] = await database.run({\n sql: `SELECT 1 AS found FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n}\n\nasync function validateMetricIndex(database: Database, expected: MetricIndexDef): Promise<void> {\n if (!(await indexExists(database, expected.name))) {\n throw validateError(\n 'METRICS_INDEX_CREATE',\n `Index ${expected.name} on ${TABLE_AI_METRICS} does not exist (initMode='validate' will not create it)`,\n { indexName: expected.name, tableName: TABLE_AI_METRICS },\n );\n }\n\n const [rows] = await database.run({\n sql: `SELECT COLUMN_NAME, COLUMN_ORDERING\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName\n ORDER BY ORDINAL_POSITION`,\n params: { indexName: expected.name },\n json: true,\n });\n\n const actualRows = rows as Array<{ COLUMN_NAME: string; COLUMN_ORDERING: string | null }>;\n const actualKeyColumns = actualRows\n .filter(row => row.COLUMN_ORDERING !== null)\n .map(\n row =>\n `${row.COLUMN_NAME}${row.COLUMN_ORDERING && row.COLUMN_ORDERING !== 'ASC' ? ` ${row.COLUMN_ORDERING}` : ''}`,\n );\n const expectedKeyColumns = normalizeIndexColumns(expected.columns);\n const keyColumnsMatch =\n actualKeyColumns.length === expectedKeyColumns.length &&\n actualKeyColumns.every((column, index) => column === expectedKeyColumns[index]);\n if (!keyColumnsMatch) {\n throw validateError(\n 'METRICS_INDEX_CREATE',\n `Index ${expected.name} column list mismatch (expected [${expectedKeyColumns.join(', ')}], actual [${actualKeyColumns.join(', ')}])`,\n {\n indexName: expected.name,\n tableName: TABLE_AI_METRICS,\n expectedColumns: expectedKeyColumns.join(','),\n actualColumns: actualKeyColumns.join(','),\n },\n );\n }\n\n const actualStoringColumns = actualRows.filter(row => row.COLUMN_ORDERING === null).map(row => row.COLUMN_NAME);\n const expectedStoringColumns = expected.storing ?? [];\n if (!sameStringSet(actualStoringColumns, expectedStoringColumns)) {\n throw validateError(\n 'METRICS_INDEX_CREATE',\n `Index ${expected.name} STORING column list mismatch (expected [${expectedStoringColumns.join(', ')}], actual [${actualStoringColumns.join(', ')}])`,\n {\n indexName: expected.name,\n tableName: TABLE_AI_METRICS,\n expectedStoringColumns: expectedStoringColumns.join(','),\n actualStoringColumns: actualStoringColumns.join(','),\n },\n );\n }\n}\n\nfunction validateError(action: string, message: string, details: Record<string, string>): MastraError {\n return new MastraError({\n id: createStorageErrorId('SPANNER', action, 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: message,\n details,\n });\n}\n\n/**\n * Create the metrics table + default indexes idempotently. Under\n * `initMode: 'validate'` the function issues no DDL and instead verifies that\n * the table and every default index already exist, throwing a typed user\n * error otherwise. Mirrors the contract `SpannerDB.createTable` exposes for\n * the core tables.\n */\nexport async function ensureMetricsTable(\n database: Database,\n options: { initMode: SpannerInitMode; skipDefaultIndexes?: boolean },\n): Promise<void> {\n const statements: string[] = [];\n\n const hasTable = await tableExists(database, TABLE_AI_METRICS);\n if (options.initMode === 'validate') {\n if (!hasTable) {\n throw validateError(\n 'METRICS_CREATE_TABLE',\n `Table ${TABLE_AI_METRICS} does not exist (initMode='validate' will not create it)`,\n { tableName: TABLE_AI_METRICS },\n );\n }\n if (!options.skipDefaultIndexes) {\n for (const idx of defaultMetricIndexDefs()) {\n await validateMetricIndex(database, idx);\n }\n }\n return;\n }\n\n if (!hasTable) {\n statements.push(buildCreateTableDdl());\n }\n if (!options.skipDefaultIndexes) {\n for (const idx of defaultMetricIndexDefs()) {\n if (await indexExists(database, idx.name)) continue;\n statements.push(buildCreateIndexDdl(idx));\n }\n }\n if (statements.length === 0) return;\n const [operation] = await database.updateSchema(statements);\n await operation.promise();\n}\n\nfunction decodeMetricRow(row: Record<string, unknown>): MetricRecord {\n const parseJson = (val: unknown): unknown => {\n if (val == null) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n const toDate = (val: unknown): Date | null => {\n if (val == null) return null;\n if (val instanceof Date) return new Date(val.getTime());\n if (typeof val === 'string') return new Date(val);\n if (typeof val === 'object' && typeof (val as { value?: unknown }).value === 'string') {\n return new Date((val as { value: string }).value);\n }\n return null;\n };\n return {\n metricId: (row.metricId as string) ?? null,\n timestamp: toDate(row.timestamp)!,\n name: row.name as string,\n value: Number(row.value),\n traceId: (row.traceId as string) ?? null,\n spanId: (row.spanId as string) ?? null,\n experimentId: (row.experimentId as string) ?? null,\n entityType: (row.entityType as MetricRecord['entityType']) ?? null,\n entityId: (row.entityId as string) ?? null,\n entityName: (row.entityName as string) ?? null,\n entityVersionId: (row.entityVersionId as string) ?? null,\n parentEntityVersionId: (row.parentEntityVersionId as string) ?? null,\n parentEntityType: (row.parentEntityType as MetricRecord['parentEntityType']) ?? null,\n parentEntityId: (row.parentEntityId as string) ?? null,\n parentEntityName: (row.parentEntityName as string) ?? null,\n rootEntityVersionId: (row.rootEntityVersionId as string) ?? null,\n rootEntityType: (row.rootEntityType as MetricRecord['rootEntityType']) ?? null,\n rootEntityId: (row.rootEntityId as string) ?? null,\n rootEntityName: (row.rootEntityName as string) ?? null,\n userId: (row.userId as string) ?? null,\n organizationId: (row.organizationId as string) ?? null,\n resourceId: (row.resourceId as string) ?? null,\n runId: (row.runId as string) ?? null,\n sessionId: (row.sessionId as string) ?? null,\n threadId: (row.threadId as string) ?? null,\n requestId: (row.requestId as string) ?? null,\n environment: (row.environment as string) ?? null,\n source: (row.source as string) ?? null,\n executionSource: (row.executionSource as string) ?? null,\n serviceName: (row.serviceName as string) ?? null,\n provider: (row.provider as string) ?? null,\n model: (row.model as string) ?? null,\n estimatedCost: row.estimatedCost === null || row.estimatedCost === undefined ? null : Number(row.estimatedCost),\n costUnit: (row.costUnit as string) ?? null,\n costMetadata: parseJson(row.costMetadata) as MetricRecord['costMetadata'],\n tags: parseJson(row.tags) as MetricRecord['tags'],\n labels: (parseJson(row.labels) as MetricRecord['labels']) ?? {},\n metadata: parseJson(row.metadata) as MetricRecord['metadata'],\n scope: parseJson(row.scope) as MetricRecord['scope'],\n } as MetricRecord;\n}\n\n/**\n * Validate a metric column or label key against an identifier-safe regex\n * before embedding it in raw SQL. Spanner accepts JSON_VALUE paths as string\n * parameters in some contexts, but we keep the path literal here so the\n * planner can fold the predicate and we get an easy-to-read query log.\n */\nfunction safeIdent(name: string, kind: string): string {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'METRICS_FILTER', 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid ${kind}: ${name}`,\n details: { [kind.replace(/\\s+/g, '')]: name },\n });\n }\n return name;\n}\n\nfunction resolveDistinctColumnSql(distinctColumn: MetricDistinctColumn | undefined): string {\n if (!distinctColumn) {\n throw new Error(`count_distinct aggregation requires a 'distinctColumn' argument`);\n }\n // Defense in depth: schema enum already restricts this, but the value lands\n // in raw SQL so re-check against the system allowlist.\n if (!(METRIC_DISTINCT_COLUMNS as readonly string[]).includes(distinctColumn)) {\n throw new Error(`Invalid distinctColumn: ${distinctColumn}`);\n }\n return quoteIdent(distinctColumn, 'column name');\n}\n\nfunction buildAggregationSql(\n aggregation: AggregationType,\n measure = 'value',\n distinctColumn?: MetricDistinctColumn,\n): string {\n switch (aggregation) {\n case 'sum':\n return `SUM(${measure})`;\n case 'avg':\n return `AVG(${measure})`;\n case 'min':\n return `MIN(${measure})`;\n case 'max':\n return `MAX(${measure})`;\n case 'count':\n return `CAST(COUNT(${measure}) AS FLOAT64)`;\n case 'count_distinct':\n // Use exact COUNT(DISTINCT) rather than APPROX_COUNT_DISTINCT for\n // portability: the latter exists in modern Spanner but isn't yet in\n // the local emulator. The cost difference only matters at very high\n // cardinality and the distinctColumn allowlist already excludes ID\n // columns that would blow up the distinct set.\n return `CAST(COUNT(DISTINCT ${resolveDistinctColumnSql(distinctColumn)}) AS FLOAT64)`;\n case 'last':\n // Spanner has no arg_max; ARRAY_AGG(value ORDER BY timestamp DESC LIMIT 1)\n // returns the most recent value per group in a single pass.\n return `(ARRAY_AGG(${measure} ORDER BY \\`timestamp\\` DESC LIMIT 1))[OFFSET(0)]`;\n default:\n return `SUM(${measure})`;\n }\n}\n\n/**\n * Cost aggregation matches what other adapters emit: SUM(estimatedCost) and a\n * shared costUnit if (and only if) all rows in the group carry the same unit.\n * Spanner has no FILTER clause; COUNT(DISTINCT col) ignores NULLs by default,\n * and so does MIN, so the IS-NOT-NULL guard isn't needed.\n */\nconst COST_SUMMARY_SELECT = `SUM(${quoteIdent('estimatedCost', 'column name')}) AS estimatedCost, CASE WHEN COUNT(DISTINCT ${quoteIdent('costUnit', 'column name')}) = 1 THEN MIN(${quoteIdent('costUnit', 'column name')}) ELSE NULL END AS costUnit`;\n\nfunction normalizeCostSummaryRow(row: Record<string, unknown>): {\n estimatedCost: number | null;\n costUnit: string | null;\n} {\n return {\n estimatedCost: row.estimatedCost == null ? null : Number(row.estimatedCost),\n costUnit: row.costUnit == null ? null : String(row.costUnit),\n };\n}\n\n/**\n * Bucket-by-time SQL. Spanner's `TIMESTAMP_TRUNC` only supports calendar parts\n * (MINUTE, HOUR, DAY, ...), so multi-minute buckets are emulated with a\n * `TIMESTAMP_SUB(MOD)` trick that snaps each row down to the nearest\n * 5/15-minute boundary.\n */\nfunction buildTimeBucketSql(interval: AggregationInterval, timestampCol = '`timestamp`'): string {\n switch (interval) {\n case '1m':\n return `TIMESTAMP_TRUNC(${timestampCol}, MINUTE)`;\n case '5m':\n return `TIMESTAMP_SUB(TIMESTAMP_TRUNC(${timestampCol}, MINUTE), INTERVAL MOD(EXTRACT(MINUTE FROM ${timestampCol}), 5) MINUTE)`;\n case '15m':\n return `TIMESTAMP_SUB(TIMESTAMP_TRUNC(${timestampCol}, MINUTE), INTERVAL MOD(EXTRACT(MINUTE FROM ${timestampCol}), 15) MINUTE)`;\n case '1h':\n return `TIMESTAMP_TRUNC(${timestampCol}, HOUR)`;\n case '1d':\n return `TIMESTAMP_TRUNC(${timestampCol}, DAY)`;\n default:\n return `TIMESTAMP_TRUNC(${timestampCol}, HOUR)`;\n }\n}\n\n/**\n * Resolve a groupBy entry: a scalar column hits the columns directly; anything\n * else is treated as a label key and routed through `JSON_VALUE(labels, ...)`.\n * Returns both the SELECT expression and the GROUP BY expression because some\n * backends can group by alias and some can't, Spanner cannot, so we re-emit\n * the full expression in GROUP BY.\n */\ntype ResolvedGroupBy = {\n key: string;\n selectSql: string;\n groupSql: string;\n /** Column name used to read this dimension back out of the row */\n resultKey: string;\n};\n\nfunction resolveGroupBy(groupBy: string[]): ResolvedGroupBy[] {\n return groupBy.map((key, index) => {\n if (SCALAR_GROUPBY_COLUMNS.has(key)) {\n const qcol = quoteIdent(key, 'column name');\n const alias = `gb_${index}`;\n return { key, selectSql: `${qcol} AS ${alias}`, groupSql: qcol, resultKey: alias };\n }\n // Treat as label key. Sanitize identifier first so we can interpolate.\n const labelKey = safeIdent(key, 'label key');\n const alias = `gb_${index}`;\n const expr = `JSON_VALUE(${quoteIdent('labels', 'column name')}, '$.${labelKey}')`;\n return { key, selectSql: `${expr} AS ${alias}`, groupSql: expr, resultKey: alias };\n });\n}\n\n/**\n * Build a parameterised WHERE clause for metric filters. Returns the SQL\n * fragment (or an empty string when there are no filters) plus the params /\n * types map ready to merge into a `database.run` call.\n *\n * The intent is to push filters into the storage layer for *every* shape the\n * public API supports: scalar fields, identifier IN lists, timestamp ranges,\n * tag containment, label equality — so the planner can prune partitions\n * before any aggregation runs.\n */\nfunction buildWhereClause(\n filters: Record<string, unknown> | undefined,\n startIndex = 0,\n): { clause: string; params: Record<string, unknown>; types: Record<string, string>; nextIndex: number } {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n const types: Record<string, string> = {};\n let i = startIndex;\n if (!filters) {\n return { clause: '', params, types, nextIndex: i };\n }\n\n const bindScalar = (col: string, value: unknown, op = '='): void => {\n const param = `f${i++}`;\n conditions.push(`${quoteIdent(col, 'column name')} ${op} @${param}`);\n if (value instanceof Date) {\n params[param] = value.toISOString();\n types[param] = 'timestamp';\n } else {\n params[param] = value;\n }\n };\n\n const bindIn = (col: string, values: readonly unknown[]): void => {\n if (values.length === 0) {\n conditions.push('1 = 0');\n return;\n }\n const placeholders: string[] = [];\n for (const v of values) {\n const param = `f${i++}`;\n placeholders.push(`@${param}`);\n params[param] = v;\n }\n conditions.push(`${quoteIdent(col, 'column name')} IN (${placeholders.join(', ')})`);\n };\n\n // Timestamp range\n const ts = filters.timestamp as\n | { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean }\n | undefined;\n if (ts?.start) bindScalar('timestamp', ts.start, ts.startExclusive ? '>' : '>=');\n if (ts?.end) bindScalar('timestamp', ts.end, ts.endExclusive ? '<' : '<=');\n\n // Scalar filters mapped 1:1 to columns\n const scalarKeys = [\n 'traceId',\n 'spanId',\n 'entityType',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'userId',\n 'organizationId',\n 'experimentId',\n 'serviceName',\n 'environment',\n 'parentEntityType',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityName',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'executionSource',\n 'source',\n 'provider',\n 'model',\n 'costUnit',\n ] as const;\n for (const k of scalarKeys) {\n const v = filters[k];\n if (v !== undefined && v !== null) bindScalar(k, v);\n }\n\n // Metric name(s) — drives the leading composite index, so push it explicitly.\n if (Array.isArray(filters.name)) bindIn('name', filters.name as unknown[]);\n\n // Tags (array containment, AND of all requested tags).\n if (Array.isArray(filters.tags) && filters.tags.length > 0) {\n for (const tag of filters.tags as string[]) {\n const param = `f${i++}`;\n params[param] = String(tag);\n conditions.push(\n `EXISTS (SELECT 1 FROM UNNEST(JSON_QUERY_ARRAY(${quoteIdent('tags', 'column name')})) AS t WHERE JSON_VALUE(t) = @${param})`,\n );\n }\n }\n\n // Label equality (Record<string, string>). Sanitize keys before embedding.\n const labels = filters.labels as Record<string, string> | undefined;\n if (labels) {\n for (const [key, value] of Object.entries(labels)) {\n const labelKey = safeIdent(key, 'label key');\n const param = `f${i++}`;\n params[param] = String(value);\n conditions.push(`JSON_VALUE(${quoteIdent('labels', 'column name')}, '$.${labelKey}') = @${param}`);\n }\n }\n\n return {\n clause: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n types,\n nextIndex: i,\n };\n}\n\n/**\n * Compose name + arbitrary-filter where clauses into one merged clause. Used\n * by the OLAP paths that take a required metric name (or list) separately\n * from optional filters.\n */\nfunction combineWhere(\n nameValue: string | string[],\n filterClause: string,\n filterParams: Record<string, unknown>,\n filterTypes: Record<string, string>,\n nextIndex: number,\n): { clause: string; params: Record<string, unknown>; types: Record<string, string> } {\n const params: Record<string, unknown> = { ...filterParams };\n const types: Record<string, string> = { ...filterTypes };\n const conditions: string[] = [];\n\n if (Array.isArray(nameValue)) {\n if (nameValue.length === 0) {\n conditions.push('1 = 0');\n } else {\n const placeholders: string[] = [];\n let i = nextIndex;\n for (const n of nameValue) {\n const param = `n${i++}`;\n placeholders.push(`@${param}`);\n params[param] = n;\n }\n conditions.push(`${quoteIdent('name', 'column name')} IN (${placeholders.join(', ')})`);\n }\n } else {\n const param = `n${nextIndex}`;\n params[param] = nameValue;\n conditions.push(`${quoteIdent('name', 'column name')} = @${param}`);\n }\n\n if (filterClause) {\n // filterClause already starts with `WHERE `; strip it.\n conditions.push(filterClause.replace(/^WHERE\\s+/, ''));\n }\n\n return { clause: `WHERE ${conditions.join(' AND ')}`, params, types };\n}\n\n/**\n * Insert a batch of metric records as a single mutation.\n *\n * Uses the Spanner Mutations API (`tx.insert(table, rows)`) rather than DML\n * because metrics are append-heavy: a single mutation commits the whole batch\n * in one RPC, where the DML equivalent would round-trip per row. At dashboard\n * scales this is several × the throughput, and it also avoids the per-row\n * parameter-binding overhead.\n *\n * Encoding rules for mutations:\n * - JS `Date` instances are accepted directly for TIMESTAMP columns (the\n * client serializes via `.toJSON()`).\n * - Plain objects / arrays are accepted directly for JSON columns (the\n * client serializes with `JSON.stringify`); the server parses them\n * because the column schema is JSON.\n * - Whole-number JS numbers wrapped in `Spanner.float(n)` to force FLOAT64\n * encoding — without the wrapper the client serializes `100` as a string\n * and the server rejects it (same root cause as the DML path).\n * - `null` is passed through and respected per the column's nullability.\n */\nexport async function batchCreateMetrics(database: Database, args: BatchCreateMetricsArgs): Promise<void> {\n if (args.metrics.length === 0) return;\n\n const now = new Date();\n // Pre-stringify JSON payloads. The Spanner codec auto-stringifies plain\n // objects for JSON columns but treats arrays as protobuf `list_value`,\n // which the server rejects (\"Could not parse list_value ... as JSON\")\n // because JSON columns expect a JSON-encoded STRING on the wire. Doing\n // the JSON.stringify up-front sidesteps that fork.\n const encodeJson = (v: unknown): string | null => (v == null ? null : JSON.stringify(v));\n const rows = args.metrics.map(m => ({\n metricId: m.metricId ?? randomUUID(),\n timestamp: m.timestamp instanceof Date ? m.timestamp : new Date(m.timestamp as unknown as string | number),\n name: m.name,\n value: Spanner.float(Number(m.value)),\n traceId: m.traceId ?? null,\n spanId: m.spanId ?? null,\n experimentId: m.experimentId ?? null,\n entityType: m.entityType ?? null,\n entityId: m.entityId ?? null,\n entityName: m.entityName ?? null,\n entityVersionId: m.entityVersionId ?? null,\n parentEntityVersionId: m.parentEntityVersionId ?? null,\n parentEntityType: m.parentEntityType ?? null,\n parentEntityId: m.parentEntityId ?? null,\n parentEntityName: m.parentEntityName ?? null,\n rootEntityVersionId: m.rootEntityVersionId ?? null,\n rootEntityType: m.rootEntityType ?? null,\n rootEntityId: m.rootEntityId ?? null,\n rootEntityName: m.rootEntityName ?? null,\n userId: m.userId ?? null,\n organizationId: m.organizationId ?? null,\n resourceId: m.resourceId ?? null,\n runId: m.runId ?? null,\n sessionId: m.sessionId ?? null,\n threadId: m.threadId ?? null,\n requestId: m.requestId ?? null,\n environment: m.environment ?? null,\n source: m.source ?? null,\n executionSource: m.executionSource ?? null,\n serviceName: m.serviceName ?? null,\n provider: m.provider ?? null,\n model: m.model ?? null,\n estimatedCost: m.estimatedCost == null ? null : Spanner.float(Number(m.estimatedCost)),\n costUnit: m.costUnit ?? null,\n tags: encodeJson(m.tags),\n labels: encodeJson(m.labels ?? {}),\n costMetadata: encodeJson(m.costMetadata),\n metadata: encodeJson(m.metadata),\n scope: encodeJson(m.scope),\n createdAt: now,\n }));\n\n try {\n await runWithAbortRetry(async () => {\n await database.runTransactionAsync(async (tx: Transaction) => {\n try {\n tx.insert(TABLE_AI_METRICS, rows);\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n });\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_CREATE_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nasync function runWithAbortRetry<T>(fn: () => Promise<T>): Promise<T> {\n const maxAttempts = 5;\n let attempt = 0;\n let delay = 50;\n while (true) {\n try {\n return await fn();\n } catch (error: unknown) {\n attempt++;\n const aborted =\n !!error &&\n ((error as { code?: number }).code === 10 ||\n /ABORTED/i.test(String((error as { message?: unknown })?.message ?? '')));\n if (!aborted || attempt >= maxAttempts) throw error;\n await new Promise(resolve => setTimeout(resolve, delay + Math.random() * delay));\n delay *= 2;\n }\n }\n}\n\n/** Per-call read options accepted by every read function in this module. */\nexport type MetricsReadOptions = {\n /**\n * Maximum acceptable staleness in milliseconds for the read. When set to a\n * positive value, the query is issued as a single-use read-only transaction\n * with `maxStaleness`, which lets Spanner serve it from any replica that\n * already has data at least that fresh. The benefit is twofold:\n *\n * 1. Dashboard reads stop competing with leader-region writes for CPU.\n * 2. The planner can route the query to the closest replica, often\n * shaving 10-50ms off the round-trip vs. a strong read.\n *\n * For metrics specifically, observability dashboards routinely tolerate a\n * few seconds of staleness. `ObservabilitySpanner` defaults to 0 for\n * backwards-compatible strong reads, and callers can opt into bounded\n * staleness with `dashboardStalenessMs`. Note: maxStaleness is only valid\n * for single-use read-only transactions, which is what `database.run` issues.\n */\n stalenessMs?: number;\n};\n\n/**\n * Run a single-use read with optional bounded staleness. When `stalenessMs`\n * is positive we attach a `maxStaleness` TimestampBounds; otherwise we issue\n * a strong read against the leader.\n */\nasync function runQuery(\n database: Database,\n query: ExecuteSqlRequest,\n options?: MetricsReadOptions,\n): Promise<unknown[][]> {\n const staleness = options?.stalenessMs;\n if (typeof staleness === 'number' && staleness > 0) {\n const bounds: TimestampBounds = { maxStaleness: staleness };\n return (await database.run(query, bounds)) as unknown as unknown[][];\n }\n return (await database.run(query)) as unknown as unknown[][];\n}\n\n/** Paginated listing with the metric-records filter surface. */\nexport async function listMetrics(\n database: Database,\n args: ListMetricsArgs,\n options?: MetricsReadOptions,\n): Promise<ListMetricsResponse> {\n const { filters, pagination, orderBy } = listMetricsArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n const { clause, params, types } = buildWhereClause(filters as Record<string, unknown> | undefined);\n const orderField = orderBy?.field ?? 'timestamp';\n const orderDir = (orderBy?.direction ?? 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n\n try {\n const [countRows] = await runQuery(\n database,\n {\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${clause}`,\n params,\n types,\n json: true,\n },\n options,\n );\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return { pagination: { total: 0, page, perPage, hasMore: false }, metrics: [] };\n }\n\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${QUOTED_METRIC_COLUMNS_SQL} FROM ${tableName} ${clause} ORDER BY ${quoteIdent(\n orderField,\n 'column name',\n )} ${orderDir}, ${quoteIdent('metricId', 'column name')} ${orderDir} LIMIT @limit OFFSET @offset`,\n params: { ...params, limit: perPage, offset: page * perPage },\n types: { ...types, limit: 'int64', offset: 'int64' },\n json: true,\n },\n options,\n );\n\n return {\n pagination: { total, page, perPage, hasMore: (page + 1) * perPage < total },\n metrics: (rows as Array<Record<string, unknown>>).map(decodeMetricRow),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Single-value aggregate with optional period-over-period comparison. */\nexport async function getMetricAggregate(\n database: Database,\n args: GetMetricAggregateArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricAggregateResponse> {\n const aggSql = buildAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n\n try {\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause}`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n const row = (rows as Array<Record<string, unknown>>)[0] ?? {};\n const value = row.value == null ? null : Number(row.value);\n const cost = normalizeCostSummaryRow(row);\n\n // Period comparison piggybacks on the timestamp filter, without one\n // there's no anchor for the shifted window.\n const ts = args.filters?.timestamp;\n if (args.comparePeriod && ts?.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n switch (args.comparePeriod) {\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86_400_000);\n prevEnd = new Date(ts.end.getTime() - 86_400_000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604_800_000);\n prevEnd = new Date(ts.end.getTime() - 604_800_000);\n break;\n case 'previous_period':\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n }\n const prevFilters = {\n ...args.filters,\n timestamp: { start: prevStart, end: prevEnd, startExclusive: ts.startExclusive, endExclusive: ts.endExclusive },\n };\n const prevFilterResult = buildWhereClause(prevFilters as Record<string, unknown>);\n const prevCombined = combineWhere(\n args.name,\n prevFilterResult.clause,\n prevFilterResult.params,\n prevFilterResult.types,\n prevFilterResult.nextIndex,\n );\n const [prevRows] = await runQuery(\n database,\n {\n sql: `SELECT ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${prevCombined.clause}`,\n params: prevCombined.params,\n types: prevCombined.types,\n json: true,\n },\n options,\n );\n const prevRow = (prevRows as Array<Record<string, unknown>>)[0] ?? {};\n const previousValue = prevRow.value == null ? null : Number(prevRow.value);\n const prevCost = normalizeCostSummaryRow(prevRow);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n let costChangePercent: number | null = null;\n if (prevCost.estimatedCost !== null && prevCost.estimatedCost !== 0 && cost.estimatedCost !== null) {\n costChangePercent = ((cost.estimatedCost - prevCost.estimatedCost) / Math.abs(prevCost.estimatedCost)) * 100;\n }\n\n return {\n value,\n estimatedCost: cost.estimatedCost,\n costUnit: cost.costUnit,\n previousValue,\n previousEstimatedCost: prevCost.estimatedCost,\n changePercent,\n costChangePercent,\n };\n }\n\n return { value, estimatedCost: cost.estimatedCost, costUnit: cost.costUnit };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Breakdown by one or more dimensions (columns or label keys). */\nexport async function getMetricBreakdown(\n database: Database,\n args: GetMetricBreakdownArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricBreakdownResponse> {\n const aggSql = buildAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const selectGroupBy = resolvedGroupBy.map(g => g.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(g => g.groupSql).join(', ');\n const orderDir = (args.orderDirection ?? 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const limitClause = typeof args.limit === 'number' ? `LIMIT @limit` : '';\n const params = { ...combined.params } as Record<string, unknown>;\n const types = { ...combined.types } as Record<string, string>;\n if (typeof args.limit === 'number') {\n params.limit = args.limit;\n types.limit = 'int64';\n }\n\n try {\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${selectGroupBy}, ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause} GROUP BY ${groupByCols} ORDER BY value ${orderDir} ${limitClause}`,\n params,\n types,\n json: true,\n },\n options,\n );\n const groups = (rows as Array<Record<string, unknown>>).map(row => {\n const dimensions: Record<string, string | null> = {};\n for (const g of resolvedGroupBy) {\n const v = row[g.resultKey];\n dimensions[g.key] = v == null ? null : String(v);\n }\n const cost = normalizeCostSummaryRow(row);\n return {\n dimensions,\n value: Number(row.value ?? 0),\n estimatedCost: cost.estimatedCost,\n costUnit: cost.costUnit,\n };\n });\n return { groups };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Bucketed time-series, optionally split into multiple series by groupBy. */\nexport async function getMetricTimeSeries(\n database: Database,\n args: GetMetricTimeSeriesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricTimeSeriesResponse> {\n const aggSql = buildAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const bucketSql = buildTimeBucketSql(args.interval);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n\n try {\n if (args.groupBy && args.groupBy.length > 0) {\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const selectGroupBy = resolvedGroupBy.map(g => g.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(g => g.groupSql).join(', ');\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${bucketSql} AS bucket, ${selectGroupBy}, ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause} GROUP BY bucket, ${groupByCols} ORDER BY bucket`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n\n const seriesMap = new Map<\n string,\n {\n name: string;\n costUnits: Set<string>;\n points: { timestamp: Date; value: number; estimatedCost: number | null }[];\n }\n >();\n for (const row of rows as Array<Record<string, unknown>>) {\n const dimValues = resolvedGroupBy.map(g => row[g.resultKey]);\n const seriesKey = JSON.stringify(dimValues);\n const seriesName = dimValues.map(v => (v == null ? '' : String(v))).join('|');\n const cost = normalizeCostSummaryRow(row);\n let entry = seriesMap.get(seriesKey);\n if (!entry) {\n entry = { name: seriesName, costUnits: new Set(), points: [] };\n seriesMap.set(seriesKey, entry);\n }\n if (cost.costUnit) entry.costUnits.add(cost.costUnit);\n entry.points.push({\n timestamp: coerceDate(row.bucket),\n value: Number(row.value ?? 0),\n estimatedCost: cost.estimatedCost,\n });\n }\n return {\n series: Array.from(seriesMap.values()).map(s => ({\n name: s.name,\n costUnit: s.costUnits.size === 1 ? Array.from(s.costUnits)[0]! : null,\n points: s.points,\n })),\n };\n }\n\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${bucketSql} AS bucket, ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause} GROUP BY bucket ORDER BY bucket`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n const metricName = Array.isArray(args.name) ? args.name.join(',') : args.name;\n const allUnits = new Set<string>();\n const points = (rows as Array<Record<string, unknown>>).map(row => {\n const cost = normalizeCostSummaryRow(row);\n if (cost.costUnit) allUnits.add(cost.costUnit);\n return {\n timestamp: coerceDate(row.bucket),\n value: Number(row.value ?? 0),\n estimatedCost: cost.estimatedCost,\n };\n });\n return {\n series: [\n {\n name: metricName,\n costUnit: allUnits.size === 1 ? Array.from(allUnits)[0]! : null,\n points,\n },\n ],\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nfunction coerceDate(val: unknown): Date {\n if (val instanceof Date) return new Date(val.getTime());\n if (typeof val === 'string') return new Date(val);\n if (typeof val === 'object' && typeof (val as { value?: unknown }).value === 'string') {\n return new Date((val as { value: string }).value);\n }\n return new Date(String(val));\n}\n\n/**\n * Bucketed percentile series. Spanner GoogleSQL exposes `PERCENTILE_CONT`\n * only as an analytic (window) function, which neither the local emulator\n * nor older production releases support inside our query shape. Pulling raw\n * values one-by-one to compute percentiles in JS would round-trip per row.\n *\n * Instead we use `ARRAY_AGG(value ORDER BY value) GROUP BY bucket` to ship\n * one pre-sorted array per bucket, then interpolate every requested\n * percentile in JS. That's:\n * - one SQL query for any number of percentiles (vs. one-per-p with a\n * window function), so listing p50/p90/p95/p99 is the same cost as one;\n * - portable across every Spanner version because ARRAY_AGG is a core\n * aggregate (not an analytic function);\n * - exact (linear-interpolation form, matching `PERCENTILE_CONT`'s\n * definition) rather than HyperLogLog-approximate.\n *\n * The trade-off is that each bucket's array materializes server-side; for\n * pathological queries with millions of points per bucket the row could\n * exceed Spanner's 4MB row limit. Typical dashboard percentile queries\n * (single metric, recent window, modest cardinality) stay well under that.\n */\nexport async function getMetricPercentiles(\n database: Database,\n args: GetMetricPercentilesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricPercentilesResponse> {\n const bucketSql = buildTimeBucketSql(args.interval);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n\n try {\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${bucketSql} AS bucket, ARRAY_AGG(${quoteIdent(\n 'value',\n 'column name',\n )} ORDER BY ${quoteIdent('value', 'column name')}) AS vals FROM ${tableName} ${combined.clause} GROUP BY bucket ORDER BY bucket`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n\n const bucketArrays = (rows as Array<{ bucket: unknown; vals: unknown[] | null }>).map(row => ({\n timestamp: coerceDate(row.bucket),\n sorted: (row.vals ?? []).map(v => Number(v)).filter(v => Number.isFinite(v)),\n }));\n\n const series: GetMetricPercentilesResponse['series'] = args.percentiles.map(p => ({\n percentile: p,\n points: bucketArrays.map(({ timestamp, sorted }) => ({\n timestamp,\n value: interpolatePercentile(sorted, p),\n })),\n }));\n\n return { series };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/**\n * Linear-interpolation percentile, matching SQL `PERCENTILE_CONT` semantics:\n * the rank is `p * (n - 1)`, and the value is the linear blend between the\n * two surrounding sorted values. Empty arrays return 0 to mirror the\n * `Number(row.pvalue ?? 0)` fallback the previous SQL form used.\n */\nfunction interpolatePercentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n if (sorted.length === 1) return sorted[0]!;\n const clamped = Math.max(0, Math.min(1, p));\n const rank = clamped * (sorted.length - 1);\n const lo = Math.floor(rank);\n const hi = Math.ceil(rank);\n if (lo === hi) return sorted[lo]!;\n const frac = rank - lo;\n return sorted[lo]! * (1 - frac) + sorted[hi]! * frac;\n}\n\n// =============================================================================\n// Discovery\n// =============================================================================\n\nexport async function getMetricNames(\n database: Database,\n args: GetMetricNamesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricNamesResponse> {\n const params: Record<string, unknown> = {};\n const conditions: string[] = [];\n if (args.prefix) {\n conditions.push(`STARTS_WITH(${quoteIdent('name', 'column name')}, @prefix)`);\n params.prefix = args.prefix;\n }\n let sql = `SELECT DISTINCT ${quoteIdent('name', 'column name')} AS name FROM ${quoteIdent(\n TABLE_AI_METRICS,\n 'table name',\n )}`;\n if (conditions.length > 0) sql += ` WHERE ${conditions.join(' AND ')}`;\n sql += ` ORDER BY name`;\n const types: Record<string, string> = {};\n if (typeof args.limit === 'number') {\n sql += ` LIMIT @limit`;\n params.limit = args.limit;\n types.limit = 'int64';\n }\n try {\n const [rows] = await runQuery(database, { sql, params, types, json: true }, options);\n return { names: (rows as Array<{ name: string }>).map(r => r.name) };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nexport async function getMetricLabelKeys(\n database: Database,\n args: GetMetricLabelKeysArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricLabelKeysResponse> {\n // Spanner's GoogleSQL JSON functions in the local emulator (and older\n // production releases) don't include JSON_KEYS, so we project the labels\n // JSON as a string and extract distinct top-level keys in the application\n // layer. The DISTINCT keeps the wire payload small even when many rows\n // share the same label schema.\n try {\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT DISTINCT TO_JSON_STRING(${quoteIdent('labels', 'column name')}) AS labels FROM ${quoteIdent(\n TABLE_AI_METRICS,\n 'table name',\n )} WHERE ${quoteIdent('name', 'column name')} = @metricName AND ${quoteIdent('labels', 'column name')} IS NOT NULL`,\n params: { metricName: args.metricName },\n json: true,\n },\n options,\n );\n const keys = new Set<string>();\n for (const row of rows as Array<{ labels: string | null }>) {\n if (!row.labels) continue;\n try {\n const parsed = JSON.parse(row.labels);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n for (const k of Object.keys(parsed)) keys.add(k);\n }\n } catch {\n // Malformed JSON shouldn't happen for a JSON-typed column, but if it\n // does we ignore the row rather than failing the whole discovery.\n }\n }\n return { keys: Array.from(keys).sort() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_LABEL_KEYS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nexport async function getMetricLabelValues(\n database: Database,\n args: GetMetricLabelValuesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricLabelValuesResponse> {\n // Sanitize labelKey before embedding in the JSON path. Limits exposure if\n // the validator upstream is ever bypassed.\n const labelKey = safeIdent(args.labelKey, 'label key');\n const path = `'$.${labelKey}'`;\n const params: Record<string, unknown> = { metricName: args.metricName };\n const conditions = [\n `${quoteIdent('name', 'column name')} = @metricName`,\n `JSON_VALUE(${quoteIdent('labels', 'column name')}, ${path}) IS NOT NULL`,\n ];\n if (args.prefix) {\n conditions.push(`STARTS_WITH(JSON_VALUE(${quoteIdent('labels', 'column name')}, ${path}), @prefix)`);\n params.prefix = args.prefix;\n }\n let sql = `SELECT DISTINCT JSON_VALUE(${quoteIdent(\n 'labels',\n 'column name',\n )}, ${path}) AS val FROM ${quoteIdent(TABLE_AI_METRICS, 'table name')} WHERE ${conditions.join(' AND ')} ORDER BY val`;\n const types: Record<string, string> = {};\n if (typeof args.limit === 'number') {\n sql += ` LIMIT @limit`;\n params.limit = args.limit;\n types.limit = 'int64';\n }\n try {\n const [rows] = await runQuery(database, { sql, params, types, json: true }, options);\n return { values: (rows as Array<{ val: string }>).map(r => r.val) };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_LABEL_VALUES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Wipes every metric row. Intended for `dangerouslyClearAll()`. */\nexport async function clearMetrics(database: Database): Promise<void> {\n if (!(await tableExists(database, TABLE_AI_METRICS))) return;\n await database.runTransactionAsync(async (tx: Transaction) => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_AI_METRICS, 'table name')} WHERE TRUE`,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n });\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n TABLE_SCHEMAS,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n BatchCreateMetricsArgs,\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n CreateIndexOptions,\n CreateSpanArgs,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetTraceArgs,\n GetTraceLightResponse,\n GetTraceResponse,\n LightSpanRecord,\n ListMetricsArgs,\n ListMetricsResponse,\n ListTracesArgs,\n ListTracesResponse,\n SpanRecord,\n TracingStorageStrategy,\n UpdateSpanArgs,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig, SpannerInitMode } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\nimport * as metricsOps from './metrics';\nimport { TABLE_AI_METRICS } from './metrics';\n\nfunction invalidTraceFilterKey(kind: string, key: string): MastraError {\n return new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_TRACES', 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid ${kind} key: ${key}`,\n details: { [`${kind}Key`]: key },\n });\n}\n\n/**\n * Observability domain for Spanner. Stores AI tracing spans in `mastra_ai_spans`\n * and supports the trace read/write surface that powers the Mastra observability\n * UI: per-span CRUD, per-trace fetch, lightweight trace skeletons for the\n * waterfall view, and root-span pagination with the listTraces filters.\n */\nexport class ObservabilitySpanner extends ObservabilityStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n private readonly initMode: SpannerInitMode;\n /**\n * Bounded-staleness window (in ms) applied to every metrics read path.\n * Default 10000 (weak reads).\n */\n private readonly dashboardStalenessMs: number;\n /**\n * When true (the default), every metric method throws the base-class\n * `*_NOT_IMPLEMENTED` error and the metrics table is not created during\n * `init()`. See the option doc on `SpannerDomainDatabaseConfig` for the\n * full rationale.\n */\n private readonly disableMetrics: boolean;\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SPANS, TABLE_AI_METRICS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, dashboardStalenessMs, disableMetrics } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.initMode = initMode ?? 'sync';\n this.dashboardStalenessMs = dashboardStalenessMs ?? 10000;\n // Default to disabled: Spanner is not a good fit for the metrics\n // workload at scale. Set `disableMetrics: false` to opt in.\n this.disableMetrics = disableMetrics ?? true;\n this.indexes = indexes?.filter(idx =>\n (ObservabilitySpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /** Build the read-options object that every metrics read path threads through. */\n private readOptions(): metricsOps.MetricsReadOptions {\n return { stalenessMs: this.dashboardStalenessMs };\n }\n\n /**\n * Throw the same shape of NOT_IMPLEMENTED error the base class would when\n * a method isn't overridden\n */\n private metricsDisabledError(method: Uppercase<string>): MastraError {\n return new MastraError({\n id: `OBSERVABILITY_STORAGE_${method}_NOT_IMPLEMENTED` as Uppercase<string>,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Spanner metrics are disabled (set disableMetrics: false on the SpannerStore to opt in).`,\n });\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SPANS, schema: TABLE_SCHEMAS[TABLE_SPANS] });\n // `requestContext` was added after the initial schema shipped; backfill on\n // existing tables so older deployments keep working when they upgrade.\n await this.db.alterTable({\n tableName: TABLE_SPANS,\n schema: TABLE_SCHEMAS[TABLE_SPANS],\n ifNotExists: ['requestContext'],\n });\n if (!this.disableMetrics) {\n await metricsOps.ensureMetricsTable(this.database, {\n initMode: this.initMode,\n skipDefaultIndexes: this.skipDefaultIndexes,\n });\n }\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_ai_spans_traceid_startedat_idx',\n table: TABLE_SPANS,\n columns: ['traceId', 'startedAt DESC'],\n },\n {\n name: 'mastra_ai_spans_parentspanid_startedat_idx',\n table: TABLE_SPANS,\n columns: ['parentSpanId', 'startedAt DESC'],\n },\n {\n name: 'mastra_ai_spans_name_idx',\n table: TABLE_SPANS,\n columns: ['name'],\n },\n {\n name: 'mastra_ai_spans_spantype_startedat_idx',\n table: TABLE_SPANS,\n columns: ['spanType', 'startedAt DESC'],\n },\n {\n name: 'mastra_ai_spans_entitytype_entityid_idx',\n table: TABLE_SPANS,\n columns: ['entityType', 'entityId'],\n },\n {\n name: 'mastra_ai_spans_entitytype_entityname_idx',\n table: TABLE_SPANS,\n columns: ['entityType', 'entityName'],\n },\n {\n name: 'mastra_ai_spans_orgid_userid_idx',\n table: TABLE_SPANS,\n columns: ['organizationId', 'userId'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SPANS });\n // Only touch the metrics table when we actually own it.\n if (!this.disableMetrics) {\n await metricsOps.clearMetrics(this.database);\n }\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_SPANS,\n record: {\n ...span,\n createdAt: now,\n updatedAt: now,\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n name: span.name,\n },\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = new Date();\n const records = args.records.map(record => ({\n ...record,\n createdAt: now,\n updatedAt: now,\n }));\n await this.db.batchInsert({ tableName: TABLE_SPANS, records });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n await this.db.update({\n tableName: TABLE_SPANS,\n keys: { traceId, spanId },\n data: {\n ...updates,\n updatedAt: new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n const now = new Date();\n await this.db.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => ({\n keys: { traceId: record.traceId, spanId: record.spanId },\n data: { ...record.updates, updatedAt: now },\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n AND ${quoteIdent('spanId', 'column name')} = @spanId LIMIT 1`,\n params: { traceId, spanId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return {\n span: transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n AND ${quoteIdent('parentSpanId', 'column name')} IS NULL LIMIT 1`,\n params: { traceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return {\n span: transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n ORDER BY ${quoteIdent('startedAt', 'column name')} ASC`,\n params: { traceId },\n json: true,\n });\n const spans = rows as Array<Record<string, any>>;\n if (spans.length === 0) return null;\n return {\n traceId,\n spans: spans.map(row => transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT ${quoteIdent('traceId', 'column name')}, ${quoteIdent('spanId', 'column name')},\n ${quoteIdent('parentSpanId', 'column name')}, ${quoteIdent('name', 'column name')},\n ${quoteIdent('entityType', 'column name')}, ${quoteIdent('entityId', 'column name')},\n ${quoteIdent('entityName', 'column name')},\n ${quoteIdent('spanType', 'column name')}, ${quoteIdent('error', 'column name')},\n ${quoteIdent('isEvent', 'column name')},\n ${quoteIdent('startedAt', 'column name')}, ${quoteIdent('endedAt', 'column name')},\n ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n ORDER BY ${quoteIdent('startedAt', 'column name')} ASC`,\n params: { traceId },\n json: true,\n });\n const spans = rows as Array<Record<string, any>>;\n if (spans.length === 0) return null;\n return {\n traceId,\n spans: spans.map(row => transformFromSpannerRow<LightSpanRecord>({ tableName: TABLE_SPANS, row })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_TRACE_LIGHT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const rAlias = 'r';\n\n try {\n // Root-only filter. The aliased columns let the hasChildError EXISTS\n // subquery correlate without ambiguity.\n const conditions: string[] = [`${rAlias}.${quoteIdent('parentSpanId', 'column name')} IS NULL`];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let pi = 0;\n const nextParam = () => `f${pi++}`;\n const bindScalar = (col: string, value: any, op = '='): void => {\n const param = nextParam();\n conditions.push(`${rAlias}.${quoteIdent(col, 'column name')} ${op} @${param}`);\n params[param] = value instanceof Date ? value.toISOString() : value;\n const colType = TABLE_SCHEMAS[TABLE_SPANS]?.[col]?.type;\n if (colType === 'timestamp') {\n types[param] = 'timestamp';\n }\n };\n\n if (filters) {\n if (filters.startedAt?.start) {\n bindScalar('startedAt', filters.startedAt.start, '>=');\n }\n if (filters.startedAt?.end) {\n bindScalar('startedAt', filters.startedAt.end, '<=');\n }\n if (filters.endedAt?.start) {\n bindScalar('endedAt', filters.endedAt.start, '>=');\n }\n if (filters.endedAt?.end) {\n bindScalar('endedAt', filters.endedAt.end, '<=');\n }\n\n if (filters.spanType !== undefined) bindScalar('spanType', filters.spanType);\n\n if (filters.entityType !== undefined) bindScalar('entityType', filters.entityType);\n if (filters.entityId !== undefined) bindScalar('entityId', filters.entityId);\n if (filters.entityName !== undefined) bindScalar('entityName', filters.entityName);\n\n if (filters.userId !== undefined) bindScalar('userId', filters.userId);\n if (filters.organizationId !== undefined) bindScalar('organizationId', filters.organizationId);\n if (filters.resourceId !== undefined) bindScalar('resourceId', filters.resourceId);\n\n if (filters.runId !== undefined) bindScalar('runId', filters.runId);\n if (filters.sessionId !== undefined) bindScalar('sessionId', filters.sessionId);\n if (filters.threadId !== undefined) bindScalar('threadId', filters.threadId);\n if (filters.requestId !== undefined) bindScalar('requestId', filters.requestId);\n\n if (filters.environment !== undefined) bindScalar('environment', filters.environment);\n if (filters.source !== undefined) bindScalar('source', filters.source);\n if (filters.serviceName !== undefined) bindScalar('serviceName', filters.serviceName);\n\n // Scope (JSON) is stored as a tagged record; filter each property\n // using JSON_VALUE so common one-shot lookups still hit the index.\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope as Record<string, unknown>)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) throw invalidTraceFilterKey('scope', key);\n const param = nextParam();\n conditions.push(`JSON_VALUE(${rAlias}.${quoteIdent('scope', 'column name')}, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Same approach for metadata: per-key JSON_VALUE equality. PG's\n // jsonb `@>` containment is faster for nested objects, but Spanner\n // has no native equivalent so we settle for top-level scalar match.\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata as Record<string, unknown>)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) throw invalidTraceFilterKey('metadata', key);\n const param = nextParam();\n conditions.push(`JSON_VALUE(${rAlias}.${quoteIdent('metadata', 'column name')}, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Tags are a JSON array; require every requested tag to appear in\n // the stored array. We unnest with JSON_QUERY_ARRAY per tag rather\n // than emitting a single contains expression because Spanner JSON\n // has no array-containment operator.\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n const param = nextParam();\n conditions.push(\n `EXISTS (SELECT 1 FROM UNNEST(JSON_QUERY_ARRAY(${rAlias}.${quoteIdent('tags', 'column name')})) AS t WHERE JSON_VALUE(t) = @${param})`,\n );\n params[param] = typeof tag === 'string' ? tag : JSON.stringify(tag);\n }\n }\n\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n conditions.push(`${rAlias}.${quoteIdent('error', 'column name')} IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(\n `${rAlias}.${quoteIdent('endedAt', 'column name')} IS NULL AND ${rAlias}.${quoteIdent('error', 'column name')} IS NULL`,\n );\n break;\n case TraceStatus.SUCCESS:\n conditions.push(\n `${rAlias}.${quoteIdent('endedAt', 'column name')} IS NOT NULL AND ${rAlias}.${quoteIdent('error', 'column name')} IS NULL`,\n );\n break;\n }\n }\n\n if (filters.hasChildError !== undefined) {\n // Spanner correlated subqueries can reference outer columns via the\n // alias\n const existsClause = `EXISTS (SELECT 1 FROM ${tableName} c WHERE c.${quoteIdent('traceId', 'column name')} = ${rAlias}.${quoteIdent('traceId', 'column name')} AND c.${quoteIdent('error', 'column name')} IS NOT NULL)`;\n conditions.push(filters.hasChildError ? existsClause : `NOT ${existsClause}`);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const orderField = orderBy?.field ?? 'startedAt';\n const sortDirection = (orderBy?.direction ?? 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n // Emulate NULLS FIRST/LAST: Spanner has no syntax for it, so we put a\n // synthetic \"is null\" expression in front of the real ordering column.\n // For endedAt we want NULLS FIRST on DESC (running traces float to the\n // top when viewing newest) and NULLS LAST on ASC (running traces sink\n // to the bottom when viewing oldest). startedAt is NOT NULL so no\n // emulation is needed there.\n const nullsClause =\n orderField === 'endedAt'\n ? `(${rAlias}.${quoteIdent(orderField, 'column name')} IS NULL) ${sortDirection === 'DESC' ? 'DESC' : 'ASC'}, `\n : '';\n const orderSql = `ORDER BY ${nullsClause}${rAlias}.${quoteIdent(orderField, 'column name')} ${sortDirection}, ${rAlias}.${quoteIdent('spanId', 'column name')} ${sortDirection}`;\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${rAlias} ${whereSql}`,\n params,\n types,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n const [rows] = await this.database.run({\n sql: `SELECT ${rAlias}.* FROM ${tableName} ${rAlias} ${whereSql} ${orderSql} LIMIT @limit OFFSET @offset`,\n params: { ...params, limit: perPage, offset: page * perPage },\n types: { ...types, limit: 'int64', offset: 'int64' },\n json: true,\n });\n\n const spans = (rows as Array<Record<string, any>>).map(row =>\n transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row }),\n );\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans: toTraceSpans(spans),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n if (args.traceIds.length === 0) return;\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const params: Record<string, any> = {};\n const placeholders = args.traceIds.map((id, i) => {\n const name = `t${i}`;\n params[name] = id;\n return `@${name}`;\n });\n await this.db.runDml({\n sql: `DELETE FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} IN (${placeholders.join(', ')})`,\n params,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n override async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n if (this.disableMetrics) throw this.metricsDisabledError('BATCH_CREATE_METRICS');\n return metricsOps.batchCreateMetrics(this.database, args);\n }\n\n override async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('LIST_METRICS');\n return metricsOps.listMetrics(this.database, args, this.readOptions());\n }\n\n override async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_AGGREGATE');\n return metricsOps.getMetricAggregate(this.database, args, this.readOptions());\n }\n\n override async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_BREAKDOWN');\n return metricsOps.getMetricBreakdown(this.database, args, this.readOptions());\n }\n\n override async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_TIME_SERIES');\n return metricsOps.getMetricTimeSeries(this.database, args, this.readOptions());\n }\n\n override async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_PERCENTILES');\n return metricsOps.getMetricPercentiles(this.database, args, this.readOptions());\n }\n\n override async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_NAMES');\n return metricsOps.getMetricNames(this.database, args, this.readOptions());\n }\n\n override async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_LABEL_KEYS');\n return metricsOps.getMetricLabelKeys(this.database, args, this.readOptions());\n }\n\n override async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_LABEL_VALUES');\n return metricsOps.getMetricLabelValues(this.database, args, this.readOptions());\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n PromptBlocksStorage,\n PROMPT_BLOCKS_SCHEMA,\n PROMPT_BLOCK_VERSIONS_SCHEMA,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageUpdatePromptBlockInput,\n} from '@mastra/core/storage';\nimport type {\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n PromptBlockVersion,\n} from '@mastra/core/storage/domains/prompt-blocks';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for prompt blocks and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/scorer-definitions.\n */\nexport class PromptBlocksSpanner extends PromptBlocksStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx =>\n (PromptBlocksSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /** Creates the prompt-block tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: PROMPT_BLOCKS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, schema: PROMPT_BLOCK_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Removes orphaned draft prompt-block records where the paired version row\n * was never written. Skipped under `initMode: 'validate'` (no destructive\n * DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCKS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('blockId', 'column name')}\n FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')}\n WHERE ${quoteIdent('blockId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft prompt blocks:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_prompt_blocks_status_createdat_idx',\n table: TABLE_PROMPT_BLOCKS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_prompt_blocks_authorid_idx',\n table: TABLE_PROMPT_BLOCKS,\n columns: ['authorId'],\n },\n // Unique index on (blockId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_prompt_block_versions_unique_idx',\n table: TABLE_PROMPT_BLOCK_VERSIONS,\n columns: ['blockId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_PROMPT_BLOCKS });\n }\n\n /** Decodes a raw Spanner thin-row into the public prompt-block shape. */\n private parsePromptBlockRow(row: Record<string, any>): StoragePromptBlockType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_PROMPT_BLOCKS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): PromptBlockVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n blockId: transformed.blockId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n content: transformed.content ?? '',\n rules: transformed.rules ?? undefined,\n requestContextSchema: transformed.requestContextSchema ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin prompt-block record by id, or `null` when absent. */\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCKS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parsePromptBlockRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = promptBlock;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Wrap the thin-record insert and the seed-version insert in a single\n // Spanner read-write transaction so they commit or roll back together,\n // making orphaned drafts impossible. runWithAbortRetry handles the\n // ABORTED retry loop; the inner block must be idempotent.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_PROMPT_BLOCKS,\n record: {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: null,\n authorId: promptBlock.authorId ?? null,\n metadata: promptBlock.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n record: {\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n content: (snapshot as any).content ?? '',\n rules: (snapshot as any).rules ?? null,\n requestContextSchema: (snapshot as any).requestContextSchema ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(promptBlock.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Prompt block ${promptBlock.id} not found after creation`,\n details: { blockId: promptBlock.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: promptBlock.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Prompt block ${id} not found`,\n details: { blockId: id },\n });\n }\n\n // Only thin-record fields land on the entity row; content updates create\n // a new version through the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_PROMPT_BLOCKS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Prompt block ${id} not found after update`,\n details: { blockId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: id },\n },\n error,\n );\n }\n }\n\n /** Removes a prompt block and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCKS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional status / authorId / metadata filters. */\n async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCKS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_PROMPT_BLOCKS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCKS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { promptBlocks: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const promptBlocks = (rows as Array<Record<string, any>>).map(r => this.parsePromptBlockRow(r));\n return {\n promptBlocks,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing prompt block. */\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n record: {\n id: input.id,\n blockId: input.blockId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n content: input.content ?? '',\n rules: input.rules ?? null,\n requestContextSchema: input.requestContextSchema ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as PromptBlockVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, blockId: input.blockId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<PromptBlockVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(blockId, versionNumber)`. */\n async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')}\n WHERE ${quoteIdent('blockId', 'column name')} = @blockId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { blockId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for a prompt block. */\n async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')}\n WHERE ${quoteIdent('blockId', 'column name')} = @blockId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { blockId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single prompt block. */\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCK_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('blockId', 'column name')} = @blockId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { blockId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given prompt block. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given prompt block. */\n async countVersions(blockId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n SchedulesStorage,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n Schedule,\n ScheduleFilter,\n ScheduleStatus,\n ScheduleTarget,\n ScheduleTrigger,\n ScheduleTriggerListOptions,\n ScheduleUpdate,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction rowToSchedule(row: Record<string, any>): Schedule {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SCHEDULES, row });\n const target = transformed.target as ScheduleTarget | undefined;\n if (!target || typeof target !== 'object') {\n throw new Error(`Schedule row ${transformed.id} has invalid target`);\n }\n const schedule: Schedule = {\n id: String(transformed.id),\n target,\n cron: String(transformed.cron),\n status: String(transformed.status) as ScheduleStatus,\n nextFireAt: Number(transformed.next_fire_at),\n createdAt: Number(transformed.created_at),\n updatedAt: Number(transformed.updated_at),\n };\n if (transformed.timezone != null) schedule.timezone = String(transformed.timezone);\n if (transformed.last_fire_at != null) schedule.lastFireAt = Number(transformed.last_fire_at);\n if (transformed.last_run_id != null) schedule.lastRunId = String(transformed.last_run_id);\n if (transformed.metadata != null) schedule.metadata = transformed.metadata as Record<string, unknown>;\n if (transformed.owner_type != null) schedule.ownerType = String(transformed.owner_type) as Schedule['ownerType'];\n if (transformed.owner_id != null) schedule.ownerId = String(transformed.owner_id);\n return schedule;\n}\n\nfunction rowToTrigger(row: Record<string, any>): ScheduleTrigger {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SCHEDULE_TRIGGERS, row });\n const trigger: ScheduleTrigger = {\n id: transformed.id != null ? String(transformed.id) : undefined,\n scheduleId: String(transformed.schedule_id),\n runId: transformed.run_id != null ? String(transformed.run_id) : null,\n scheduledFireAt: Number(transformed.scheduled_fire_at),\n actualFireAt: Number(transformed.actual_fire_at),\n outcome: String(transformed.outcome) as ScheduleTrigger['outcome'],\n triggerKind:\n transformed.trigger_kind != null\n ? (String(transformed.trigger_kind) as ScheduleTrigger['triggerKind'])\n : 'schedule-fire',\n };\n if (transformed.error != null) trigger.error = String(transformed.error);\n if (transformed.parent_trigger_id != null) trigger.parentTriggerId = String(transformed.parent_trigger_id);\n if (transformed.metadata != null) trigger.metadata = transformed.metadata as Record<string, unknown>;\n return trigger;\n}\n\n/**\n * Spanner-backed storage for `WorkflowScheduler` schedules and trigger history.\n *\n * `mastra_schedule_triggers.id` is the table's only primary-key column\n * (matches `TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS]`). `schedule_id` is filtered\n * via a secondary index registered in {@link getDefaultIndexDefinitions}.\n */\nexport class SchedulesSpanner extends SchedulesStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (SchedulesSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SCHEDULES, schema: TABLE_SCHEMAS[TABLE_SCHEDULES] });\n await this.db.createTable({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n });\n // Add the target_workflow_id generated column BEFORE indexes so its index\n // can be created in the same init pass.\n await this.ensureTargetWorkflowIdColumn();\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n // listDueSchedules: WHERE status = 'active' AND next_fire_at <= @now ORDER BY next_fire_at ASC\n name: 'mastra_schedules_status_nextfireat_idx',\n table: TABLE_SCHEDULES,\n columns: ['status', 'next_fire_at'],\n },\n {\n // listSchedules({ workflowId }): WHERE target_workflow_id = @id\n // Filters on the STORED generated column added by ensureTargetWorkflowIdColumn().\n // If the column wasn't created (legacy databases), createDefaultIndexes() filters\n // this entry out and listSchedules falls back to JSON_VALUE.\n name: 'mastra_schedules_targetworkflowid_idx',\n table: TABLE_SCHEDULES,\n columns: ['target_workflow_id'],\n },\n {\n // listTriggers: WHERE schedule_id = @id ORDER BY actual_fire_at DESC\n // Also supports DELETE FROM mastra_schedule_triggers WHERE schedule_id = @id\n // (the table's PK is id only, so schedule_id needs its own index).\n name: 'mastra_schedule_triggers_scheduleid_actualfireat_idx',\n table: TABLE_SCHEDULE_TRIGGERS,\n columns: ['schedule_id', 'actual_fire_at DESC'],\n },\n ];\n }\n\n /**\n * Creates the default indexes; no-op when `skipDefaultIndexes` was set.\n * Filters out the target_workflow_id index when that generated column is\n * absent (e.g. ensureTargetWorkflowIdColumn() failed, or `initMode: 'validate'`\n * skipped the DDL). Otherwise the createIndex call would fail on a missing\n * column.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n const hasTargetWorkflowId = await this.hasTargetWorkflowIdColumn();\n const indexes = this.getDefaultIndexDefinitions().filter(\n idx => hasTargetWorkflowId || !idx.columns.some(c => c.startsWith('target_workflow_id')),\n );\n await this.db.createIndexes(indexes);\n }\n\n /**\n * Spanner-specific optimization: add a STORED generated column that extracts\n * `workflowId` from the JSON `target` payload, so the listSchedules workflowId\n * filter can use a regular secondary index instead of a full JSON_VALUE scan.\n */\n private async ensureTargetWorkflowIdColumn(): Promise<void> {\n // In validate mode the schema is owned externally, so we never issue DDL.\n // hasTargetWorkflowIdColumn() / listSchedules will pick up whether the\n // column is present at runtime via INFORMATION_SCHEMA and route accordingly.\n if (this.db.initMode === 'validate') return;\n try {\n const ddl =\n `ALTER TABLE ${quoteIdent(TABLE_SCHEDULES, 'table name')} ` +\n `ADD COLUMN IF NOT EXISTS ${quoteIdent('target_workflow_id', 'column name')} ` +\n `STRING(MAX) AS (JSON_VALUE(${quoteIdent('target', 'column name')}, '$.workflowId')) STORED`;\n const [operation] = await this.database.updateSchema([ddl]);\n await operation.promise();\n this.targetWorkflowIdColumnAvailable = true;\n } catch (error) {\n this.logger?.warn?.(\n 'Failed to add target_workflow_id generated column; workflowId filtering will fall back to JSON_VALUE scan',\n error,\n );\n }\n }\n\n /**\n * Cached lookup for whether the `target_workflow_id` generated column exists.\n * Resolves true after `ensureTargetWorkflowIdColumn()` succeeds, otherwise\n * falls back to an INFORMATION_SCHEMA probe (lets us still pick up the fast\n * path on databases that already had the column from a prior deploy).\n */\n private targetWorkflowIdColumnAvailable: boolean | null = null;\n /** Returns true when the `target_workflow_id` generated column exists. */\n private async hasTargetWorkflowIdColumn(): Promise<boolean> {\n if (this.targetWorkflowIdColumnAvailable !== null) return this.targetWorkflowIdColumnAvailable;\n try {\n this.targetWorkflowIdColumnAvailable = await this.db.hasColumn(TABLE_SCHEDULES, 'target_workflow_id');\n } catch {\n this.targetWorkflowIdColumnAvailable = false;\n }\n return this.targetWorkflowIdColumnAvailable;\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SCHEDULE_TRIGGERS });\n await this.db.clearTable({ tableName: TABLE_SCHEDULES });\n }\n\n async createSchedule(schedule: Schedule): Promise<Schedule> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('id', 'column name')} FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id LIMIT 1`,\n params: { id: schedule.id },\n json: true,\n });\n if ((rows as Array<Record<string, any>>).length > 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_SCHEDULE', 'ALREADY_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Schedule with id \"${schedule.id}\" already exists`,\n details: { id: schedule.id },\n });\n }\n await this.db.insert({\n tableName: TABLE_SCHEDULES,\n record: {\n id: schedule.id,\n target: schedule.target,\n cron: schedule.cron,\n timezone: schedule.timezone ?? null,\n status: schedule.status,\n next_fire_at: schedule.nextFireAt,\n last_fire_at: schedule.lastFireAt ?? null,\n last_run_id: schedule.lastRunId ?? null,\n created_at: schedule.createdAt,\n updated_at: schedule.updatedAt,\n metadata: schedule.metadata ?? null,\n owner_type: schedule.ownerType ?? null,\n owner_id: schedule.ownerId ?? null,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return schedule;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: schedule.id },\n },\n error,\n );\n }\n }\n\n async getSchedule(id: string): Promise<Schedule | null> {\n try {\n const row = await this.db.load<Record<string, any>>({ tableName: TABLE_SCHEDULES, keys: { id } });\n return row ? rowToSchedule(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async listSchedules(filter?: ScheduleFilter): Promise<Schedule[]> {\n try {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n\n if (filter?.status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = filter.status;\n }\n if (filter?.workflowId) {\n // Prefer the indexed STORED generated column when present\n const useFastPath = await this.hasTargetWorkflowIdColumn();\n if (useFastPath) {\n conditions.push(`${quoteIdent('target_workflow_id', 'column name')} = @workflowId`);\n } else {\n conditions.push(`JSON_VALUE(${quoteIdent('target', 'column name')}, '$.workflowId') = @workflowId`);\n }\n params.workflowId = filter.workflowId;\n }\n if (filter?.ownerType !== undefined) {\n if (filter.ownerType === null) {\n conditions.push(`${quoteIdent('owner_type', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdent('owner_type', 'column name')} = @ownerType`);\n params.ownerType = filter.ownerType;\n }\n }\n if (filter?.ownerId !== undefined) {\n if (filter.ownerId === null) {\n conditions.push(`${quoteIdent('owner_id', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdent('owner_id', 'column name')} = @ownerId`);\n params.ownerId = filter.ownerId;\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const sql = `SELECT * FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n ${where}\n ORDER BY ${quoteIdent('created_at', 'column name')} ASC`;\n const [rows] = await this.database.run({ sql, params, types, json: true });\n return (rows as Array<Record<string, any>>).map(rowToSchedule);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCHEDULES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: filter ? { ...filter } : {},\n },\n error,\n );\n }\n }\n\n async listDueSchedules(now: number, limit?: number): Promise<Schedule[]> {\n try {\n const cap = Math.max(0, Math.floor(limit ?? 100));\n const sql = `SELECT * FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = @status\n AND ${quoteIdent('next_fire_at', 'column name')} <= @now\n ORDER BY ${quoteIdent('next_fire_at', 'column name')} ASC\n LIMIT @lim`;\n const [rows] = await this.database.run({\n sql,\n params: { status: 'active', now, lim: cap },\n types: { now: 'int64', lim: 'int64' },\n json: true,\n });\n return (rows as Array<Record<string, any>>).map(rowToSchedule);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_DUE_SCHEDULES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { now, ...(limit !== undefined ? { limit } : {}) },\n },\n error,\n );\n }\n }\n\n async updateSchedule(id: string, patch: ScheduleUpdate): Promise<Schedule> {\n try {\n const data: Record<string, any> = {};\n if ('cron' in patch && patch.cron !== undefined) data.cron = patch.cron;\n if ('timezone' in patch) data.timezone = patch.timezone ?? null;\n if ('status' in patch && patch.status !== undefined) data.status = patch.status;\n if ('nextFireAt' in patch && patch.nextFireAt !== undefined) data.next_fire_at = patch.nextFireAt;\n if ('target' in patch && patch.target !== undefined) data.target = patch.target;\n if ('metadata' in patch) data.metadata = patch.metadata ?? null;\n if ('ownerType' in patch) data.owner_type = patch.ownerType ?? null;\n if ('ownerId' in patch) data.owner_id = patch.ownerId ?? null;\n\n if (Object.keys(data).length === 0) {\n // Nothing meaningful to patch; just confirm existence.\n const existing = await this.getSchedule(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Schedule ${id} not found`,\n details: { id },\n });\n }\n return existing;\n }\n\n data.updated_at = Date.now();\n await this.db.update({ tableName: TABLE_SCHEDULES, keys: { id }, data });\n\n const updated = await this.getSchedule(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Schedule ${id} not found`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async updateScheduleNextFire(\n id: string,\n expectedNextFireAt: number,\n newNextFireAt: number,\n lastFireAt: number,\n lastRunId: string,\n ): Promise<boolean> {\n try {\n const sql = `UPDATE ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n SET ${quoteIdent('next_fire_at', 'column name')} = @newNext,\n ${quoteIdent('last_fire_at', 'column name')} = @lastFire,\n ${quoteIdent('last_run_id', 'column name')} = @lastRun,\n ${quoteIdent('updated_at', 'column name')} = @updatedAt\n WHERE ${quoteIdent('id', 'column name')} = @id\n AND ${quoteIdent('next_fire_at', 'column name')} = @expected\n AND ${quoteIdent('status', 'column name')} = @status`;\n const rowCount = await this.db.runDml({\n sql,\n params: {\n id,\n expected: expectedNextFireAt,\n newNext: newNextFireAt,\n lastFire: lastFireAt,\n lastRun: lastRunId,\n updatedAt: Date.now(),\n status: 'active',\n },\n types: {\n expected: 'int64',\n newNext: 'int64',\n lastFire: 'int64',\n updatedAt: 'int64',\n },\n });\n return rowCount > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE_NEXT_FIRE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async deleteSchedule(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCHEDULE_TRIGGERS, 'table name')}\n WHERE ${quoteIdent('schedule_id', 'column name')} = @id`,\n params: { id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async recordTrigger(trigger: ScheduleTrigger): Promise<void> {\n try {\n await this.db.insert({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n record: {\n id: trigger.id ?? randomUUID(),\n schedule_id: trigger.scheduleId,\n run_id: trigger.runId ?? null,\n scheduled_fire_at: trigger.scheduledFireAt,\n actual_fire_at: trigger.actualFireAt,\n outcome: trigger.outcome,\n error: trigger.error ?? null,\n trigger_kind: trigger.triggerKind ?? 'schedule-fire',\n parent_trigger_id: trigger.parentTriggerId ?? null,\n metadata: trigger.metadata ?? null,\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'RECORD_TRIGGER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scheduleId: trigger.scheduleId, runId: trigger.runId ?? '' },\n },\n error,\n );\n }\n }\n\n async listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise<ScheduleTrigger[]> {\n try {\n const conditions: string[] = [`${quoteIdent('schedule_id', 'column name')} = @scheduleId`];\n const params: Record<string, any> = { scheduleId };\n const types: Record<string, any> = {};\n\n if (opts?.fromActualFireAt != null) {\n conditions.push(`${quoteIdent('actual_fire_at', 'column name')} >= @fromAt`);\n params.fromAt = opts.fromActualFireAt;\n types.fromAt = 'int64';\n }\n if (opts?.toActualFireAt != null) {\n conditions.push(`${quoteIdent('actual_fire_at', 'column name')} < @toAt`);\n params.toAt = opts.toActualFireAt;\n types.toAt = 'int64';\n }\n\n let limitClause = '';\n if (opts?.limit != null) {\n limitClause = 'LIMIT @lim';\n params.lim = Math.max(0, Math.floor(opts.limit));\n types.lim = 'int64';\n }\n\n const sql = `SELECT * FROM ${quoteIdent(TABLE_SCHEDULE_TRIGGERS, 'table name')}\n WHERE ${conditions.join(' AND ')}\n ORDER BY ${quoteIdent('actual_fire_at', 'column name')} DESC\n ${limitClause}`;\n const [rows] = await this.database.run({ sql, params, types, json: true });\n return (rows as Array<Record<string, any>>).map(rowToTrigger);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_TRIGGERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scheduleId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n ScorerDefinitionsStorage,\n SCORER_DEFINITIONS_SCHEMA,\n SCORER_DEFINITION_VERSIONS_SCHEMA,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageUpdateScorerDefinitionInput,\n} from '@mastra/core/storage';\nimport type {\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n ScorerDefinitionVersion,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for scorer definitions and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/prompt-blocks.\n */\nexport class ScorerDefinitionsSpanner extends ScorerDefinitionsStorage {\n private database: Database;\n private db: SpannerDB;\n private skipDefaultIndexes?: boolean;\n private indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx =>\n (ScorerDefinitionsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /** Creates the scorer-definition tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SCORER_DEFINITIONS, schema: SCORER_DEFINITIONS_SCHEMA });\n await this.db.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: SCORER_DEFINITION_VERSIONS_SCHEMA,\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('scorerDefinitionId', 'column name')}\n FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft scorer definitions:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_scorer_definitions_status_createdat_idx',\n table: TABLE_SCORER_DEFINITIONS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_scorer_definitions_authorid_idx',\n table: TABLE_SCORER_DEFINITIONS,\n columns: ['authorId'],\n },\n // Unique index on (scorerDefinitionId, versionNumber) prevents duplicate\n // versions from concurrent createVersion calls.\n {\n name: 'mastra_scorer_definition_versions_unique_idx',\n table: TABLE_SCORER_DEFINITION_VERSIONS,\n columns: ['scorerDefinitionId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_SCORER_DEFINITIONS });\n }\n\n /** Decodes a raw Spanner thin-row into the public scorer-definition shape. */\n private parseScorerRow(row: Record<string, any>): StorageScorerDefinitionType {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_SCORER_DEFINITIONS,\n row,\n });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): ScorerDefinitionVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n scorerDefinitionId: transformed.scorerDefinitionId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n type: transformed.type,\n model: transformed.model ?? undefined,\n instructions: transformed.instructions ?? undefined,\n scoreRange: transformed.scoreRange ?? undefined,\n presetConfig: transformed.presetConfig ?? undefined,\n defaultSampling: transformed.defaultSampling ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin scorer-definition record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseScorerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n const { scorerDefinition } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = scorerDefinition;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_SCORER_DEFINITIONS,\n record: {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: null,\n authorId: scorerDefinition.authorId ?? null,\n metadata: scorerDefinition.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n record: {\n id: versionId,\n scorerDefinitionId: scorerDefinition.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n type: (snapshot as any).type,\n model: (snapshot as any).model ?? null,\n instructions: (snapshot as any).instructions ?? null,\n scoreRange: (snapshot as any).scoreRange ?? null,\n presetConfig: (snapshot as any).presetConfig ?? null,\n defaultSampling: (snapshot as any).defaultSampling ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(scorerDefinition.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Scorer definition ${scorerDefinition.id} not found after creation`,\n details: { scorerDefinitionId: scorerDefinition.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: scorerDefinition.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Scorer definition ${id} not found`,\n details: { scorerDefinitionId: id },\n });\n }\n\n // Only thin-record fields land on the entity row; content updates create\n // a new version through the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Scorer definition ${id} not found after update`,\n details: { scorerDefinitionId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: id },\n },\n error,\n );\n }\n }\n\n /** Removes a scorer definition and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional status / authorId / metadata filters. */\n async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n // SECURITY: the JSON path inside `JSON_VALUE(metadata, '$.<key>')`\n // must be a string literal, Spanner does NOT accept a parameter\n // for the JSON path expression, so the key is concatenated into\n // SQL.\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITIONS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { scorerDefinitions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const scorerDefinitions = (rows as Array<Record<string, any>>).map(r => this.parseScorerRow(r));\n return {\n scorerDefinitions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing scorer definition. */\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n record: {\n id: input.id,\n scorerDefinitionId: input.scorerDefinitionId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n type: input.type,\n model: input.model ?? null,\n instructions: input.instructions ?? null,\n scoreRange: input.scoreRange ?? null,\n presetConfig: input.presetConfig ?? null,\n defaultSampling: input.defaultSampling ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as ScorerDefinitionVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, scorerDefinitionId: input.scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(scorerDefinitionId, versionNumber)`. */\n async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { scorerDefinitionId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for a scorer definition. */\n async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { scorerDefinitionId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single scorer definition. */\n async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITION_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { scorerDefinitionId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given scorer definition. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given scorer definition. */\n async countVersions(scorerDefinitionId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { StoragePagination, CreateIndexOptions } from '@mastra/core/storage';\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 { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n // Pre-process Spanner-specific types (timestamp objects, jsonb strings) before\n // delegating to the shared core transform.\n const normalized = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SCORERS, row });\n return coreTransformScoreRow(normalized, { convertTimestamps: true });\n}\n\nexport class ScoresSpanner extends ScoresStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORERS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (ScoresSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_scores_trace_id_span_id_idx',\n table: TABLE_SCORERS,\n columns: ['traceId', 'spanId'],\n },\n {\n name: 'mastra_scores_run_id_idx',\n table: TABLE_SCORERS,\n columns: ['runId'],\n },\n {\n name: 'mastra_scores_entity_idx',\n table: TABLE_SCORERS,\n columns: ['entityId', 'entityType'],\n },\n // listScoresByScorerId orders by createdAt DESC; an index leading with\n // scorerId lets the query seek per-scorer rather than scanning.\n {\n name: 'mastra_scores_scorer_id_created_at_idx',\n table: TABLE_SCORERS,\n columns: ['scorerId', 'createdAt DESC'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\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 [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORERS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return transformScoreRow(row);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let validatedScore: SaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n try {\n const scoreId = randomUUID();\n const now = new Date();\n const {\n scorer,\n preprocessStepResult,\n analyzeStepResult,\n metadata,\n input,\n output,\n additionalContext,\n requestContext,\n entity,\n ...rest\n } = validatedScore;\n\n const insertedRecord = {\n id: scoreId,\n ...rest,\n input: input ?? {},\n output: output ?? {},\n preprocessStepResult: preprocessStepResult ?? null,\n analyzeStepResult: analyzeStepResult ?? null,\n metadata: metadata ?? null,\n additionalContext: additionalContext ?? null,\n requestContext: requestContext ?? null,\n entity: entity ?? null,\n scorer: scorer ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await this.db.insert({\n tableName: TABLE_SCORERS,\n record: insertedRecord,\n });\n\n return { score: insertedRecord as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private async listScoresByConditions(\n conditions: string[],\n params: Record<string, any>,\n pagination: StoragePagination,\n ): Promise<ListScoresResponse> {\n const tableName = quoteIdent(TABLE_SCORERS, 'table name');\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n const { page, perPage: perPageInput } = pagination;\n if (total === 0) {\n return { pagination: { total: 0, page, perPage: perPageInput, hasMore: false }, scores: [] };\n }\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const sql = `SELECT * FROM ${tableName} ${whereSql} ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, id DESC LIMIT @limit OFFSET @offset`;\n const [rows] = await this.database.run({\n sql,\n params: { ...params, limit: limitValue, offset: start },\n json: true,\n });\n return {\n pagination: { total, page, perPage: perPageForResponse, hasMore: end < total },\n scores: (rows as Array<Record<string, any>>).map(r => transformScoreRow(r)),\n };\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n try {\n const conditions = [`${quoteIdent('scorerId', 'column name')} = @scorerId`];\n const params: Record<string, any> = { scorerId };\n if (entityId) {\n conditions.push(`${quoteIdent('entityId', 'column name')} = @entityId`);\n params.entityId = entityId;\n }\n if (entityType) {\n conditions.push(`${quoteIdent('entityType', 'column name')} = @entityType`);\n params.entityType = entityType;\n }\n if (source) {\n conditions.push(`${quoteIdent('source', 'column name')} = @source`);\n params.source = source;\n }\n return await this.listScoresByConditions(conditions, params, pagination);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId },\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 return await this.listScoresByConditions(\n [`${quoteIdent('runId', 'column name')} = @runId`],\n { runId },\n pagination,\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\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 return await this.listScoresByConditions(\n [\n `${quoteIdent('entityId', 'column name')} = @entityId`,\n `${quoteIdent('entityType', 'column name')} = @entityType`,\n ],\n { entityId, entityType },\n pagination,\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType },\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 return await this.listScoresByConditions(\n [`${quoteIdent('traceId', 'column name')} = @traceId`, `${quoteIdent('spanId', 'column name')} = @spanId`],\n { traceId, spanId },\n pagination,\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n SkillsStorage,\n SKILLS_SCHEMA,\n SKILL_VERSIONS_SCHEMA,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageSkillType,\n StorageCreateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageUpdateSkillInput,\n} from '@mastra/core/storage';\nimport type {\n CreateSkillVersionInput,\n ListSkillVersionsInput,\n ListSkillVersionsOutput,\n SkillVersion,\n} from '@mastra/core/storage/domains/skills';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for skills and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/prompt-blocks/scorer-definitions.\n */\nexport class SkillsSpanner extends SkillsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SKILLS, TABLE_SKILL_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (SkillsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the skill tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SKILLS, schema: SKILLS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_SKILL_VERSIONS, schema: SKILL_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILLS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('skillId', 'column name')}\n FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')}\n WHERE ${quoteIdent('skillId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft skills:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_skills_status_createdat_idx',\n table: TABLE_SKILLS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_skills_authorid_idx',\n table: TABLE_SKILLS,\n columns: ['authorId'],\n },\n // Unique index on (skillId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_skill_versions_unique_idx',\n table: TABLE_SKILL_VERSIONS,\n columns: ['skillId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SKILL_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_SKILLS });\n }\n\n /** Decodes a raw Spanner thin-row into the public skill shape. */\n private parseSkillRow(row: Record<string, any>): StorageSkillType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SKILLS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): SkillVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_SKILL_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n skillId: transformed.skillId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? '',\n instructions: transformed.instructions ?? '',\n license: transformed.license ?? undefined,\n compatibility: transformed.compatibility ?? undefined,\n source: transformed.source ?? undefined,\n references: transformed.references ?? undefined,\n scripts: transformed.scripts ?? undefined,\n assets: transformed.assets ?? undefined,\n metadata: transformed.metadata ?? undefined,\n tree: transformed.tree ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin skill record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageSkillType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILLS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseSkillRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n const { skill } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, ...snapshot } = skill;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Wrap the thin-record insert and the seed-version insert in a single\n // Spanner read-write transaction so they commit or roll back together,\n // making orphaned drafts impossible. runWithAbortRetry handles the\n // ABORTED retry loop; the inner block must be idempotent.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_SKILLS,\n record: {\n id: skill.id,\n status: 'draft',\n activeVersionId: null,\n authorId: skill.authorId ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_SKILL_VERSIONS,\n record: {\n id: versionId,\n skillId: skill.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n instructions: (snapshot as any).instructions ?? null,\n license: (snapshot as any).license ?? null,\n compatibility: (snapshot as any).compatibility ?? null,\n source: (snapshot as any).source ?? null,\n references: (snapshot as any).references ?? null,\n scripts: (snapshot as any).scripts ?? null,\n assets: (snapshot as any).assets ?? null,\n metadata: (snapshot as any).metadata ?? null,\n tree: (snapshot as any).tree ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(skill.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_SKILL', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Skill ${skill.id} not found after creation`,\n details: { skillId: skill.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: skill.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId). */\n async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SKILL', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Skill ${id} not found`,\n details: { skillId: id },\n });\n }\n\n // Only thin-record fields land on the entity row; content updates create\n // a new version through the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n\n await this.db.update({ tableName: TABLE_SKILLS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SKILL', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Skill ${id} not found after update`,\n details: { skillId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: id },\n },\n error,\n );\n }\n }\n\n /** Removes a skill and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILLS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional authorId filter. */\n async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILLS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_SKILLS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const skills = (rows as Array<Record<string, any>>).map(r => this.parseSkillRow(r));\n return {\n skills,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILLS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing skill. */\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_SKILL_VERSIONS,\n record: {\n id: input.id,\n skillId: input.skillId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n license: input.license ?? null,\n compatibility: input.compatibility ?? null,\n source: input.source ?? null,\n references: input.references ?? null,\n scripts: input.scripts ?? null,\n assets: input.assets ?? null,\n metadata: input.metadata ?? null,\n tree: input.tree ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as SkillVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, skillId: input.skillId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<SkillVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(skillId, versionNumber)`. */\n async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')}\n WHERE ${quoteIdent('skillId', 'column name')} = @skillId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { skillId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for a skill. */\n async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')}\n WHERE ${quoteIdent('skillId', 'column name')} = @skillId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { skillId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single skill. */\n async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILL_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_SKILL_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('skillId', 'column name')} = @skillId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { skillId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given skill. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SKILL_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given skill. */\n async countVersions(skillId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n WorkflowsStorage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n normalizePerPage,\n} from '@mastra/core/storage';\nimport type {\n StorageListWorkflowRunsInput,\n WorkflowRun,\n WorkflowRuns,\n UpdateWorkflowStateOptions,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for workflow run snapshots, including persistence,\n * incremental updates, and listing of historical runs.\n */\nexport class WorkflowsSpanner extends WorkflowsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_SNAPSHOT] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (WorkflowsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Spanner serialises read-write transactions, so concurrent updates are safe. */\n supportsConcurrentUpdates(): boolean {\n return true;\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n // Indexes here cover the access patterns of listWorkflowRuns and\n // getWorkflowRunById. Note: secondary indexes whose leading column is a\n // monotonically-increasing timestamp (createdAt) can hot-spot under\n // high write throughput in Spanner, operators expecting heavy churn\n // can opt out via `skipDefaultIndexes` and supply hashed alternatives.\n return [\n {\n // listWorkflowRuns({ workflowName, ... }) ORDER BY createdAt DESC\n name: 'mastra_workflow_snapshot_workflowname_createdat_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['workflow_name', 'createdAt DESC', 'run_id DESC'],\n },\n {\n // listWorkflowRuns() global path ORDER BY createdAt DESC, run_id DESC\n name: 'mastra_workflow_snapshot_createdat_runid_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['createdAt DESC', 'run_id DESC'],\n },\n {\n // getWorkflowRunById({ runId }) without workflowName the PK leads\n // with workflow_name so a runId-only lookup needs its own path.\n name: 'mastra_workflow_snapshot_runid_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['run_id'],\n },\n {\n // listWorkflowRuns({ resourceId, ... }) ORDER BY createdAt DESC\n name: 'mastra_workflow_snapshot_resourceid_createdat_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['resourceId', 'createdAt DESC', 'run_id DESC'],\n },\n {\n // listWorkflowRuns({ status, ... }) filters on the STORED generated\n // column added by ensureStatusColumn(). If the column wasn't created\n // (legacy databases), createIndex will fail and listWorkflowRuns\n // falls back to the JSON_VALUE expression.\n name: 'mastra_workflow_snapshot_snapshotstatus_createdat_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['snapshotStatus', 'createdAt DESC', 'run_id DESC'],\n },\n ];\n }\n\n /**\n * Creates the default indexes; no-op when `skipDefaultIndexes` was set.\n * Filters out the snapshotStatus index when that generated column is absent\n * (e.g. ensureStatusColumn() failed, or `initMode: 'validate'` skipped the\n * DDL). Otherwise the createIndex call would fail on a missing column.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n const hasStatus = await this.hasStatusColumn();\n const indexes = this.getDefaultIndexDefinitions().filter(\n idx => hasStatus || !idx.columns.some(c => c.startsWith('snapshotStatus')),\n );\n await this.db.createIndexes(indexes);\n }\n\n /** Creates the workflow snapshot table, the snapshotStatus generated column, and indexes. */\n async init(): Promise<void> {\n await this.db.createTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n });\n // Add the snapshotStatus generated column BEFORE indexes so the index on\n // it can be created in the same init pass.\n await this.ensureStatusColumn();\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Spanner-specific optimization: add a STORED generated column that extracts\n * `status` from the JSON snapshot, so the listWorkflowRuns status filter can\n * use a regular secondary index instead of a full JSON_VALUE scan.\n *\n * The column is owned and maintained entirely by the Spanner adapter; the\n * shared `@mastra/core` schema doesn't reference it. The DDL is idempotent\n * (`ADD COLUMN IF NOT EXISTS`) and the schema operation is awaited; Spanner\n * backfills existing rows asynchronously after the operation returns, while\n * new rows pick up the value on every write.\n */\n private async ensureStatusColumn(): Promise<void> {\n // In validate mode the schema is owned externally, so we never issue DDL.\n // hasStatusColumn() / listWorkflowRuns will pick up whether the column is\n // present at runtime via INFORMATION_SCHEMA and route accordingly.\n if (this.db.initMode === 'validate') return;\n try {\n const ddl =\n `ALTER TABLE ${quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name')} ` +\n `ADD COLUMN IF NOT EXISTS ${quoteIdent('snapshotStatus', 'column name')} ` +\n `STRING(MAX) AS (JSON_VALUE(${quoteIdent('snapshot', 'column name')}, '$.status')) STORED`;\n const [operation] = await this.database.updateSchema([ddl]);\n await operation.promise();\n this.statusColumnAvailable = true;\n } catch (error) {\n this.logger?.warn?.(\n 'Failed to add snapshotStatus generated column; status filtering will fall back to JSON_VALUE scan',\n error,\n );\n }\n }\n\n /**\n * Cached lookup for whether the `snapshotStatus` generated column exists.\n * Resolves true after `ensureStatusColumn()` succeeds, otherwise falls back\n * to an INFORMATION_SCHEMA probe (lets us still pick up the fast path on\n * databases that already had the column from a prior deploy).\n */\n private statusColumnAvailable: boolean | null = null;\n /** Returns true when the `snapshotStatus` generated column exists. */\n private async hasStatusColumn(): Promise<boolean> {\n if (this.statusColumnAvailable !== null) return this.statusColumnAvailable;\n try {\n this.statusColumnAvailable = await this.db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'snapshotStatus');\n } catch {\n this.statusColumnAvailable = false;\n }\n return this.statusColumnAvailable;\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every workflow snapshot row. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n /** Decodes a raw Spanner snapshot row into the public `WorkflowRun` shape. */\n private parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_WORKFLOW_SNAPSHOT, row });\n let snapshot: WorkflowRunState | string = transformed.snapshot;\n if (typeof snapshot === 'string') {\n try {\n snapshot = JSON.parse(snapshot) as WorkflowRunState;\n } catch (e) {\n this.logger?.warn?.(`Failed to parse snapshot for workflow ${transformed.workflow_name}:`, e);\n }\n }\n return {\n workflowName: transformed.workflow_name,\n runId: transformed.run_id,\n snapshot,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n resourceId: transformed.resourceId,\n };\n }\n\n /** Upserts a workflow run snapshot, preserving the original `createdAt` on update. */\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 now = new Date();\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n // Read resourceId alongside createdAt so we can preserve the\n // existing association when the caller omits resourceId on update\n // (Spanner's INSERT OR UPDATE would otherwise null it out).\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('resourceId', 'column name')} FROM ${table}\n WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n json: true,\n });\n const existing = (rows as Array<Record<string, any>>)[0];\n const resolvedCreatedAt = existing?.createdAt\n ? new Date(existing.createdAt instanceof Date ? existing.createdAt.getTime() : existing.createdAt)\n : (createdAt ?? now);\n const resolvedResourceId = resourceId !== undefined ? resourceId : (existing?.resourceId ?? null);\n await this.db.upsert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n workflow_name: workflowName,\n run_id: runId,\n resourceId: resolvedResourceId,\n snapshot,\n createdAt: resolvedCreatedAt,\n updatedAt: updatedAt ?? now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n /** Loads the snapshot payload for a `(workflowName, runId)` pair, or `null` when absent. */\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.db.load<{ snapshot: WorkflowRunState | string }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n if (!result) return null;\n return result.snapshot as WorkflowRunState;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n /** Merges a step result and request-context delta into a snapshot inside an RW transaction. */\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n let mergedContext: Record<string, StepResult<any, any, any, any>> = {};\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n // Reading the snapshot row inside a read-write transaction takes a lock on\n // it, protecting against concurrent writers without explicit locking syntax.\n // We also fetch createdAt so the upsert can preserve it on the update path\n // (Spanner's INSERT OR UPDATE replaces every column listed).\n const [rows] = await tx.run({\n sql: `SELECT snapshot, ${quoteIdent('createdAt', 'column name')} FROM ${table}\n WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n json: true,\n });\n let snapshot: WorkflowRunState;\n const existing = (rows as Array<Record<string, any>>)[0];\n if (!existing) {\n snapshot = {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId,\n requestContext: {},\n } as WorkflowRunState;\n } else {\n const raw = existing.snapshot;\n snapshot = (typeof raw === 'string' ? JSON.parse(raw) : raw) as WorkflowRunState;\n }\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n const now = new Date();\n const resolvedCreatedAt = existing?.createdAt\n ? new Date(existing.createdAt instanceof Date ? existing.createdAt.getTime() : existing.createdAt)\n : now;\n await this.db.upsert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n workflow_name: workflowName,\n run_id: runId,\n snapshot,\n createdAt: resolvedCreatedAt,\n updatedAt: now,\n },\n transaction: tx,\n });\n mergedContext = snapshot.context;\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return mergedContext;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKFLOW_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId, stepId },\n },\n error,\n );\n }\n }\n\n /** Applies a top-level snapshot patch (e.g. status, value) inside an RW transaction. */\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n let updated: WorkflowRunState | undefined;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT snapshot FROM ${table} WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n json: true,\n });\n const existing = (rows as Array<Record<string, any>>)[0];\n if (!existing) {\n await tx.commit();\n return;\n }\n const raw = existing.snapshot;\n const snapshot = (typeof raw === 'string' ? JSON.parse(raw) : raw) as WorkflowRunState;\n if (!snapshot || !snapshot.context) {\n await tx.commit();\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKFLOW_STATE', 'SNAPSHOT_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: { workflowName, runId },\n },\n new Error(`Snapshot not found for runId ${runId}`),\n );\n }\n updated = { ...snapshot, ...opts } as WorkflowRunState;\n await this.db.update({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n data: { snapshot: updated, updatedAt: new Date() },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKFLOW_STATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n /** Fetches a single workflow run by `runId` (optionally narrowed by `workflowName`). */\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n if (!runId || runId.trim() === '') {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'GET_WORKFLOW_RUN_BY_ID', 'EMPTY_RUN_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'getWorkflowRunById requires a non-empty runId',\n details: { workflowName: workflowName || '' },\n });\n }\n try {\n const conditions: string[] = [`${quoteIdent('run_id', 'column name')} = @runId`];\n const params: Record<string, any> = { runId };\n if (workflowName) {\n conditions.push(`${quoteIdent('workflow_name', 'column name')} = @workflowName`);\n params.workflowName = workflowName;\n }\n const whereSql = `WHERE ${conditions.join(' AND ')}`;\n const sql = `SELECT * FROM ${quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name')} ${whereSql} LIMIT 1`;\n const [rows] = await this.database.run({ sql, params, json: true });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return this.parseWorkflowRun(row);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName: workflowName || '' },\n },\n error,\n );\n }\n }\n\n /** Deletes the snapshot row for a `(workflowName, runId)` pair. */\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${table} WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional workflowName, status, resourceId, and date-range filters. */\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n // Spanner needs an explicit `timestamp` type hint when the param is an\n // ISO string (the client otherwise infers `string`, which fails the\n // STRING -> TIMESTAMP coercion in the predicate). Mirrors the rule in\n // SpannerDB.aggregateParams / prepareWhereClause.\n const types: Record<string, any> = {};\n\n if (workflowName) {\n conditions.push(`${quoteIdent('workflow_name', 'column name')} = @workflowName`);\n params.workflowName = workflowName;\n }\n if (status) {\n // Status lives inside the snapshot JSON payload (the @mastra/core\n // schema has no top-level status column). To avoid a full JSON_VALUE\n // scan we maintain a STORED generated column `snapshotStatus` and an\n // index on it (see ensureStatusColumn / getDefaultIndexDefinitions).\n // Older databases that pre-date the migration fall back to the\n // expression predicate.\n if (await this.hasStatusColumn()) {\n conditions.push(`${quoteIdent('snapshotStatus', 'column name')} = @status`);\n } else {\n conditions.push(`JSON_VALUE(${quoteIdent('snapshot', 'column name')}, '$.status') = @status`);\n }\n params.status = status;\n }\n if (resourceId) {\n // resourceId is part of the current TABLE_WORKFLOW_SNAPSHOT schema,\n // so it's always present on a database initialised by this adapter.\n // No backward-compat probe needed (validate mode catches a missing\n // column at init() time before any query runs).\n conditions.push(`${quoteIdent('resourceId', 'column name')} = @resourceId`);\n params.resourceId = resourceId;\n }\n if (fromDate instanceof Date && !isNaN(fromDate.getTime())) {\n conditions.push(`${quoteIdent('createdAt', 'column name')} >= @fromDate`);\n params.fromDate = fromDate.toISOString();\n types.fromDate = 'timestamp';\n }\n if (toDate instanceof Date && !isNaN(toDate.getTime())) {\n conditions.push(`${quoteIdent('createdAt', 'column name')} <= @toDate`);\n params.toDate = toDate.toISOString();\n types.toDate = 'timestamp';\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const tableName = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n\n let total = 0;\n if (usePagination) {\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n types,\n json: true,\n });\n total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n\n let sql = `SELECT * FROM ${tableName} ${whereSql} ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, ${quoteIdent('run_id', 'column name')} DESC`;\n if (usePagination) {\n const normalized = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page! * normalized;\n sql += ` LIMIT @perPage OFFSET @offset`;\n params.perPage = normalized;\n params.offset = offset;\n }\n const [rows] = await this.database.run({ sql, params, types, json: true });\n const runs = (rows as Array<Record<string, any>>).map(r => this.parseWorkflowRun(r));\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: workflowName || 'all' },\n },\n error,\n );\n }\n }\n}\n","import { Spanner } from '@google-cloud/spanner';\nimport type { Database, Instance } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains, CreateIndexOptions } from '@mastra/core/storage';\n\nimport type { SpannerInitMode } from './db';\nimport { AgentsSpanner } from './domains/agents';\nimport { BackgroundTasksSpanner } from './domains/background-tasks';\nimport { BlobsSpanner } from './domains/blobs';\nimport { MCPClientsSpanner } from './domains/mcp-clients';\nimport { MCPServersSpanner } from './domains/mcp-servers';\nimport { MemorySpanner } from './domains/memory';\nimport { ObservabilitySpanner } from './domains/observability';\nimport { PromptBlocksSpanner } from './domains/prompt-blocks';\nimport { SchedulesSpanner } from './domains/schedules';\nimport { ScorerDefinitionsSpanner } from './domains/scorer-definitions';\nimport { ScoresSpanner } from './domains/scores';\nimport { SkillsSpanner } from './domains/skills';\nimport { WorkflowsSpanner } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsSpanner,\n BackgroundTasksSpanner,\n BlobsSpanner,\n MCPClientsSpanner,\n MCPServersSpanner,\n MemorySpanner,\n ObservabilitySpanner,\n PromptBlocksSpanner,\n SchedulesSpanner,\n ScorerDefinitionsSpanner,\n ScoresSpanner,\n SkillsSpanner,\n WorkflowsSpanner,\n};\nexport type { SpannerDomainConfig, SpannerInitMode } from './db';\n\n/** Domain keys this adapter implements; the only valid values for `enabledDomains`. */\nexport const SPANNER_DOMAIN_KEYS = [\n 'scores',\n 'workflows',\n 'memory',\n 'backgroundTasks',\n 'agents',\n 'mcpClients',\n 'mcpServers',\n 'skills',\n 'blobs',\n 'promptBlocks',\n 'scorerDefinitions',\n 'schedules',\n 'observability',\n] as const satisfies ReadonlyArray<keyof StorageDomains>;\n\nexport type SpannerDomainKey = (typeof SPANNER_DOMAIN_KEYS)[number];\n\n/**\n * Cloud Spanner configuration accepted by `SpannerStore`.\n *\n * Supports either:\n * - Pre-configured `database` (a `@google-cloud/spanner` Database handle), or\n * - Connection details (`projectId`, `instanceId`, `databaseId`) from which the\n * store creates a Spanner client internally.\n */\nexport type SpannerConfigType = {\n id: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n *\n * When `disableInit` is true, the store will not automatically create or alter\n * tables on first use. You must call `storage.init()` explicitly during a\n * separate deploy/migration step.\n */\n disableInit?: boolean;\n /**\n * When true, default indexes will not be created during initialization.\n * @default false\n */\n skipDefaultIndexes?: boolean;\n /**\n * Custom indexes to create during initialization. Each index must specify the\n * table it belongs to; the store routes indexes to the correct domain.\n */\n indexes?: CreateIndexOptions[];\n /**\n * Controls whether `init()` is allowed to apply schema changes.\n *\n * - `'sync'` (default): the adapter creates missing tables, columns, and\n * indexes during `init()`. This is the historical behavior.\n * - `'validate'`: the adapter applies no DDL during `init()` and instead\n * verifies that every table, column, and default/custom index it would\n * have created already exists. Missing schema elements throw a typed\n * user error so the operator can reconcile the externally-managed\n * schema with what the adapter expects.\n *\n * `'validate'` is intended for environments where another process\n * (Terraform, Liquibase, a release pipeline, etc.) owns the schema.\n * @default 'sync'\n */\n initMode?: SpannerInitMode;\n /**\n * When true, versioned domains (agents / skills / prompt-blocks /\n * mcp-clients / mcp-servers / scorer-definitions) sweep orphaned draft\n * thin-row records during `init()` i.e. drafts whose paired version\n * row was never written. The transactional `create()` rewrite makes\n * these orphans impossible going forward; this opt-in is for cleaning\n * up legacy data left by older deployments or for environments where\n * the small startup cost is acceptable.\n * @default false\n */\n cleanupStaleDraftsOnStartup?: boolean;\n /**\n * Restricts which storage domains this adapter constructs and initializes.\n *\n * When omitted (the default), all domains the adapter implements are\n * registered, matching historical behavior. When provided, only the listed\n * domains are constructed and added to `this.stores`; `init()` will only\n * touch those domains, and `getStore()` returns `undefined` for the rest.\n *\n * Useful when another store owns some domains in a composite, or when the\n * deployment environment manages only a subset of the schema (e.g. a\n * workflows-only Spanner database in `initMode: 'validate'`, where\n * validating tables for unused domains would fail).\n */\n enabledDomains?: ReadonlyArray<SpannerDomainKey>;\n /**\n * Maximum acceptable staleness (in milliseconds) for the observability\n * domain's read paths (metrics list / aggregates / breakdowns /\n * time-series / percentiles / discovery). When set to a positive value,\n * those queries run as bounded-staleness single-use reads, which Spanner\n * can route to any replica that's at least that fresh. They stop\n * competing with leader-region writes for CPU and can land on a closer\n * replica.\n *\n * Default is `10000` (weak reads against the leader).\n * @default 10000\n */\n dashboardStalenessMs?: number;\n /**\n * When true (the default), the observability domain's metric methods\n * throw `*_NOT_IMPLEMENTED` and the metrics table is not created during\n * `init()`. The `MastraStorageExporter` reads those errors and silently\n * drops metric emissions.\n *\n * This is the recommended default because Spanner is row-oriented and\n * OLTP-shaped — the metrics workload is write-heavy, scan-heavy, and\n * benefits from columnar storage. Pair Spanner spans with a dedicated\n * OLAP metrics store (DuckDB, ClickHouse) via a\n * `MastraCompositeStore`-level wrapper that fans out by signal.\n * @default true\n */\n disableMetrics?: boolean;\n} & (\n | {\n /** Pre-configured Spanner Database handle. */\n database: Database;\n }\n | {\n projectId: string;\n instanceId: string;\n databaseId: string;\n /**\n * Optional pass-through to the `@google-cloud/spanner` client constructor.\n * Useful for credentials, custom service paths (e.g. against the emulator),\n * or auth overrides.\n */\n spannerOptions?: ConstructorParameters<typeof Spanner>[0];\n }\n);\n\nexport type SpannerConfig = SpannerConfigType;\n\nconst isPreConfiguredDatabase = (config: SpannerConfigType): config is SpannerConfigType & { database: Database } =>\n 'database' in config && !!(config as any).database;\n\n/**\n * Google Cloud Spanner storage adapter for Mastra. Implements the GoogleSQL\n * dialect of Cloud Spanner.\n *\n * @example\n * ```typescript\n * const storage = new SpannerStore({\n * id: 'my-store',\n * projectId: 'my-project',\n * instanceId: 'my-instance',\n * databaseId: 'mastra',\n * });\n *\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n * ```\n */\nexport class SpannerStore extends MastraCompositeStore {\n public database: Database;\n public spanner?: Spanner;\n public instance?: Instance;\n private readonly ownsClient: boolean;\n stores: StorageDomains;\n\n constructor(config: SpannerConfigType) {\n if (!config.id || config.id.trim() === '') {\n throw new Error('SpannerStore: id must be provided and cannot be empty.');\n }\n super({ id: config.id, name: 'SpannerStore', disableInit: config.disableInit });\n try {\n if (isPreConfiguredDatabase(config)) {\n this.database = config.database;\n this.ownsClient = false;\n } else {\n for (const key of ['projectId', 'instanceId', 'databaseId'] as const) {\n if (!(key in config) || typeof (config as any)[key] !== 'string' || (config as any)[key].trim() === '') {\n throw new Error(`SpannerStore: ${key} must be provided and cannot be empty.`);\n }\n }\n this.spanner = new Spanner({\n projectId: config.projectId,\n ...(config.spannerOptions ?? {}),\n });\n this.instance = this.spanner.instance(config.instanceId);\n this.database = this.instance.database(config.databaseId);\n this.ownsClient = true;\n }\n\n const domainConfig = {\n database: this.database,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n initMode: config.initMode,\n cleanupStaleDraftsOnStartup: config.cleanupStaleDraftsOnStartup,\n dashboardStalenessMs: config.dashboardStalenessMs,\n disableMetrics: config.disableMetrics,\n };\n\n let enabled: Set<SpannerDomainKey> | null = null;\n if (config.enabledDomains) {\n enabled = new Set();\n for (const key of config.enabledDomains) {\n if (!(SPANNER_DOMAIN_KEYS as readonly string[]).includes(key)) {\n throw new Error(\n `SpannerStore: enabledDomains contains unknown domain '${key}'. Valid keys: ${SPANNER_DOMAIN_KEYS.join(', ')}.`,\n );\n }\n enabled.add(key);\n }\n if (enabled.size === 0) {\n throw new Error('SpannerStore: enabledDomains must contain at least one domain when provided.');\n }\n }\n const wants = (key: SpannerDomainKey) => enabled === null || enabled.has(key);\n\n this.stores = {\n ...(wants('scores') && { scores: new ScoresSpanner(domainConfig) }),\n ...(wants('workflows') && { workflows: new WorkflowsSpanner(domainConfig) }),\n ...(wants('memory') && { memory: new MemorySpanner(domainConfig) }),\n ...(wants('backgroundTasks') && { backgroundTasks: new BackgroundTasksSpanner(domainConfig) }),\n ...(wants('agents') && { agents: new AgentsSpanner(domainConfig) }),\n ...(wants('mcpClients') && { mcpClients: new MCPClientsSpanner(domainConfig) }),\n ...(wants('mcpServers') && { mcpServers: new MCPServersSpanner(domainConfig) }),\n ...(wants('skills') && { skills: new SkillsSpanner(domainConfig) }),\n ...(wants('blobs') && { blobs: new BlobsSpanner(domainConfig) }),\n ...(wants('promptBlocks') && { promptBlocks: new PromptBlocksSpanner(domainConfig) }),\n ...(wants('scorerDefinitions') && { scorerDefinitions: new ScorerDefinitionsSpanner(domainConfig) }),\n ...(wants('schedules') && { schedules: new SchedulesSpanner(domainConfig) }),\n ...(wants('observability') && { observability: new ObservabilitySpanner(domainConfig) }),\n };\n } catch (e) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n e,\n );\n }\n }\n\n /**\n * Initializes the storage by running each domain's `init()` sequentially.\n *\n * Spanner does not allow concurrent schema changes against the same database,\n * so the default `MastraCompositeStore.init()` (which fans out via\n * `Promise.all`) cannot be used here.\n *\n * Concurrent callers all await the same in-flight promise: the first call\n * installs a pending `hasInitialized` immediately, before any awaits, so a\n * second caller landing on `init()` sees it and queues behind the same loop\n * instead of starting its own.\n */\n async init(): Promise<void> {\n if ((this as any).shouldCacheInit && (this as any).hasInitialized) {\n await (this as any).hasInitialized;\n return;\n }\n\n let resolveInit!: (value: boolean) => void;\n let rejectInit!: (reason: unknown) => void;\n const pending = new Promise<boolean>((resolve, reject) => {\n resolveInit = resolve;\n rejectInit = reject;\n });\n // Install the pending promise before any await, so concurrent init() calls\n // observe it and wait on the same loop.\n (this as any).hasInitialized = pending;\n // Concurrent callers attach their own .then/.catch via `await`, but the\n // root throw below propagates to the current call. Attach a no-op catch\n // here so a rejected `pending` without other awaiters is not flagged as\n // an unhandled rejection.\n pending.catch(() => {});\n\n try {\n // Initialize domains sequentially to avoid concurrent DDL errors in Spanner.\n const domainOrder: Array<keyof StorageDomains> = [\n 'memory',\n 'workflows',\n 'scores',\n 'backgroundTasks',\n 'agents',\n 'mcpClients',\n 'mcpServers',\n 'skills',\n 'blobs',\n 'promptBlocks',\n 'scorerDefinitions',\n 'schedules',\n 'observability',\n ];\n for (const key of domainOrder) {\n const store = this.stores?.[key];\n if (store) {\n await store.init();\n }\n }\n resolveInit(true);\n } catch (error) {\n // Allow a future init() call to retry the loop after a failure.\n (this as any).hasInitialized = null;\n const wrapped =\n error instanceof MastraError\n ? error\n : new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INIT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n rejectInit(wrapped);\n throw wrapped;\n }\n }\n\n /**\n * Closes the Spanner client and database handle if this store owns them.\n * Pre-configured databases are left alone for the caller to manage.\n */\n async close() {\n if (!this.ownsClient) return;\n try {\n await this.database.close();\n if (this.spanner) {\n // Spanner node lib wraps most functions (including this one with PromisifyAll), but currently there's a bug that causes awaiting on it to hand indefinitely.\n // Current workaround is to just call it without await https://github.com/googleapis/google-cloud-node/issues/8106\n this.spanner.close();\n }\n } catch (error) {\n throw error;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/storage/db/utils.ts","../src/storage/db/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/background-tasks/index.ts","../src/storage/domains/blobs/index.ts","../src/storage/domains/channels/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/favorites/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/mcp-servers/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/metrics.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/schedules/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/skills/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/domains/workspaces/index.ts","../src/storage/index.ts"],"names":["parseSqlIdentifier","TABLE_SCHEMAS","spanner","Spanner","MastraBase","MastraError","createStorageErrorId","ErrorDomain","ErrorCategory","getDefaultValue","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","TABLE_CONFIGS","error","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","AGENTS_SCHEMA","AGENT_VERSIONS_SCHEMA","normalizePerPage","calculatePagination","TABLE_FAVORITES","TABLE_BACKGROUND_TASKS","BackgroundTasksStorage","BlobStore","TABLE_SKILL_BLOBS","SKILL_BLOBS_SCHEMA","TABLE_CHANNEL_INSTALLATIONS","TABLE_CHANNEL_CONFIG","ChannelsStorage","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","DatasetsStorage","randomUUID","TABLE_EXPERIMENT_RESULTS","TABLE_EXPERIMENTS","toDate","ExperimentsStorage","TABLE_SKILLS","FavoritesStorage","MCPClientsStorage","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","MCP_CLIENTS_SCHEMA","MCP_CLIENT_VERSIONS_SCHEMA","MCPServersStorage","TABLE_MCP_SERVERS","TABLE_MCP_SERVER_VERSIONS","MCP_SERVERS_SCHEMA","MCP_SERVER_VERSIONS_SCHEMA","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MessageList","METRIC_DISTINCT_COLUMNS","alias","listMetricsArgsSchema","rows","ObservabilityStorage","listTracesArgsSchema","TraceStatus","toTraceSpans","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","PROMPT_BLOCKS_SCHEMA","PROMPT_BLOCK_VERSIONS_SCHEMA","TABLE_SCHEDULES","TABLE_SCHEDULE_TRIGGERS","SchedulesStorage","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","SCORER_DEFINITIONS_SCHEMA","SCORER_DEFINITION_VERSIONS_SCHEMA","TABLE_SCORERS","coreTransformScoreRow","ScoresStorage","saveScorePayloadSchema","SkillsStorage","TABLE_SKILL_VERSIONS","SKILLS_SCHEMA","SKILL_VERSIONS_SCHEMA","WorkflowsStorage","WorkspacesStorage","TABLE_WORKSPACES","TABLE_WORKSPACE_VERSIONS","WORKSPACES_SCHEMA","WORKSPACE_VERSIONS_SCHEMA","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\n/**\n * Quote a Spanner identifier with backticks. GoogleSQL uses backticks for\n * identifiers that may collide with reserved keywords.\n */\nexport function quoteIdent(name: string, kind = 'identifier'): string {\n const parsed = parseSqlIdentifier(name, kind);\n return `\\`${parsed}\\``;\n}\n\n/**\n * Returns the GoogleSQL type literal corresponding to a storage column type.\n */\nexport function getSpannerType(type: StorageColumn['type']): string {\n switch (type) {\n case 'text':\n return 'STRING(MAX)';\n case 'uuid':\n return 'STRING(36)';\n case 'jsonb':\n // Stored as JSON in Spanner. JSON columns can hold up to 10 MB.\n return 'JSON';\n case 'timestamp':\n return 'TIMESTAMP';\n case 'integer':\n case 'bigint':\n return 'INT64';\n case 'float':\n return 'FLOAT64';\n case 'boolean':\n return 'BOOL';\n default:\n throw new Error(`Unsupported Spanner storage column type: ${type as string}`);\n }\n}\n\n/**\n * Returns the @google-cloud/spanner param type spec for a storage column type.\n * Used when binding `null` values where Spanner needs an explicit type hint.\n */\nexport function getSpannerParamType(type: StorageColumn['type'] | undefined): string {\n switch (type) {\n case 'jsonb':\n return 'json';\n case 'timestamp':\n return 'timestamp';\n case 'integer':\n case 'bigint':\n return 'int64';\n case 'float':\n return 'float64';\n case 'boolean':\n return 'bool';\n case 'uuid':\n case 'text':\n default:\n return 'string';\n }\n}\n\n/**\n * Look up the storage column definition for a (table, column) pair.\n * Returns undefined for columns not defined in the schema (e.g. internal columns).\n */\nexport function getColumnDef(table: TABLE_NAMES, column: string): StorageColumn | undefined {\n return TABLE_SCHEMAS[table]?.[column];\n}\n\n/**\n * Returns true if the value is the `$in` operator object used by storage filters.\n */\nexport function isInOperator(value: unknown): value is { $in: unknown[] } {\n return (\n typeof value === 'object' && value !== null && '$in' in value && Array.isArray((value as { $in: unknown[] }).$in)\n );\n}\n","import { Spanner } from '@google-cloud/spanner';\nimport type { Database, Transaction } from '@google-cloud/spanner';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_SPANS,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n TABLE_CONFIGS,\n getDefaultValue,\n} from '@mastra/core/storage';\nimport type {\n StorageColumn,\n TABLE_NAMES,\n CreateIndexOptions,\n IndexInfo,\n StorageIndexStats,\n} from '@mastra/core/storage';\nimport { getColumnDef, getSpannerParamType, getSpannerType, isInOperator, quoteIdent } from './utils';\n\n// Re-export the shared types for downstream consumers\nexport type { CreateIndexOptions, IndexInfo, StorageIndexStats };\n\n/**\n * Controls whether `init()` is allowed to apply schema changes.\n *\n * - `'sync'` (default): the adapter creates missing tables, columns, and\n * indexes during `init()`. This is the historical behavior.\n * - `'validate'`: the adapter applies no DDL during `init()` and instead\n * verifies that every table, column (from `alterTable.ifNotExists`), and\n * default/custom index it would have created already exists. Missing\n * schema elements throw a typed user error.\n *\n * `'validate'` is intended for environments where another process (Terraform,\n * Liquibase, a release pipeline, etc.) owns the schema and Mastra should only\n * verify that the live database matches what the adapter expects.\n */\nexport type SpannerInitMode = 'sync' | 'validate';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. A pre-configured `database` (the domain reuses it as-is), or\n * 2. Connection details from which the domain creates a Spanner client internally.\n */\nexport type SpannerDomainConfig = SpannerDomainDatabaseConfig | SpannerDomainConnectionConfig;\n\n/**\n * Reuse an existing Spanner Database handle.\n */\nexport interface SpannerDomainDatabaseConfig {\n database: Database;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n /** When true, skips creation of default indexes */\n skipDefaultIndexes?: boolean;\n /** See {@link SpannerInitMode}. Defaults to `'sync'`. */\n initMode?: SpannerInitMode;\n /**\n * When true, versioned domains (agents / skills / prompt-blocks /\n * mcp-clients / mcp-servers / scorer-definitions) sweep orphaned draft\n * thin-row records during `init()` i.e. drafts whose paired version row\n * was never written. Useful for cleaning up after process crashes that\n * pre-date the transactional `create()` rewrite, or for environments\n * where data integrity outweighs the small startup cost.\n * @default false\n */\n cleanupStaleDraftsOnStartup?: boolean;\n /**\n * Maximum acceptable staleness (in milliseconds) for read-only dashboard\n * queries in the observability domain (metrics list / aggregates /\n * breakdowns / time-series / percentiles / discovery). When > 0, these\n * reads are issued as single-use read-only transactions with\n * `maxStaleness`, which lets Spanner serve them from any replica that has\n * data at least that fresh — they stop contending with leader writes and\n * can be routed to a closer replica.\n *\n * Default is 0 (strong reads) for backwards compatibility and to keep\n * write-then-read paths in tests deterministic. For real dashboards,\n * 10000 (10 s) is a common sweet spot.\n * @default 0\n */\n dashboardStalenessMs?: number;\n /**\n * When true (the default), the observability domain's metric methods\n * (`batchCreateMetrics`, `listMetrics`, `getMetricAggregate`, etc.) throw\n * the base-class `*_NOT_IMPLEMENTED` errors and the metrics table is not\n * created during `init()`. The `MastraStorageExporter` treats these\n * errors as a signal to silently drop metric emissions, which is the\n * recommended default for Spanner deployments: Spanner is row-oriented\n * and OLTP-shaped, which makes it a poor fit for the high-volume,\n * write-heavy, scan-heavy metrics workload. Pair Spanner spans with a\n * dedicated OLAP store for metrics (BigQuery, DuckDB, ClickHouse) via a\n * `MastraCompositeStore`-level wrapper that fans out by signal.\n *\n * Set to `false` to opt back in to the Spanner metrics implementation.\n * It is correct and bounded at small scale (sustained < ~50 metrics/sec,\n * < 1 yr retention), but past that you will hit hot-tail write\n * contention on the leading-name index and analytical queries will start\n * competing with span writes for node CPU.\n * @default true\n */\n disableMetrics?: boolean;\n}\n\n/**\n * Create a Spanner client internally from connection details.\n */\nexport interface SpannerDomainConnectionConfig {\n projectId: string;\n instanceId: string;\n databaseId: string;\n /** Optional pass-through to the Spanner client constructor (auth, servicePath, etc.) */\n spannerOptions?: ConstructorParameters<typeof Spanner>[0];\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n /** When true, skips creation of default indexes */\n skipDefaultIndexes?: boolean;\n /** See {@link SpannerInitMode}. Defaults to `'sync'`. */\n initMode?: SpannerInitMode;\n /** See {@link SpannerDomainDatabaseConfig.cleanupStaleDraftsOnStartup}. Defaults to `false`. */\n cleanupStaleDraftsOnStartup?: boolean;\n /** See {@link SpannerDomainDatabaseConfig.dashboardStalenessMs}. Defaults to `0`. */\n dashboardStalenessMs?: number;\n /** See {@link SpannerDomainDatabaseConfig.disableMetrics}. Defaults to `true`. */\n disableMetrics?: boolean;\n}\n\n/**\n * Resolves a SpannerDomainConfig into a concrete Database handle plus options.\n */\nexport function resolveSpannerConfig(config: SpannerDomainConfig): {\n database: Database;\n indexes?: CreateIndexOptions[];\n skipDefaultIndexes?: boolean;\n initMode?: SpannerInitMode;\n cleanupStaleDraftsOnStartup?: boolean;\n dashboardStalenessMs?: number;\n disableMetrics?: boolean;\n ownsClient: boolean;\n} {\n if ('database' in config && config.database) {\n return {\n database: config.database,\n indexes: config.indexes,\n skipDefaultIndexes: config.skipDefaultIndexes,\n initMode: config.initMode,\n cleanupStaleDraftsOnStartup: config.cleanupStaleDraftsOnStartup,\n dashboardStalenessMs: config.dashboardStalenessMs,\n disableMetrics: config.disableMetrics,\n ownsClient: false,\n };\n }\n\n const connectionConfig = config as SpannerDomainConnectionConfig;\n const spanner = new Spanner({\n projectId: connectionConfig.projectId,\n ...(connectionConfig.spannerOptions ?? {}),\n });\n const database = spanner.instance(connectionConfig.instanceId).database(connectionConfig.databaseId);\n\n return {\n database,\n indexes: connectionConfig.indexes,\n skipDefaultIndexes: connectionConfig.skipDefaultIndexes,\n initMode: connectionConfig.initMode,\n cleanupStaleDraftsOnStartup: connectionConfig.cleanupStaleDraftsOnStartup,\n dashboardStalenessMs: connectionConfig.dashboardStalenessMs,\n disableMetrics: connectionConfig.disableMetrics,\n ownsClient: true,\n };\n}\n\n/**\n * Internal helper that performs all GoogleSQL Spanner work for the various domain\n * implementations (memory, workflows, scores, background-tasks).\n */\nexport class SpannerDB extends MastraBase {\n public database: Database;\n public skipDefaultIndexes?: boolean;\n /** See {@link SpannerInitMode}. Public so domains can branch on it for\n * domain-specific schema work that doesn't go through this class\n * (e.g. the workflows snapshotStatus generated column). */\n public readonly initMode: SpannerInitMode;\n /** Public so versioned domains can decide whether to call their\n * cleanupStaleDrafts() helper during init(). Default false. */\n public readonly cleanupStaleDraftsOnStartup: boolean;\n\n /** Cache of actual table columns: tableName -> Set<columnName> */\n private tableColumnsCache = new Map<string, Set<string>>();\n\n constructor({\n database,\n skipDefaultIndexes,\n initMode,\n cleanupStaleDraftsOnStartup,\n }: {\n database: Database;\n skipDefaultIndexes?: boolean;\n initMode?: SpannerInitMode;\n cleanupStaleDraftsOnStartup?: boolean;\n }) {\n super({ component: 'STORAGE', name: 'SpannerDB' });\n this.database = database;\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.initMode = initMode ?? 'sync';\n this.cleanupStaleDraftsOnStartup = cleanupStaleDraftsOnStartup ?? false;\n }\n\n /**\n * Builds a typed user-facing error for validate-mode schema mismatches so\n * operators get a clear signal that the externally-managed schema is out\n * of date relative to what the adapter expects.\n */\n private validateError(\n action: string,\n message: string,\n details: Record<string, string | number | boolean | null>,\n ): MastraError {\n return new MastraError({\n id: createStorageErrorId('SPANNER', action, 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: message,\n details,\n });\n }\n\n /** Returns the set of column names that actually exist in the database table. */\n private async getTableColumns(tableName: TABLE_NAMES): Promise<Set<string>> {\n const cached = this.tableColumnsCache.get(tableName);\n if (cached) return cached;\n\n const [rows] = await this.database.run({\n sql: `SELECT COLUMN_NAME\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n const columns = new Set((rows as Array<{ COLUMN_NAME: string }>).map(r => r.COLUMN_NAME));\n if (columns.size > 0) {\n this.tableColumnsCache.set(tableName, columns);\n }\n return columns;\n }\n\n /** Returns true if the named table exists. */\n private async tableExists(tableName: string): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n /** Returns true if `column` exists on `table`. */\n async hasColumn(table: string, column: string): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @table AND COLUMN_NAME = @column`,\n params: { table, column },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n /** Returns true if the named index exists. */\n private async indexExists(indexName: string): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found\n FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n /**\n * Filter a record to only contain columns that exist in the live database table.\n * Unknown columns are silently dropped to ensure forward compatibility with newer\n * code writing columns the database hasn't been migrated to yet.\n */\n private async filterRecordToKnownColumns(\n tableName: TABLE_NAMES,\n record: Record<string, any>,\n ): Promise<Record<string, any>> {\n const knownColumns = await this.getTableColumns(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 protected getDefaultLiteral(type: StorageColumn['type']): string {\n switch (type) {\n case 'timestamp':\n // Spanner uses CURRENT_TIMESTAMP() rather than NOW()\n return 'DEFAULT (CURRENT_TIMESTAMP())';\n case 'jsonb':\n return \"DEFAULT (JSON '{}')\";\n case 'boolean':\n return 'DEFAULT (FALSE)';\n case 'integer':\n case 'bigint':\n return 'DEFAULT (0)';\n case 'float':\n return 'DEFAULT (0.0)';\n case 'text':\n case 'uuid':\n return getDefaultValue(type);\n default:\n return getDefaultValue(type);\n }\n }\n\n /** Build the column definition fragment for a CREATE TABLE statement. */\n private buildColumnDefinition(name: string, def: StorageColumn): string {\n const fragments = [`${quoteIdent(name, 'column name')} ${getSpannerType(def.type)}`];\n if (!def.nullable) {\n fragments.push('NOT NULL');\n }\n return fragments.join(' ');\n }\n\n /** Apply DDL statements via `database.updateSchema` and wait for the operation. */\n private async runDdl(statements: string[]): Promise<void> {\n if (statements.length === 0) return;\n const [operation] = await this.database.updateSchema(statements);\n await operation.promise();\n }\n\n /**\n * Run a single DML statement either inside the provided transaction or by\n * starting a new short-lived read-write transaction. Spanner's `Database`\n * surface exposes only `run` (read-only); DML must always go through a\n * transaction.\n *\n * Auto-retries on `ABORTED` (gRPC code 10) Spanner aborts read-write\n * transactions when they conflict with another, and the official guidance is\n * to retry from the start. The emulator hits this much more often than\n * managed Spanner because it serializes all read-write work.\n */\n async runDml(\n request: { sql: string; params?: Record<string, any>; types?: Record<string, any> },\n transaction?: Transaction,\n ): Promise<number> {\n if (transaction) {\n const [count] = await transaction.runUpdate(request);\n return Number(count ?? 0);\n }\n return this.runWithAbortRetry(async () => {\n let count = 0;\n await this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n const [c] = await tx.runUpdate(request);\n count = Number(c ?? 0);\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // explicitly release the transaction so its row locks are freed.\n await tx.rollback().catch(() => {});\n throw err;\n }\n });\n return count;\n });\n }\n\n /**\n * Retries `fn` on Spanner ABORTED errors with exponential backoff.\n * Caps at 5 attempts (~1.5s total backoff) before surfacing the error.\n *\n * Public so domain implementations can wrap their own\n * `database.runTransactionAsync` calls when running concurrent writes.\n */\n async runWithAbortRetry<T>(fn: () => Promise<T>): Promise<T> {\n const maxAttempts = 5;\n let attempt = 0;\n let delay = 50;\n while (true) {\n try {\n return await fn();\n } catch (error: any) {\n attempt++;\n const aborted = error && (error.code === 10 || /ABORTED/i.test(String(error?.message ?? '')));\n if (!aborted || attempt >= maxAttempts) {\n throw error;\n }\n await new Promise(resolve => setTimeout(resolve, delay + Math.random() * delay));\n delay *= 2;\n }\n }\n }\n\n /**\n * Determine the primary-key column list for a table. Some core tables (like\n * `mastra_workflow_snapshot`) don't carry a single-column PK in the schema,\n * so we hardcode known composite PKs here.\n */\n private getPrimaryKeyColumns(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): string[] {\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n return ['workflow_name', 'run_id'];\n }\n if (tableName === TABLE_SPANS) {\n return ['traceId', 'spanId'];\n }\n // Tables with composite primary keys (e.g. mastra_favorites,\n // mastra_dataset_items) declare them in core's TABLE_CONFIGS rather than via\n // per-column `primaryKey: true` flags. Honor that first so the PRIMARY KEY\n // clause emitted by createTable matches what the domains expect.\n const compositePk = TABLE_CONFIGS[tableName]?.compositePrimaryKey;\n if (compositePk && compositePk.length > 0) {\n const missing = compositePk.filter(col => !schema[col]);\n if (missing.length > 0) {\n throw new Error(\n `Table ${tableName}: composite primary key references columns not present in schema: ${missing.join(', ')}`,\n );\n }\n return [...compositePk];\n }\n const pk = Object.entries(schema)\n .filter(([, col]) => col.primaryKey)\n .map(([name]) => name);\n if (pk.length > 0) return pk;\n const first = Object.keys(schema)[0];\n return first ? [first] : [];\n }\n\n private async validateTableSchema(tableName: TABLE_NAMES, schema: Record<string, StorageColumn>): Promise<void> {\n const [rows] = await this.database.run({\n sql: `SELECT COLUMN_NAME, SPANNER_TYPE, IS_NULLABLE\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n const actual = new Map<string, { type: string; nullable: boolean }>();\n for (const row of rows as Array<{\n COLUMN_NAME: string;\n SPANNER_TYPE: string;\n IS_NULLABLE: string | boolean;\n }>) {\n actual.set(row.COLUMN_NAME, {\n type: row.SPANNER_TYPE,\n nullable: row.IS_NULLABLE === true || row.IS_NULLABLE === 'YES',\n });\n }\n\n const missing: string[] = [];\n const wrongType: string[] = [];\n const wrongNullability: string[] = [];\n for (const [columnName, expected] of Object.entries(schema)) {\n const live = actual.get(columnName);\n if (!live) {\n missing.push(columnName);\n continue;\n }\n // Compare canonical Spanner types so STRING/STRING(MAX) etc. don't\n // false-positive. Reuse the same type generator that createTable would\n // emit; INFORMATION_SCHEMA reports STRING(MAX) as `STRING(MAX)` (and\n // similarly for BYTES/NUMERIC).\n const expectedType = getSpannerType(expected.type).toUpperCase();\n const actualType = live.type.toUpperCase();\n if (expectedType !== actualType) {\n wrongType.push(`${columnName} (expected ${expectedType}, actual ${live.type})`);\n }\n // Match buildColumnDefinition: a column is NOT NULL unless `nullable`\n // is explicitly true. Plain `undefined` defaults to NOT NULL, mirroring\n // the DDL we would have emitted.\n const expectedNullable = expected.nullable === true;\n if (expectedNullable !== live.nullable) {\n wrongNullability.push(\n `${columnName} (expected ${expectedNullable ? 'NULLABLE' : 'NOT NULL'}, actual ${live.nullable ? 'NULLABLE' : 'NOT NULL'})`,\n );\n }\n }\n\n if (missing.length === 0 && wrongType.length === 0 && wrongNullability.length === 0) return;\n\n const segments: string[] = [];\n if (missing.length > 0) segments.push(`missing columns: ${missing.join(', ')}`);\n if (wrongType.length > 0) segments.push(`type mismatch: ${wrongType.join('; ')}`);\n if (wrongNullability.length > 0) segments.push(`nullability mismatch: ${wrongNullability.join('; ')}`);\n throw this.validateError(\n 'CREATE_TABLE',\n `Table ${tableName} does not match expected schema (${segments.join(' | ')})`,\n {\n tableName,\n missing: missing.join(','),\n wrongType: wrongType.join(';'),\n wrongNullability: wrongNullability.join(';'),\n },\n );\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 exists = await this.tableExists(tableName);\n if (this.initMode === 'validate') {\n if (!exists) {\n throw this.validateError(\n 'CREATE_TABLE',\n `Table ${tableName} does not exist (initMode='validate' will not create it)`,\n { tableName },\n );\n }\n await this.validateTableSchema(tableName, schema);\n return;\n }\n if (exists) return;\n\n const columnFragments = Object.entries(schema).map(([name, def]) => this.buildColumnDefinition(name, def));\n const pkColumns = this.getPrimaryKeyColumns(tableName, schema);\n if (pkColumns.length === 0) {\n throw new Error(`Cannot create table ${tableName}: no primary key columns determined`);\n }\n\n const pkClause = `PRIMARY KEY (${pkColumns.map(c => quoteIdent(c, 'column name')).join(', ')})`;\n const ddl = `CREATE TABLE ${quoteIdent(tableName, 'table name')} (\\n ${columnFragments.join(',\\n ')}\\n) ${pkClause}`;\n await this.runDdl([ddl]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n /**\n * Adds columns from `schema` that don't yet exist on the table.\n * Useful for forward-compatible schema migrations.\n */\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n try {\n if (this.initMode === 'validate') {\n const missing: string[] = [];\n for (const columnName of ifNotExists) {\n // Only validate columns that actually appear in the schema.\n if (!schema[columnName]) continue;\n if (!(await this.hasColumn(tableName, columnName))) missing.push(columnName);\n }\n if (missing.length > 0) {\n throw this.validateError(\n 'ALTER_TABLE',\n `Missing columns on ${tableName}: ${missing.join(', ')} (initMode='validate' will not add them)`,\n { tableName, missing: missing.join(',') },\n );\n }\n return;\n }\n const statements: string[] = [];\n for (const columnName of ifNotExists) {\n const columnDef = schema[columnName];\n if (!columnDef) continue;\n if (await this.hasColumn(tableName, columnName)) continue;\n // Spanner cannot add NOT NULL columns to existing tables without a default,\n // so newly-added columns are always nullable initially.\n const fragment = `${quoteIdent(columnName, 'column name')} ${getSpannerType(columnDef.type)}`;\n statements.push(`ALTER TABLE ${quoteIdent(tableName, 'table name')} ADD COLUMN ${fragment}`);\n }\n await this.runDdl(statements);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n } finally {\n this.tableColumnsCache.delete(tableName);\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const exists = await this.tableExists(tableName);\n if (!exists) return;\n // Drop indexes first - Spanner refuses to drop tables with indexes attached.\n const indexes = await this.listIndexes(tableName);\n const dropIndexStmts = indexes\n // PRIMARY_KEY index is auto-managed and cannot be dropped via DROP INDEX.\n .filter(idx => idx.name && idx.name !== 'PRIMARY_KEY')\n .map(idx => `DROP INDEX ${quoteIdent(idx.name, 'index name')}`);\n const stmts = [...dropIndexStmts, `DROP TABLE ${quoteIdent(tableName, 'table name')}`];\n await this.runDdl(stmts);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', '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(tableName);\n }\n }\n\n /** Spanner has no TRUNCATE fall back to `DELETE WHERE TRUE`. */\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n // Skip if the table hasn't been created yet (e.g. during test teardown\n // after a failed init).\n if (!(await this.tableExists(tableName))) return;\n await this.runDml({ sql: `DELETE FROM ${quoteIdent(tableName, 'table name')} WHERE TRUE` });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Converts a JS value into the form Spanner expects for the column.\n * - jsonb: serialize to JSON string (caller must pass type 'json' in `types`).\n * - integer/bigint: pass through (numbers are accepted; Spanner will coerce).\n * - timestamp: ISO string when given a Date.\n * - boolean: pass through as boolean.\n * - text/uuid: stringify objects (legacy callers pass already-stringified JSON).\n */\n prepareValue(value: any, columnName: string, tableName: TABLE_NAMES): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n const columnSchema = getColumnDef(tableName, columnName);\n\n if (columnSchema?.type === 'jsonb') {\n // Pass JSON values as serialized strings; the calling code attaches a\n // `json` param-type hint so Spanner stores them as native JSON.\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length > 0) {\n try {\n // Validate by round-tripping through JSON.parse / JSON.stringify so we\n // emit canonical JSON to Spanner.\n return JSON.stringify(JSON.parse(trimmed));\n } catch {\n return JSON.stringify(value);\n }\n }\n return JSON.stringify(value);\n }\n if (typeof value === 'bigint') {\n return JSON.stringify(value.toString());\n }\n return JSON.stringify(value);\n }\n\n if (columnSchema?.type === 'timestamp') {\n if (value instanceof Date) return value.toISOString();\n return value;\n }\n\n if (columnSchema?.type === 'boolean') {\n return Boolean(value);\n }\n\n if (columnSchema?.type === 'integer' || columnSchema?.type === 'bigint') {\n if (typeof value === 'number') return value;\n if (typeof value === 'bigint') return value.toString();\n return value;\n }\n\n // Default: for text/uuid columns a stray object value is best-effort-stringified\n // to retain backwards compatibility with callers passing structured data.\n if (typeof value === 'object' && !(value instanceof Date)) {\n return JSON.stringify(value);\n }\n return value;\n }\n\n /**\n * Convert a value into the shape the Spanner Mutations API expects for the\n * given column. Mutations encoding differs from DML in three places:\n *\n * - JSON columns: the codec serializes plain JS objects with\n * `JSON.stringify`, but it encodes arrays as protobuf `list_value`,\n * which the server rejects for JSON-typed columns\n * (\"Could not parse list_value … as JSON\"). Pre-stringifying every\n * JSON value sidesteps that fork.\n * - FLOAT64 columns: whole-number JS values like `100` get either\n * INT64-inferred or string-encoded by the client when sent as a bare\n * number — the server then refuses them. `Spanner.float()` is the\n * documented escape hatch.\n * - TIMESTAMP columns: the codec already handles `Date` instances via\n * `.toJSON()`, so we pass them through as-is (DML's `prepareValue`\n * converts to an ISO string because DML wants `'timestamp'` type\n * hints; mutations don't take per-row hints).\n *\n * Everything else (text/uuid/bool/int) goes through `prepareValue` for\n * parity with the DML path.\n */\n prepareValueForMutation(value: any, columnName: string, tableName: TABLE_NAMES): any {\n if (value === null || value === undefined) return null;\n const colType = getColumnDef(tableName, columnName)?.type;\n\n if (colType === 'jsonb') {\n // Reuse prepareValue's canonicalisation (round-trip strings through\n // parse/stringify so we don't double-encode pre-stringified payloads).\n return this.prepareValue(value, columnName, tableName);\n }\n if (colType === 'timestamp') {\n // Mutations API: Date pass-through (codec serializes via .toJSON()).\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n return value;\n }\n if (colType === 'float') {\n return Spanner.float(Number(value));\n }\n if (colType === 'boolean') return Boolean(value);\n if (colType === 'integer' || colType === 'bigint') {\n if (typeof value === 'number') return value;\n if (typeof value === 'bigint') return value.toString();\n return value;\n }\n // text / uuid / unknown — best-effort stringify objects same as\n // prepareValue does, so structured-data callers stay backwards compatible.\n if (typeof value === 'object' && !(value instanceof Date)) {\n return JSON.stringify(value);\n }\n return value;\n }\n\n async insert({\n tableName,\n record,\n transaction,\n }: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n transaction?: Transaction;\n }): Promise<void> {\n try {\n const filtered = await this.filterRecordToKnownColumns(tableName, record);\n const columns = Object.keys(filtered);\n if (columns.length === 0) return;\n\n const sql = `INSERT INTO ${quoteIdent(tableName, 'table name')} (${columns\n .map(c => quoteIdent(c, 'column name'))\n .join(', ')}) VALUES (${columns.map(c => `@${c}`).join(', ')})`;\n\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n for (const col of columns) {\n const value = this.prepareValue(filtered[col], col, tableName);\n params[col] = value;\n const colType = getColumnDef(tableName, col)?.type;\n if (value === null || colType === 'jsonb' || colType === 'timestamp') {\n types[col] = getSpannerParamType(colType);\n }\n }\n\n await this.runDml({ sql, params, types }, transaction);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * INSERT OR UPDATE upsert. Spanner cannot emit RETURNING-style results from\n * INSERT OR UPDATE so callers must re-load the row when they need the post-write\n * state.\n */\n async upsert({\n tableName,\n record,\n transaction,\n }: {\n tableName: TABLE_NAMES;\n record: Record<string, any>;\n transaction?: Transaction;\n }): Promise<void> {\n try {\n const filtered = await this.filterRecordToKnownColumns(tableName, record);\n const columns = Object.keys(filtered);\n if (columns.length === 0) return;\n\n const sql = `INSERT OR UPDATE INTO ${quoteIdent(tableName, 'table name')} (${columns\n .map(c => quoteIdent(c, 'column name'))\n .join(', ')}) VALUES (${columns.map(c => `@${c}`).join(', ')})`;\n\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n for (const col of columns) {\n const value = this.prepareValue(filtered[col], col, tableName);\n params[col] = value;\n const colType = getColumnDef(tableName, col)?.type;\n if (value === null || colType === 'jsonb' || colType === 'timestamp') {\n types[col] = getSpannerParamType(colType);\n }\n }\n\n await this.runDml({ sql, params, types }, transaction);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async update({\n tableName,\n keys,\n data,\n transaction,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n transaction?: Transaction;\n }): Promise<void> {\n try {\n if (!data || Object.keys(data).length === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE', 'EMPTY_DATA'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot update with empty data payload',\n });\n }\n if (!keys || Object.keys(keys).length === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE', 'EMPTY_KEYS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot update without keys to identify records',\n });\n }\n const filtered = await this.filterRecordToKnownColumns(tableName, data);\n if (Object.keys(filtered).length === 0) return;\n\n const setClauses: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n\n for (const [col, value] of Object.entries(filtered)) {\n const param = `set_${i++}`;\n setClauses.push(`${quoteIdent(col, 'column name')} = @${param}`);\n const prepared = this.prepareValue(value, col, tableName);\n params[param] = prepared;\n const colType = getColumnDef(tableName, col)?.type;\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = getSpannerParamType(colType);\n }\n }\n\n const whereClauses: string[] = [];\n for (const [col, value] of Object.entries(keys)) {\n const param = `where_${i++}`;\n whereClauses.push(`${quoteIdent(col, 'column name')} = @${param}`);\n const prepared = this.prepareValue(value, col, tableName);\n params[param] = prepared;\n const colType = getColumnDef(tableName, col)?.type;\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = getSpannerParamType(colType);\n }\n }\n\n const sql = `UPDATE ${quoteIdent(tableName, 'table name')} SET ${setClauses.join(', ')} WHERE ${whereClauses.join(' AND ')}`;\n\n await this.runDml({ sql, params, types }, transaction);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n if (records.length === 0) return;\n try {\n // Filter + encode all rows up front, before opening the transaction,\n // so we don't hold row locks while waiting on JSON.stringify of large\n // payloads. The column filter is per-call cached anyway.\n const encoded: Record<string, any>[] = [];\n for (const record of records) {\n const filtered = await this.filterRecordToKnownColumns(tableName, record);\n const row: Record<string, any> = {};\n for (const [col, value] of Object.entries(filtered)) {\n row[col] = this.prepareValueForMutation(value, col, tableName);\n }\n if (Object.keys(row).length > 0) encoded.push(row);\n }\n if (encoded.length === 0) return;\n\n await this.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n tx.insert(tableName, encoded);\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // explicitly release the transaction so its row locks are freed.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: records.length },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{ keys: Record<string, any>; data: Record<string, any> }>;\n }): Promise<void> {\n if (updates.length === 0) return;\n try {\n await this.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n for (const { keys, data } of updates) {\n await this.update({ tableName, keys, data, transaction: tx });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: updates.length },\n },\n error,\n );\n }\n }\n\n async batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any>[] }): Promise<void> {\n if (keys.length === 0) return;\n try {\n await this.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async (tx: Transaction) => {\n try {\n for (const keySet of keys) {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n for (const [col, value] of Object.entries(keySet)) {\n i = this.aggregateParams(i, conditions, col, value, tableName, params, types);\n }\n if (conditions.length === 0) continue;\n const sql = `DELETE FROM ${quoteIdent(tableName, 'table name')} WHERE ${conditions.join(' AND ')}`;\n await tx.runUpdate({ sql, params, types });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName, numberOfRecords: keys.length },\n },\n error,\n );\n }\n }\n\n /**\n * Binds a single (column, value) pair into the SQL conditions/params/types\n * accumulators and returns the next available parameter index.\n *\n * The previous version of this helper accepted `i` as a primitive argument\n * and used `i++` internally, which only mutated the local copy every\n * call ended up emitting `@p0`. Returning the new counter value forces\n * callers to thread the index forward and makes that footgun impossible.\n */\n private aggregateParams(\n i: number,\n conditions: string[],\n col: string,\n value: any,\n tableName: TABLE_NAMES,\n params: Record<string, any>,\n types: Record<string, any>,\n ): number {\n const param = `p${i}`;\n conditions.push(`${quoteIdent(col, 'column name')} = @${param}`);\n const prepared = this.prepareValue(value, col, tableName);\n params[param] = prepared;\n const colType = getColumnDef(tableName, col)?.type;\n // Always emit a Spanner type hint for JSON and TIMESTAMP columns\n // (jsonb because prepareValue serialises to string and Spanner needs\n // the `json` type to round-trip; timestamp because prepareValue\n // serialises Date → ISO string and the client otherwise infers\n // `string`, which fails STRING → TIMESTAMP coercion in predicates).\n // For other column types we only emit a hint when the value is null.\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = getSpannerParamType(colType);\n }\n return i + 1;\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any> }): Promise<R | null> {\n try {\n if (!keys || Object.keys(keys).length === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LOAD', 'EMPTY_KEYS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Cannot load without keys to identify records',\n });\n }\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n for (const [col, value] of Object.entries(keys)) {\n i = this.aggregateParams(i, conditions, col, value, tableName, params, types);\n }\n const sql = `SELECT * FROM ${quoteIdent(tableName, 'table name')} WHERE ${conditions.join(' AND ')} LIMIT 1`;\n const [rows] = await this.database.run({ sql, params, types, json: true });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n const result = this.transformRow(tableName, row);\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = result as any;\n if (typeof snapshot.snapshot === 'string') {\n try {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n } catch {\n // leave as-is if not valid JSON\n }\n }\n return snapshot;\n }\n return result as R;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { tableName },\n },\n error,\n );\n }\n }\n\n /**\n * Convert a raw Spanner JSON row into the storage layer's expected shape.\n * Handles JSON-string values, timestamp strings, and bigint integers returned\n * by the Spanner client.\n */\n transformRow<T = Record<string, any>>(tableName: TABLE_NAMES, row: Record<string, any>): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(row)) {\n const colDef = schema?.[key];\n if (value === null || value === undefined) {\n result[key] = value;\n continue;\n }\n if (colDef?.type === 'jsonb') {\n if (typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'timestamp') {\n if (value instanceof Date) {\n // Spanner returns PreciseDate which extends Date normalize to a\n // plain Date so .toISOString() emits millisecond precision.\n result[key] = new Date(value.getTime());\n } else if (typeof value === 'string') {\n result[key] = new Date(value);\n } else if (typeof value === 'object' && typeof (value as any).value === 'string') {\n result[key] = new Date((value as any).value);\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'integer' || colDef?.type === 'bigint') {\n if (typeof value === 'string') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value;\n } else if (typeof value === 'bigint') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value.toString();\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'boolean') {\n result[key] = Boolean(value);\n } else {\n result[key] = value;\n }\n }\n return result as T;\n }\n\n /**\n * Build a parameterized WHERE fragment from a filter object.\n * Supports `_gte`/`_gt`/`_lte`/`_lt` suffixes, `$in` operator, array-as-IN,\n * and `null` IS NULL comparisons.\n */\n prepareWhereClause(\n filters: Record<string, any>,\n tableName?: TABLE_NAMES,\n ): { sql: string; params: Record<string, any>; types: Record<string, any> } {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let i = 0;\n const bind = (col: string, value: unknown): string => {\n const param = `w${i++}`;\n let prepared: any;\n if (value instanceof Date) {\n prepared = value.toISOString();\n } else if (tableName) {\n prepared = this.prepareValue(value, col, tableName);\n } else {\n prepared = value;\n }\n params[param] = prepared;\n const colType = tableName ? getColumnDef(tableName, col)?.type : undefined;\n // Always emit a Spanner type hint for JSON and TIMESTAMP columns\n // (see aggregateParams above for the rationale). Other types only\n // get a hint when the value is null.\n if (prepared === null || colType === 'jsonb' || colType === 'timestamp') {\n types[param] = tableName ? getSpannerParamType(colType) : 'string';\n }\n return param;\n };\n\n for (const [key, value] of Object.entries(filters)) {\n if (value === undefined) continue;\n\n const handleOp = (suffix: string, op: string) => {\n const fieldName = key.slice(0, -suffix.length);\n const param = bind(fieldName, value);\n conditions.push(`${quoteIdent(fieldName, 'field name')} ${op} @${param}`);\n };\n\n if (key.endsWith('_gte')) {\n handleOp('_gte', '>=');\n } else if (key.endsWith('_gt')) {\n handleOp('_gt', '>');\n } else if (key.endsWith('_lte')) {\n handleOp('_lte', '<=');\n } else if (key.endsWith('_lt')) {\n handleOp('_lt', '<');\n } else if (value === null) {\n conditions.push(`${quoteIdent(key, 'field name')} IS NULL`);\n } else if (isInOperator(value)) {\n const inValues = value.$in;\n if (inValues.length === 0) {\n conditions.push('1 = 0');\n } else if (inValues.length === 1) {\n const param = bind(key, inValues[0]);\n conditions.push(`${quoteIdent(key, 'field name')} = @${param}`);\n } else {\n const paramNames: string[] = [];\n for (const item of inValues) {\n paramNames.push(`@${bind(key, item)}`);\n }\n conditions.push(`${quoteIdent(key, 'field name')} IN (${paramNames.join(', ')})`);\n }\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n conditions.push('1 = 0');\n } else if (value.length === 1) {\n const param = bind(key, value[0]);\n conditions.push(`${quoteIdent(key, 'field name')} = @${param}`);\n } else {\n const paramNames: string[] = [];\n for (const item of value) {\n paramNames.push(`@${bind(key, item)}`);\n }\n conditions.push(`${quoteIdent(key, 'field name')} IN (${paramNames.join(', ')})`);\n }\n } else {\n const param = bind(key, value);\n conditions.push(`${quoteIdent(key, 'field name')} = @${param}`);\n }\n }\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n params,\n types,\n };\n }\n\n /**\n * Reads an index from INFORMATION_SCHEMA and compares its table, column list\n * (with ordering), and unique flag against the expected definition. Throws a\n * typed VALIDATE_FAILED error when anything diverges so the operator can\n * reconcile their externally-managed schema.\n */\n private async validateIndexDefinition(expected: {\n name: string;\n table: string;\n columns: string[];\n unique: boolean;\n }): Promise<void> {\n const [indexRows] = await this.database.run({\n sql: `SELECT TABLE_NAME, IS_UNIQUE\n FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName: expected.name },\n json: true,\n });\n const indexRow = (indexRows as Array<{ TABLE_NAME: string; IS_UNIQUE: boolean | string }>)[0];\n if (!indexRow) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} on ${expected.table} does not exist (initMode='validate' will not create it)`,\n { indexName: expected.name, tableName: expected.table },\n );\n }\n\n if (indexRow.TABLE_NAME !== expected.table) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} is on table ${indexRow.TABLE_NAME}, expected ${expected.table}`,\n {\n indexName: expected.name,\n expectedTable: expected.table,\n actualTable: indexRow.TABLE_NAME,\n },\n );\n }\n\n const actualUnique = indexRow.IS_UNIQUE === true || indexRow.IS_UNIQUE === 'YES';\n if (actualUnique !== expected.unique) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} unique flag mismatch (expected ${expected.unique}, actual ${actualUnique})`,\n {\n indexName: expected.name,\n tableName: expected.table,\n expectedUnique: expected.unique,\n actualUnique,\n },\n );\n }\n\n const [colRows] = await this.database.run({\n sql: `SELECT COLUMN_NAME, COLUMN_ORDERING\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName\n ORDER BY ORDINAL_POSITION`,\n params: { indexName: expected.name },\n json: true,\n });\n // Spanner reports COLUMN_ORDERING as 'ASC' / 'DESC' for indexed columns and\n // NULL for STORING columns; we never declare STORING columns, so any null\n // ordering still represents an indexed column with default ASC ordering.\n const actualColumns = (colRows as Array<{ COLUMN_NAME: string; COLUMN_ORDERING: string | null }>).map(\n c => `${c.COLUMN_NAME}${c.COLUMN_ORDERING && c.COLUMN_ORDERING !== 'ASC' ? ` ${c.COLUMN_ORDERING}` : ''}`,\n );\n const normalisedExpected = expected.columns.map(col => {\n // Strip an explicit \"ASC\" so it round-trips against the schema's default.\n if (col.endsWith(' ASC')) return col.slice(0, -' ASC'.length);\n return col;\n });\n\n const matches =\n actualColumns.length === normalisedExpected.length && actualColumns.every((c, i) => c === normalisedExpected[i]);\n if (!matches) {\n throw this.validateError(\n 'INDEX_CREATE',\n `Index ${expected.name} column list mismatch (expected [${normalisedExpected.join(', ')}], actual [${actualColumns.join(', ')}])`,\n {\n indexName: expected.name,\n tableName: expected.table,\n expectedColumns: normalisedExpected.join(','),\n actualColumns: actualColumns.join(','),\n },\n );\n }\n }\n\n async createIndex(options: CreateIndexOptions): Promise<void> {\n try {\n const { name, table, columns, unique = false } = options;\n const indexNameSafe = name; // parsed inside quoteIdent\n if (this.initMode === 'validate') {\n await this.validateIndexDefinition({ name: indexNameSafe, table, columns, unique });\n return;\n }\n if (await this.indexExists(indexNameSafe)) return;\n\n const columnsStr = columns\n .map(col => {\n if (col.endsWith(' DESC') || col.endsWith(' ASC')) {\n const idx = col.lastIndexOf(' ');\n const colName = col.slice(0, idx);\n const direction = col.slice(idx + 1);\n return `${quoteIdent(colName, 'column name')} ${direction}`;\n }\n return quoteIdent(col, 'column name');\n })\n .join(', ');\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const ddl = `CREATE ${uniqueStr}INDEX ${quoteIdent(indexNameSafe, 'index name')} ON ${quoteIdent(table, 'table name')} (${columnsStr})`;\n await this.runDdl([ddl]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_CREATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: options.name, tableName: options.table },\n },\n error,\n );\n }\n }\n\n /**\n * Creates a batch of indexes, swallowing per-index failures with a logger\n * warning. Two classes of failure ALWAYS propagate:\n *\n * - validate-mode mismatches, so the operator sees the missing-index\n * error instead of a silent no-op;\n * - failures on `unique: true` indexes, because a unique index encodes a\n * data-integrity invariant (e.g. duplicate-version prevention). If we\n * swallowed those failures the invariant would silently not be in\n * force, so we surface the error and let init() abort.\n *\n * Non-unique indexes are best-effort: domains use this for both default\n * and custom index creation, and the swallow behavior keeps `init()`\n * resilient to transient races (another process creating the same index\n * concurrently, etc.).\n */\n async createIndexes(indexes: CreateIndexOptions[]): Promise<void> {\n for (const indexDef of indexes) {\n try {\n await this.createIndex(indexDef);\n } catch (error) {\n if (error instanceof MastraError && /VALIDATE_FAILED/.test(error.id)) {\n throw error;\n }\n if (indexDef.unique) {\n throw error;\n }\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n async dropIndex(indexName: string): Promise<void> {\n try {\n if (!(await this.indexExists(indexName))) return;\n await this.runDdl([`DROP INDEX ${quoteIdent(indexName, 'index name')}`]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_DROP', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async listIndexes(tableName?: string): Promise<IndexInfo[]> {\n try {\n const sqlBase = `SELECT i.INDEX_NAME, i.TABLE_NAME, i.IS_UNIQUE\n FROM INFORMATION_SCHEMA.INDEXES i\n WHERE i.TABLE_SCHEMA = '' AND i.INDEX_TYPE = 'INDEX'`;\n const [rows] = tableName\n ? await this.database.run({\n sql: `${sqlBase} AND i.TABLE_NAME = @table`,\n params: { table: tableName },\n json: true,\n })\n : await this.database.run({ sql: sqlBase, json: true });\n\n const indexes: IndexInfo[] = [];\n for (const row of rows as Array<{ INDEX_NAME: string; TABLE_NAME: string; IS_UNIQUE: boolean | string }>) {\n const [colRows] = await this.database.run({\n sql: `SELECT COLUMN_NAME\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @table AND INDEX_NAME = @index\n ORDER BY ORDINAL_POSITION`,\n params: { table: row.TABLE_NAME, index: row.INDEX_NAME },\n json: true,\n });\n indexes.push({\n name: row.INDEX_NAME,\n table: row.TABLE_NAME,\n columns: (colRows as Array<{ COLUMN_NAME: string }>).map(c => c.COLUMN_NAME),\n unique: Boolean(row.IS_UNIQUE === true || row.IS_UNIQUE === 'YES'),\n size: '0 MB',\n definition: '',\n });\n }\n return indexes;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_LIST', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: tableName ? { tableName } : {},\n },\n error,\n );\n }\n }\n\n async describeIndex(indexName: string): Promise<StorageIndexStats> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT INDEX_NAME, TABLE_NAME, IS_UNIQUE\n FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @index`,\n params: { index: indexName },\n json: true,\n });\n const row = (rows as Array<{ INDEX_NAME: string; TABLE_NAME: string; IS_UNIQUE: boolean | string }>)[0];\n if (!row) {\n throw new Error(`Index \"${indexName}\" not found`);\n }\n const [colRows] = await this.database.run({\n sql: `SELECT COLUMN_NAME\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @index\n ORDER BY ORDINAL_POSITION`,\n params: { index: indexName },\n json: true,\n });\n return {\n name: row.INDEX_NAME,\n table: row.TABLE_NAME,\n columns: (colRows as Array<{ COLUMN_NAME: string }>).map(c => c.COLUMN_NAME),\n unique: Boolean(row.IS_UNIQUE === true || row.IS_UNIQUE === 'YES'),\n size: '0 MB',\n definition: '',\n method: 'btree',\n scans: 0,\n tuples_read: 0,\n tuples_fetched: 0,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INDEX_DESCRIBE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n}\n","import type { DateRange, TABLE_NAMES } from '@mastra/core/storage';\nimport { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { quoteIdent } from '../db/utils';\n\nexport { quoteIdent };\n\n/**\n * Build storage filter entries for a date range, using the operator suffixes\n * understood by `SpannerDB.prepareWhereClause`.\n */\nexport function buildDateRangeFilter(dateRange: DateRange | undefined, fieldName: string): Record<string, any> {\n const filters: Record<string, any> = {};\n if (dateRange?.start) {\n const suffix = dateRange.startExclusive ? '_gt' : '_gte';\n filters[`${fieldName}${suffix}`] = dateRange.start;\n }\n if (dateRange?.end) {\n const suffix = dateRange.endExclusive ? '_lt' : '_lte';\n filters[`${fieldName}${suffix}`] = dateRange.end;\n }\n return filters;\n}\n\n/**\n * Convert a Spanner JSON-serialized row into the storage-layer expected shape.\n * Mirrors the helper exported by other adapters so domain code can stay similar.\n */\nexport function transformFromSpannerRow<T>({\n tableName,\n row,\n}: {\n tableName: TABLE_NAMES;\n row: Record<string, any>;\n}): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(row)) {\n const colDef = schema?.[key];\n if (value === null || value === undefined) {\n result[key] = value;\n continue;\n }\n if (colDef?.type === 'jsonb' && typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else if (colDef?.type === 'timestamp') {\n if (value instanceof Date) {\n // Spanner returns PreciseDate (which extends Date) for TIMESTAMP columns.\n // Normalize to a plain Date so .toISOString() emits millisecond precision\n // matching the values the storage layer expects.\n result[key] = new Date(value.getTime());\n } else if (typeof value === 'string') {\n result[key] = new Date(value);\n } else if (typeof value === 'object' && typeof (value as any).value === 'string') {\n result[key] = new Date((value as any).value);\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'integer' || colDef?.type === 'bigint') {\n if (typeof value === 'string') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value;\n } else if (typeof value === 'bigint') {\n const n = Number(value);\n result[key] = Number.isSafeInteger(n) ? n : value.toString();\n } else {\n result[key] = value;\n }\n } else if (colDef?.type === 'boolean') {\n result[key] = Boolean(value);\n } else {\n result[key] = value;\n }\n }\n return result as T;\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n AGENTS_SCHEMA,\n AGENT_VERSIONS_SCHEMA,\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n TABLE_FAVORITES,\n} from '@mastra/core/storage';\nimport type {\n AgentInstructionBlock,\n AgentVersion,\n CreateIndexOptions,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n StorageAgentType,\n StorageCreateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n StorageUpdateAgentInput,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n// Fields the version row already carries as metadata; everything else is\n// snapshot config (pulled in by the abstract class via versionMetadataFields).\nconst VERSION_CONFIG_KEYS = [\n 'name',\n 'description',\n 'instructions',\n 'model',\n 'tools',\n 'defaultOptions',\n 'workflows',\n 'agents',\n 'integrationTools',\n 'inputProcessors',\n 'outputProcessors',\n 'memory',\n 'scorers',\n 'mcpClients',\n 'requestContextSchema',\n 'workspace',\n 'skills',\n 'skillsFormat',\n] as const;\n\nexport class AgentsSpanner extends AgentsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (AgentsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_AGENTS, schema: AGENTS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: AGENT_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` because that mode owns the schema and\n * data externally and must never issue destructive DML.\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENTS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('agentId', 'column name')}\n FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('agentId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft agents:', error);\n }\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_agents_status_createdat_idx',\n table: TABLE_AGENTS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_agents_authorid_idx',\n table: TABLE_AGENTS,\n columns: ['authorId'],\n },\n // Unique index on (agentId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls and keeps getVersionByNumber /\n // getLatestVersion consistent.\n {\n name: 'mastra_agent_versions_agentid_versionnumber_idx',\n table: TABLE_AGENT_VERSIONS,\n columns: ['agentId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_AGENT_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_AGENTS });\n }\n\n private parseAgentRow(row: Record<string, any>): StorageAgentType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_AGENTS, row });\n // visibility and favoriteCount were added to StorageAgentType after the\n // initial Spanner adapter shipped; the stale dist .d.ts published with\n // older core releases doesn't carry them yet so we widen the return\n // shape here to keep the build green until the next core release.\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n visibility: (transformed.visibility as 'private' | 'public' | undefined) ?? undefined,\n metadata: transformed.metadata ?? undefined,\n favoriteCount:\n transformed.favoriteCount === null || transformed.favoriteCount === undefined\n ? 0\n : Number(transformed.favoriteCount),\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n } as StorageAgentType;\n }\n\n /** Coerces stored instructions (string or JSON-stringified array of blocks) back to its API shape. */\n private deserializeInstructions(raw: unknown): string | AgentInstructionBlock[] {\n if (raw == null) return '';\n if (typeof raw !== 'string') return raw as any;\n const trimmed = raw.trim();\n if (!trimmed.startsWith('[')) return raw;\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n } catch {\n // Not JSON treat as plain string.\n }\n return raw;\n }\n\n private serializeInstructions(value: string | AgentInstructionBlock[] | undefined): string {\n if (value == null) return '';\n return Array.isArray(value) ? JSON.stringify(value) : value;\n }\n\n private parseVersionRow(row: Record<string, any>): AgentVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_AGENT_VERSIONS, row });\n return {\n id: transformed.id,\n agentId: transformed.agentId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n instructions: this.deserializeInstructions(transformed.instructions),\n model: transformed.model,\n tools: transformed.tools ?? undefined,\n defaultOptions: transformed.defaultOptions ?? undefined,\n workflows: transformed.workflows ?? undefined,\n agents: transformed.agents ?? undefined,\n integrationTools: transformed.integrationTools ?? undefined,\n inputProcessors: transformed.inputProcessors ?? undefined,\n outputProcessors: transformed.outputProcessors ?? undefined,\n memory: transformed.memory ?? undefined,\n scorers: transformed.scorers ?? undefined,\n mcpClients: transformed.mcpClients ?? undefined,\n requestContextSchema: transformed.requestContextSchema ?? undefined,\n workspace: transformed.workspace ?? undefined,\n skills: transformed.skills ?? undefined,\n skillsFormat: transformed.skillsFormat ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENTS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseAgentRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_AGENT_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async create(input: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n const { agent } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, visibility: _visibility, metadata: _metadata, ...snapshot } = agent as any;\n // Default visibility to 'private' for owned agents so multi-tenant\n // reads stay scoped; legacy/unowned agents keep their nullable status.\n const visibility = (agent as any).visibility ?? (agent.authorId ? 'private' : null);\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n const versionRecord: Record<string, any> = {\n id: versionId,\n agentId: agent.id,\n versionNumber: 1,\n name: (snapshot as any).name ?? null,\n description: (snapshot as any).description ?? null,\n instructions: this.serializeInstructions((snapshot as any).instructions),\n model: (snapshot as any).model ?? {},\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n };\n for (const key of VERSION_CONFIG_KEYS) {\n if (key === 'name' || key === 'description' || key === 'instructions' || key === 'model') continue;\n const value = (snapshot as any)[key];\n versionRecord[key] = value === undefined ? null : value;\n }\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_AGENTS,\n record: {\n id: agent.id,\n status: 'draft',\n activeVersionId: null,\n authorId: agent.authorId ?? null,\n visibility,\n metadata: agent.metadata ?? null,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_AGENT_VERSIONS,\n record: versionRecord,\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(agent.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_AGENT', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${agent.id} not found after creation`,\n details: { agentId: agent.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: agent.id },\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateAgentInput): Promise<StorageAgentType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_AGENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Agent ${id} not found`,\n details: { agentId: id },\n });\n }\n\n // The base update only touches thin-record fields. Config updates are made\n // through `createVersion` by the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if ((updates as any).visibility !== undefined) updateData.visibility = (updates as any).visibility;\n // Replace metadata wholesale, matching the documented DB-adapter semantics.\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_AGENTS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${id} not found after update`,\n details: { agentId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n /** Removes an agent and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n // Both deletes share a transaction so a partial failure can't leave\n // versions without a parent (or vice versa). Spanner has no FK cascades\n // for non-interleaved tables so the parent has to be cleared explicitly.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENTS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n // Default to status='published' so list() never leaks drafts/archived to\n // callers that omit the filter.\n const {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n metadata,\n status,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n // Default to status='published' so list() never leaks drafts/archived to\n // callers that omit the filter. Favorites-feature queries (entityIds /\n // pinFavoritedFor / favoritedOnly) operate on the favorited candidate set\n // and must see entities regardless of lifecycle status, so the default is\n // suppressed for them unless the caller passes an explicit status.\n const favoritesQuery = entityIds !== undefined || pinFavoritedFor !== undefined || favoritedOnly !== undefined;\n const effectiveStatus = status ?? (favoritesQuery ? undefined : 'published');\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_AGENTS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n // Empty entityIds can never match a row — short-circuit before querying.\n if (entityIds && entityIds.length === 0) {\n return { agents: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const tableName = quoteIdent(TABLE_AGENTS, 'table name');\n const favoritesTable = quoteIdent(TABLE_FAVORITES, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n // A favorites JOIN is only needed when a viewer is supplied (favorited-first\n // ordering and/or favoritedOnly filtering).\n const useJoin = Boolean(pinFavoritedFor);\n if (useJoin) params.pinUserId = pinFavoritedFor;\n\n if (effectiveStatus) {\n conditions.push(`a.${quoteIdent('status', 'column name')} = @status`);\n params.status = effectiveStatus;\n }\n if (authorId !== undefined) {\n conditions.push(`a.${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_AGENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(a.metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n if (entityIds && entityIds.length > 0) {\n const placeholders = entityIds.map((id, i) => {\n const param = `eid${i}`;\n params[param] = id;\n return `@${param}`;\n });\n conditions.push(`a.${quoteIdent('id', 'column name')} IN (${placeholders.join(', ')})`);\n }\n if (useJoin && favoritedOnly) {\n conditions.push(`s.${quoteIdent('userId', 'column name')} IS NOT NULL`);\n } else if (favoritedOnly) {\n // favoritedOnly without a viewer can never match a real favorite row.\n conditions.push('1 = 0');\n }\n\n const joinClause = useJoin\n ? `LEFT JOIN ${favoritesTable} s ON s.${quoteIdent('entityType', 'column name')} = 'agent'` +\n ` AND s.${quoteIdent('entityId', 'column name')} = a.${quoteIdent('id', 'column name')}` +\n ` AND s.${quoteIdent('userId', 'column name')} = @pinUserId`\n : '';\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} a ${joinClause} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return { agents: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const orderParts: string[] = [];\n if (useJoin) {\n // Favorited entities first, then the requested ordering.\n orderParts.push(`(s.${quoteIdent('userId', 'column name')} IS NOT NULL) DESC`);\n }\n orderParts.push(`a.${quoteIdent(field, 'column name')} ${dirSql}`);\n orderParts.push(`a.${quoteIdent('id', 'column name')} ${dirSql}`);\n const [rows] = await this.database.run({\n sql: `SELECT a.* FROM ${tableName} a ${joinClause} ${whereSql}\n ORDER BY ${orderParts.join(', ')}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const agents = (rows as Array<Record<string, any>>).map(r => this.parseAgentRow(r));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_AGENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n try {\n const now = new Date();\n const record: Record<string, any> = {\n id: input.id,\n agentId: input.agentId,\n versionNumber: input.versionNumber,\n name: input.name ?? null,\n description: input.description ?? null,\n instructions: this.serializeInstructions(input.instructions),\n model: input.model ?? {},\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n };\n // Pass through optional config fields when present.\n for (const key of VERSION_CONFIG_KEYS) {\n if (key === 'name' || key === 'description' || key === 'instructions' || key === 'model') continue;\n const value = (input as any)[key];\n record[key] = value === undefined ? null : value;\n }\n\n await this.db.insert({ tableName: TABLE_AGENT_VERSIONS, record });\n\n return {\n ...input,\n createdAt: now,\n } as AgentVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, agentId: input.agentId },\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<AgentVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(agentId: string, versionNumber: number): Promise<AgentVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('agentId', 'column name')} = @agentId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { agentId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId, versionNumber },\n },\n error,\n );\n }\n }\n\n async getLatestVersion(agentId: string): Promise<AgentVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('agentId', 'column name')} = @agentId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { agentId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_AGENT_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('agentId', 'column name')} = @agentId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { agentId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_VERSIONS_BY_AGENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(agentId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_AGENT_VERSIONS, 'table name')} WHERE ${quoteIdent('agentId', 'column name')} = @agentId`,\n params: { agentId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport type {\n BackgroundTask,\n BackgroundTaskStatus,\n TaskFilter,\n TaskListResult,\n UpdateBackgroundTask,\n} from '@mastra/core/background-tasks';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport {\n BackgroundTasksStorage,\n createStorageErrorId,\n TABLE_BACKGROUND_TASKS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction buildStatusCondition(\n filter: TaskFilter,\n params: Record<string, any>,\n startIdx: number,\n): { kind: 'no-filter' } | { kind: 'empty' } | { kind: 'sql'; sql: string; nextIdx: number } {\n if (filter.status === undefined) return { kind: 'no-filter' };\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n if (statuses.length === 0) return { kind: 'empty' };\n const placeholders: string[] = [];\n let idx = startIdx;\n for (const status of statuses) {\n const name = `p${idx++}`;\n params[name] = status;\n placeholders.push(`@${name}`);\n }\n return {\n kind: 'sql',\n sql: `${quoteIdent('status', 'column name')} IN (${placeholders.join(', ')})`,\n nextIdx: idx,\n };\n}\n\nfunction rowToTask(row: Record<string, any>): BackgroundTask {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_BACKGROUND_TASKS, row });\n const parseJson = (val: unknown): any => {\n if (val == null) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n const suspendPayload = parseJson(transformed.suspend_payload);\n return {\n id: transformed.id,\n status: transformed.status as BackgroundTaskStatus,\n toolName: transformed.tool_name,\n toolCallId: transformed.tool_call_id,\n args: parseJson(transformed.args) ?? {},\n agentId: transformed.agent_id,\n threadId: transformed.thread_id ?? undefined,\n resourceId: transformed.resource_id ?? undefined,\n runId: transformed.run_id ?? '',\n result: parseJson(transformed.result),\n error: parseJson(transformed.error),\n suspendPayload: suspendPayload === null ? undefined : suspendPayload,\n retryCount: Number(transformed.retry_count),\n maxRetries: Number(transformed.max_retries),\n timeoutMs: Number(transformed.timeout_ms),\n createdAt: transformed.createdAt instanceof Date ? transformed.createdAt : new Date(transformed.createdAt),\n startedAt: transformed.startedAt\n ? transformed.startedAt instanceof Date\n ? transformed.startedAt\n : new Date(transformed.startedAt)\n : undefined,\n suspendedAt: transformed.suspendedAt\n ? transformed.suspendedAt instanceof Date\n ? transformed.suspendedAt\n : new Date(transformed.suspendedAt)\n : undefined,\n completedAt: transformed.completedAt\n ? transformed.completedAt instanceof Date\n ? transformed.completedAt\n : new Date(transformed.completedAt)\n : undefined,\n };\n}\n\nexport class BackgroundTasksSpanner extends BackgroundTasksStorage {\n private database: Database;\n private db: SpannerDB;\n private skipDefaultIndexes?: boolean;\n private indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_BACKGROUND_TASKS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx =>\n (BackgroundTasksSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n async init(): Promise<void> {\n await this.db.createTable({\n tableName: TABLE_BACKGROUND_TASKS,\n schema: TABLE_SCHEMAS[TABLE_BACKGROUND_TASKS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n // Indexes here cover every filter shape that listTasks / deleteTasks\n // accept (status, agent_id, thread_id, tool_call_id, run_id,\n // resource_id, tool_name) plus the createdAt ordering used as the\n // default sort. Operators with workloads that would hot-spot on the\n // monotonically-increasing createdAt column can opt out via\n // `skipDefaultIndexes` and supply hashed alternatives.\n return [\n {\n name: 'mastra_bg_tasks_status_created_at_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['status', 'createdAt'],\n },\n {\n name: 'mastra_bg_tasks_agent_status_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['agent_id', 'status'],\n },\n {\n name: 'mastra_bg_tasks_thread_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['thread_id', 'createdAt'],\n },\n {\n name: 'mastra_bg_tasks_tool_call_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['tool_call_id'],\n },\n // listTasks({ runId }) runs scoped to a single workflow run.\n {\n name: 'mastra_bg_tasks_run_id_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['run_id'],\n },\n // listTasks({ resourceId, ... }) resource-scoped listings.\n {\n name: 'mastra_bg_tasks_resource_id_created_at_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['resource_id', 'createdAt'],\n },\n // listTasks({ toolName, ... }) per-tool dashboards / metrics.\n {\n name: 'mastra_bg_tasks_tool_name_created_at_idx',\n table: TABLE_BACKGROUND_TASKS,\n columns: ['tool_name', 'createdAt'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_BACKGROUND_TASKS });\n }\n\n private tableName(): string {\n return quoteIdent(TABLE_BACKGROUND_TASKS, 'table name');\n }\n\n async createTask(task: BackgroundTask): Promise<void> {\n await this.db.insert({\n tableName: TABLE_BACKGROUND_TASKS,\n record: {\n id: task.id,\n tool_call_id: task.toolCallId,\n tool_name: task.toolName,\n agent_id: task.agentId,\n thread_id: task.threadId ?? null,\n resource_id: task.resourceId ?? null,\n run_id: task.runId,\n status: task.status,\n args: task.args,\n result: task.result ?? null,\n error: task.error ?? null,\n suspend_payload: task.suspendPayload ?? null,\n retry_count: task.retryCount,\n max_retries: task.maxRetries,\n timeout_ms: task.timeoutMs,\n createdAt: task.createdAt,\n startedAt: task.startedAt ?? null,\n suspendedAt: task.suspendedAt ?? null,\n completedAt: task.completedAt ?? null,\n },\n });\n }\n\n async updateTask(taskId: string, update: UpdateBackgroundTask): Promise<void> {\n const data: Record<string, any> = {};\n if ('status' in update) data.status = update.status;\n if ('result' in update) data.result = update.result ?? null;\n if ('error' in update) data.error = update.error ?? null;\n if ('suspendPayload' in update) data.suspend_payload = update.suspendPayload ?? null;\n if ('retryCount' in update) data.retry_count = update.retryCount;\n if ('startedAt' in update) data.startedAt = update.startedAt ?? null;\n if ('suspendedAt' in update) data.suspendedAt = update.suspendedAt ?? null;\n if ('completedAt' in update) data.completedAt = update.completedAt ?? null;\n if (Object.keys(data).length === 0) return;\n await this.db.update({ tableName: TABLE_BACKGROUND_TASKS, keys: { id: taskId }, data });\n }\n\n async getTask(taskId: string): Promise<BackgroundTask | null> {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${this.tableName()} WHERE id = @id LIMIT 1`,\n params: { id: taskId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return rowToTask(row);\n }\n\n async listTasks(filter: TaskFilter): Promise<TaskListResult> {\n if (filter.page !== undefined && filter.page < 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_TASKS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'page must be >= 0',\n details: { page: filter.page },\n });\n }\n if (filter.perPage !== undefined && filter.perPage < 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_TASKS', 'INVALID_PER_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'perPage must be >= 0',\n details: { perPage: filter.perPage },\n });\n }\n\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n // Spanner needs an explicit `timestamp` type hint for date params bound as\n // ISO strings (otherwise the client infers `string` and the predicate\n // fails the STRING -> TIMESTAMP coercion).\n const types: Record<string, any> = {};\n let idx = 1;\n\n const statusCondition = buildStatusCondition(filter, params, idx);\n if (statusCondition.kind === 'empty') {\n // Explicit empty status array means \"match nothing\" short-circuit\n // so we never emit invalid `status IN ()` SQL.\n return { tasks: [], total: 0 };\n }\n if (statusCondition.kind === 'sql') {\n conditions.push(statusCondition.sql);\n idx = statusCondition.nextIdx;\n }\n if (filter.agentId) {\n const name = `p${idx++}`;\n params[name] = filter.agentId;\n conditions.push(`${quoteIdent('agent_id', 'column name')} = @${name}`);\n }\n if (filter.threadId) {\n const name = `p${idx++}`;\n params[name] = filter.threadId;\n conditions.push(`${quoteIdent('thread_id', 'column name')} = @${name}`);\n }\n if (filter.resourceId) {\n const name = `p${idx++}`;\n params[name] = filter.resourceId;\n conditions.push(`${quoteIdent('resource_id', 'column name')} = @${name}`);\n }\n if (filter.runId) {\n const name = `p${idx++}`;\n params[name] = filter.runId;\n conditions.push(`${quoteIdent('run_id', 'column name')} = @${name}`);\n }\n if (filter.toolName) {\n const name = `p${idx++}`;\n params[name] = filter.toolName;\n conditions.push(`${quoteIdent('tool_name', 'column name')} = @${name}`);\n }\n if (filter.toolCallId) {\n const name = `p${idx++}`;\n params[name] = filter.toolCallId;\n conditions.push(`${quoteIdent('tool_call_id', 'column name')} = @${name}`);\n }\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdent('startedAt', 'column name')\n : filter.dateFilterBy === 'suspendedAt'\n ? quoteIdent('suspendedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdent('completedAt', 'column name')\n : quoteIdent('createdAt', 'column name');\n if (filter.fromDate) {\n const name = `p${idx++}`;\n params[name] = filter.fromDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} >= @${name}`);\n }\n if (filter.toDate) {\n const name = `p${idx++}`;\n params[name] = filter.toDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} < @${name}`);\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const usePagination = filter.perPage != null;\n\n let total = 0;\n if (usePagination) {\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${this.tableName()} ${whereSql}`,\n params,\n types,\n json: true,\n });\n total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n\n const orderCol =\n filter.orderBy === 'startedAt'\n ? quoteIdent('startedAt', 'column name')\n : filter.orderBy === 'suspendedAt'\n ? quoteIdent('suspendedAt', 'column name')\n : filter.orderBy === 'completedAt'\n ? quoteIdent('completedAt', 'column name')\n : quoteIdent('createdAt', 'column name');\n const direction = filter.orderDirection === 'desc' ? 'DESC' : 'ASC';\n\n let sql = `SELECT * FROM ${this.tableName()} ${whereSql} ORDER BY ${orderCol} ${direction}, id ${direction}`;\n if (usePagination) {\n const offset = filter.page != null ? filter.page * filter.perPage! : 0;\n const limitName = `p${idx++}`;\n const offsetName = `p${idx++}`;\n params[limitName] = filter.perPage!;\n params[offsetName] = offset;\n sql += ` LIMIT @${limitName} OFFSET @${offsetName}`;\n }\n\n const [rows] = await this.database.run({ sql, params, types, json: true });\n const tasks = (rows as Array<Record<string, any>>).map(rowToTask);\n return { tasks, total: usePagination ? total : tasks.length };\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.db.runDml({\n sql: `DELETE FROM ${this.tableName()} WHERE id = @id`,\n params: { id: taskId },\n });\n }\n\n async deleteTasks(filter: TaskFilter): Promise<void> {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n // Spanner needs an explicit `timestamp` type hint for date params bound as\n // ISO strings (see listTasks for the full rationale).\n const types: Record<string, any> = {};\n let idx = 1;\n\n const statusCondition = buildStatusCondition(filter, params, idx);\n if (statusCondition.kind === 'empty') {\n return;\n }\n if (statusCondition.kind === 'sql') {\n conditions.push(statusCondition.sql);\n idx = statusCondition.nextIdx;\n }\n const dateCol =\n filter.dateFilterBy === 'startedAt'\n ? quoteIdent('startedAt', 'column name')\n : filter.dateFilterBy === 'completedAt'\n ? quoteIdent('completedAt', 'column name')\n : quoteIdent('createdAt', 'column name');\n if (filter.fromDate) {\n const name = `p${idx++}`;\n params[name] = filter.fromDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} >= @${name}`);\n }\n if (filter.toDate) {\n const name = `p${idx++}`;\n params[name] = filter.toDate.toISOString();\n types[name] = 'timestamp';\n conditions.push(`${dateCol} < @${name}`);\n }\n if (filter.agentId) {\n const name = `p${idx++}`;\n params[name] = filter.agentId;\n conditions.push(`${quoteIdent('agent_id', 'column name')} = @${name}`);\n }\n if (filter.threadId) {\n const name = `p${idx++}`;\n params[name] = filter.threadId;\n conditions.push(`${quoteIdent('thread_id', 'column name')} = @${name}`);\n }\n if (filter.resourceId) {\n const name = `p${idx++}`;\n params[name] = filter.resourceId;\n conditions.push(`${quoteIdent('resource_id', 'column name')} = @${name}`);\n }\n if (filter.runId) {\n const name = `p${idx++}`;\n params[name] = filter.runId;\n conditions.push(`${quoteIdent('run_id', 'column name')} = @${name}`);\n }\n if (filter.toolName) {\n const name = `p${idx++}`;\n params[name] = filter.toolName;\n conditions.push(`${quoteIdent('tool_name', 'column name')} = @${name}`);\n }\n\n // Refuse to issue an unscoped DELETE callers that really want to wipe\n // the table should reach for `dangerouslyClearAll()`.\n if (conditions.length === 0) return;\n await this.db.runDml({\n sql: `DELETE FROM ${this.tableName()} WHERE ${conditions.join(' AND ')}`,\n params,\n types,\n });\n }\n\n async getRunningCount(): Promise<number> {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${this.tableName()} WHERE ${quoteIdent('status', 'column name')} = 'running'`,\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n\n async getRunningCountByAgent(agentId: string): Promise<number> {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${this.tableName()} WHERE ${quoteIdent('status', 'column name')} = 'running' AND ${quoteIdent('agent_id', 'column name')} = @agentId`,\n params: { agentId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { BlobStore, createStorageErrorId, SKILL_BLOBS_SCHEMA, TABLE_SKILL_BLOBS } from '@mastra/core/storage';\nimport type { CreateIndexOptions, StorageBlobEntry } from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Content-addressable blob store backed by Spanner. Blobs are keyed by their\n * SHA-256 hash; duplicate puts are no-ops thanks to `INSERT OR IGNORE`.\n */\nexport class BlobsSpanner extends BlobStore {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SKILL_BLOBS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (BlobsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the blobs table and any caller-supplied custom indexes. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SKILL_BLOBS, schema: SKILL_BLOBS_SCHEMA });\n await this.createCustomIndexes();\n }\n\n /** Creates custom indexes routed to the blobs table; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from the blobs table. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SKILL_BLOBS });\n }\n\n /** Decodes a raw Spanner row into the public `StorageBlobEntry` shape. */\n private parseRow(row: Record<string, any>): StorageBlobEntry {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SKILL_BLOBS, row });\n return {\n hash: transformed.hash,\n content: transformed.content,\n size: Number(transformed.size),\n mimeType: transformed.mimeType ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Stores a single blob keyed by its hash. Idempotent: a repeat hash is a no-op. */\n async put(entry: StorageBlobEntry): Promise<void> {\n try {\n // INSERT OR IGNORE makes the call idempotent for content-addressable\n // hashes. A repeat put with the same hash is a no-op.\n const sql = `INSERT OR IGNORE INTO ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} (\n ${quoteIdent('hash', 'column name')},\n ${quoteIdent('content', 'column name')},\n ${quoteIdent('size', 'column name')},\n ${quoteIdent('mimeType', 'column name')},\n ${quoteIdent('createdAt', 'column name')}\n ) VALUES (@hash, @content, @size, @mimeType, @createdAt)`;\n await this.db.runDml({\n sql,\n params: {\n hash: entry.hash,\n content: entry.content,\n size: entry.size,\n mimeType: entry.mimeType ?? null,\n createdAt: (entry.createdAt ?? new Date()).toISOString(),\n },\n // createdAt must be hinted as TIMESTAMP, otherwise the client infers\n // STRING from the ISO payload and the bind fails the STRING -> TIMESTAMP\n // coercion (matches the rule applied in SpannerDB.insert).\n types: {\n createdAt: 'timestamp',\n ...(entry.mimeType == null ? { mimeType: 'string' } : {}),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_PUT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash: entry.hash },\n },\n error,\n );\n }\n }\n\n /** Fetches a blob by its hash, or `null` when no row matches. */\n async get(hash: string): Promise<StorageBlobEntry | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} WHERE ${quoteIdent('hash', 'column name')} = @hash LIMIT 1`,\n params: { hash },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseRow(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_GET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash },\n },\n error,\n );\n }\n }\n\n /** Returns true when a blob with the given hash exists; cheaper than `get`. */\n async has(hash: string): Promise<boolean> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found FROM ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} WHERE ${quoteIdent('hash', 'column name')} = @hash LIMIT 1`,\n params: { hash },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_HAS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash },\n },\n error,\n );\n }\n }\n\n /** Deletes the blob with the given hash. Returns true when a row was removed. */\n async delete(hash: string): Promise<boolean> {\n try {\n const rowCount = await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_BLOBS, 'table name')} WHERE ${quoteIdent('hash', 'column name')} = @hash`,\n params: { hash },\n });\n return rowCount > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { hash },\n },\n error,\n );\n }\n }\n\n /** Atomically stores a batch of blobs in a single Spanner transaction. */\n async putMany(entries: StorageBlobEntry[]): Promise<void> {\n if (entries.length === 0) return;\n try {\n // Wrap all inserts in a single transaction so that the whole batch either\n // commits or fails together. INSERT OR IGNORE keeps repeat hashes safe.\n const tableName = quoteIdent(TABLE_SKILL_BLOBS, 'table name');\n const insertSql = `INSERT OR IGNORE INTO ${tableName} (\n ${quoteIdent('hash', 'column name')},\n ${quoteIdent('content', 'column name')},\n ${quoteIdent('size', 'column name')},\n ${quoteIdent('mimeType', 'column name')},\n ${quoteIdent('createdAt', 'column name')}\n ) VALUES (@hash, @content, @size, @mimeType, @createdAt)`;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n for (const entry of entries) {\n await tx.runUpdate({\n sql: insertSql,\n params: {\n hash: entry.hash,\n content: entry.content,\n size: entry.size,\n mimeType: entry.mimeType ?? null,\n createdAt: (entry.createdAt ?? new Date()).toISOString(),\n },\n types: {\n createdAt: 'timestamp',\n ...(entry.mimeType == null ? { mimeType: 'string' } : {}),\n },\n });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_PUT_MANY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: entries.length },\n },\n error,\n );\n }\n }\n\n /** Fetches multiple blobs by hash in chunks of 500. Missing hashes are absent from the map. */\n async getMany(hashes: string[]): Promise<Map<string, StorageBlobEntry>> {\n const result = new Map<string, StorageBlobEntry>();\n if (hashes.length === 0) return result;\n try {\n const tableName = quoteIdent(TABLE_SKILL_BLOBS, 'table name');\n const batchSize = 500;\n for (let i = 0; i < hashes.length; i += batchSize) {\n const batch = hashes.slice(i, i + batchSize);\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('hash', 'column name')} IN UNNEST(@hashes)`,\n params: { hashes: batch },\n types: { hashes: { type: 'array', child: { type: 'string' } } },\n json: true,\n });\n for (const row of rows as Array<Record<string, any>>) {\n const entry = this.parseRow(row);\n result.set(entry.hash, entry);\n }\n }\n return result;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BLOB_GET_MANY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { count: hashes.length },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ChannelsStorage,\n createStorageErrorId,\n TABLE_CHANNEL_CONFIG,\n TABLE_CHANNEL_INSTALLATIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type { ChannelConfig, ChannelInstallation, CreateIndexOptions } from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nconst INSTALLATIONS = TABLE_CHANNEL_INSTALLATIONS;\nconst CONFIG = TABLE_CHANNEL_CONFIG;\nconst WEBHOOK_INDEX = 'mastra_channel_installations_webhookid_idx';\n\nfunction rowToInstallation(row: Record<string, any>): ChannelInstallation {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: INSTALLATIONS, row });\n return {\n id: String(t.id),\n platform: String(t.platform),\n agentId: String(t.agentId),\n status: t.status as ChannelInstallation['status'],\n webhookId: t.webhookId == null ? undefined : String(t.webhookId),\n data: (t.data ?? {}) as Record<string, unknown>,\n configHash: t.configHash == null ? undefined : String(t.configHash),\n error: t.error == null ? undefined : String(t.error),\n createdAt: t.createdAt instanceof Date ? t.createdAt : new Date(t.createdAt),\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt : new Date(t.updatedAt),\n };\n}\n\nfunction rowToConfig(row: Record<string, any>): ChannelConfig {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: CONFIG, row });\n return {\n platform: String(t.platform),\n data: (t.data ?? {}) as Record<string, unknown>,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt : new Date(t.updatedAt),\n };\n}\n\n/**\n * Spanner-backed storage for multi-platform channel installations and per-platform\n * configuration. Installations live in `mastra_channel_installations` (keyed by\n * `id`); platform config lives in `mastra_channel_config` (keyed by `platform`).\n */\nexport class ChannelsSpanner extends ChannelsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (ChannelsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: INSTALLATIONS, schema: TABLE_SCHEMAS[INSTALLATIONS] });\n await this.db.createTable({ tableName: CONFIG, schema: TABLE_SCHEMAS[CONFIG] });\n await this.createDefaultIndexes();\n await this.ensureWebhookUniqueIndex();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n // getInstallationByAgent: WHERE platform = @p AND agentId = @a\n name: 'mastra_channel_installations_platform_agentid_idx',\n table: INSTALLATIONS,\n columns: ['platform', 'agentId'],\n },\n {\n // listInstallations: WHERE platform = @p ORDER BY createdAt DESC\n name: 'mastra_channel_installations_platform_createdat_idx',\n table: INSTALLATIONS,\n columns: ['platform', 'createdAt DESC'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /**\n * Creates a NULL_FILTERED UNIQUE index on `webhookId`. A plain Spanner UNIQUE\n * index treats NULL as a value and would reject a second installation without a\n * webhook (a legitimate state for pending installs). Created via\n * raw DDL because the shared index helper can't express NULL_FILTERED.\n */\n private async ensureWebhookUniqueIndex(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n // In validate mode the schema is externally owned, never issue DDL, but\n // still verify the expected index is present so a drifted schema is caught.\n if (this.db.initMode === 'validate') {\n if (!(await this.webhookIndexExists())) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CHANNEL_WEBHOOK_INDEX', 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Index ${WEBHOOK_INDEX} on ${INSTALLATIONS} does not exist (initMode='validate' will not create it)`,\n details: { indexName: WEBHOOK_INDEX, tableName: INSTALLATIONS },\n });\n }\n return;\n }\n if (await this.webhookIndexExists()) return;\n const ddl =\n `CREATE UNIQUE NULL_FILTERED INDEX ${quoteIdent(WEBHOOK_INDEX, 'index name')} ` +\n `ON ${quoteIdent(INSTALLATIONS, 'table name')} (${quoteIdent('webhookId', 'column name')})`;\n try {\n const [operation] = await this.database.updateSchema([ddl]);\n await operation.promise();\n } catch (error) {\n // Tolerate a concurrent creator that won the race, but otherwise surface\n // the failure: this index enforces webhook uniqueness, a data-integrity\n // invariant we must not silently drop (mirrors SpannerDB.createIndexes'\n // handling of unique indexes).\n if (await this.webhookIndexExists()) return;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CHANNEL_WEBHOOK_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName: WEBHOOK_INDEX },\n },\n error,\n );\n }\n }\n\n /** Returns true when the unique webhookId index already exists. */\n private async webhookIndexExists(): Promise<boolean> {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found FROM INFORMATION_SCHEMA.INDEXES\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName: WEBHOOK_INDEX },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: INSTALLATIONS });\n await this.db.clearTable({ tableName: CONFIG });\n }\n\n async saveInstallation(installation: ChannelInstallation): Promise<void> {\n try {\n const now = new Date();\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('id', 'column name')} FROM ${quoteIdent(INSTALLATIONS, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id LIMIT 1`,\n params: { id: installation.id },\n json: true,\n });\n const data: Record<string, any> = {\n platform: installation.platform,\n agentId: installation.agentId,\n status: installation.status,\n webhookId: installation.webhookId ?? null,\n data: installation.data ?? {},\n configHash: installation.configHash ?? null,\n error: installation.error ?? null,\n updatedAt: now,\n };\n if ((rows as unknown[]).length > 0) {\n // Upsert that preserves the original createdAt\n await this.db.update({ tableName: INSTALLATIONS, keys: { id: installation.id }, data, transaction: tx });\n } else {\n await this.db.insert({\n tableName: INSTALLATIONS,\n record: { id: installation.id, ...data, createdAt: installation.createdAt ?? now },\n transaction: tx,\n });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_INSTALLATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: installation.id, platform: installation.platform },\n },\n error,\n );\n }\n }\n\n async getInstallation(id: string): Promise<ChannelInstallation | null> {\n try {\n const row = await this.db.load<Record<string, any>>({ tableName: INSTALLATIONS, keys: { id } });\n return row ? rowToInstallation(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_INSTALLATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async getInstallationByAgent(platform: string, agentId: string): Promise<ChannelInstallation | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(INSTALLATIONS, 'table name')}\n WHERE ${quoteIdent('platform', 'column name')} = @platform\n AND ${quoteIdent('agentId', 'column name')} = @agentId\n ORDER BY CASE ${quoteIdent('status', 'column name')}\n WHEN 'active' THEN 0 WHEN 'pending' THEN 1 ELSE 2 END,\n ${quoteIdent('updatedAt', 'column name')} DESC\n LIMIT 1`,\n params: { platform, agentId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? rowToInstallation(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_INSTALLATION_BY_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { platform, agentId },\n },\n error,\n );\n }\n }\n\n async getInstallationByWebhookId(webhookId: string): Promise<ChannelInstallation | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(INSTALLATIONS, 'table name')}\n WHERE ${quoteIdent('webhookId', 'column name')} = @webhookId LIMIT 1`,\n params: { webhookId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? rowToInstallation(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_INSTALLATION_BY_WEBHOOK_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { webhookId },\n },\n error,\n );\n }\n }\n\n async listInstallations(platform: string): Promise<ChannelInstallation[]> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(INSTALLATIONS, 'table name')}\n WHERE ${quoteIdent('platform', 'column name')} = @platform\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC`,\n params: { platform },\n json: true,\n });\n return (rows as Array<Record<string, any>>).map(rowToInstallation);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_INSTALLATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { platform },\n },\n error,\n );\n }\n }\n\n async deleteInstallation(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(INSTALLATIONS, 'table name')} WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_INSTALLATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async saveConfig(config: ChannelConfig): Promise<void> {\n try {\n await this.db.upsert({\n tableName: CONFIG,\n record: {\n platform: config.platform,\n data: config.data ?? {},\n updatedAt: config.updatedAt ?? new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_CONFIG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { platform: config.platform },\n },\n error,\n );\n }\n }\n\n async getConfig(platform: string): Promise<ChannelConfig | null> {\n try {\n const row = await this.db.load<Record<string, any>>({ tableName: CONFIG, keys: { platform } });\n return row ? rowToConfig(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_CONFIG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { platform },\n },\n error,\n );\n }\n }\n\n async deleteConfig(platform: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(CONFIG, 'table name')} WHERE ${quoteIdent('platform', 'column name')} = @platform`,\n params: { platform },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_CONFIG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { platform },\n },\n error,\n );\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Database, Transaction } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n DatasetsStorage,\n normalizePerPage,\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n AddDatasetItemInput,\n BatchDeleteItemsInput,\n BatchInsertItemsInput,\n CreateDatasetInput,\n CreateIndexOptions,\n DatasetItem,\n DatasetItemRow,\n DatasetRecord,\n DatasetVersion,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n UpdateDatasetInput,\n UpdateDatasetItemInput,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction toDate(value: unknown): Date {\n return value instanceof Date ? value : new Date(value as string);\n}\n\nfunction rowToDataset(row: Record<string, any>): DatasetRecord {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_DATASETS, row });\n return {\n id: String(t.id),\n name: String(t.name),\n description: t.description ?? undefined,\n metadata: t.metadata ?? undefined,\n inputSchema: t.inputSchema ?? undefined,\n groundTruthSchema: t.groundTruthSchema ?? undefined,\n requestContextSchema: t.requestContextSchema ?? undefined,\n tags: t.tags ?? null,\n targetType: t.targetType ?? null,\n targetIds: t.targetIds ?? null,\n scorerIds: t.scorerIds ?? null,\n version: Number(t.version ?? 0),\n createdAt: toDate(t.createdAt),\n updatedAt: toDate(t.updatedAt),\n };\n}\n\nfunction rowToItem(row: Record<string, any>): DatasetItem {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_DATASET_ITEMS, row });\n return {\n id: String(t.id),\n datasetId: String(t.datasetId),\n datasetVersion: Number(t.datasetVersion),\n input: t.input,\n groundTruth: t.groundTruth ?? undefined,\n expectedTrajectory: t.expectedTrajectory ?? undefined,\n requestContext: t.requestContext ?? undefined,\n metadata: t.metadata ?? undefined,\n source: t.source ?? undefined,\n createdAt: toDate(t.createdAt),\n updatedAt: toDate(t.updatedAt),\n };\n}\n\nfunction rowToItemRow(row: Record<string, any>): DatasetItemRow {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_DATASET_ITEMS, row });\n return {\n ...rowToItem(row),\n validTo: t.validTo == null ? null : Number(t.validTo),\n isDeleted: Boolean(t.isDeleted),\n };\n}\n\nfunction rowToVersion(row: Record<string, any>): DatasetVersion {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_DATASET_VERSIONS, row });\n return {\n id: String(t.id),\n datasetId: String(t.datasetId),\n version: Number(t.version),\n createdAt: toDate(t.createdAt),\n };\n}\n\n/**\n * Spanner-backed storage for evaluation datasets, their items (SCD-2 versioned),\n * and version snapshots.\n *\n * Items use slowly-changing-dimension type-2 bookkeeping: each item id can have\n * many rows keyed by `(id, datasetVersion)`. The \"current\" row is the one with\n * `validTo IS NULL`; a live item additionally has `isDeleted = false`, a deleted\n * item has a tombstone row with `isDeleted = true`. Every item mutation bumps the\n * parent dataset's `version` once (batch ops bump once for the whole batch) and\n * records a `mastra_dataset_versions` snapshot. All mutations run in a single\n * Spanner read-write transaction so the version counter, row close-out, and new\n * row never drift.\n */\nexport class DatasetsSpanner extends DatasetsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (DatasetsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_DATASETS, schema: TABLE_SCHEMAS[TABLE_DATASETS] });\n await this.db.createTable({ tableName: TABLE_DATASET_ITEMS, schema: TABLE_SCHEMAS[TABLE_DATASET_ITEMS] });\n await this.db.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: TABLE_SCHEMAS[TABLE_DATASET_VERSIONS] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n // listItems / getItemsByVersion: filter current rows by dataset.\n name: 'mastra_dataset_items_dataset_validto_idx',\n table: TABLE_DATASET_ITEMS,\n columns: ['datasetId', 'validTo'],\n },\n {\n // getItemsByVersion time-travel: datasetId + datasetVersion.\n name: 'mastra_dataset_items_dataset_version_idx',\n table: TABLE_DATASET_ITEMS,\n columns: ['datasetId', 'datasetVersion'],\n },\n {\n // Unique invariant: one snapshot row per (datasetId, version). The DESC\n // ordering also serves listDatasetVersions' newest-first scan.\n name: 'mastra_dataset_versions_dataset_version_idx',\n table: TABLE_DATASET_VERSIONS,\n columns: ['datasetId', 'version DESC'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_DATASET_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_DATASET_ITEMS });\n await this.db.clearTable({ tableName: TABLE_DATASETS });\n }\n\n // ==========================================================================\n // Dataset CRUD\n // ==========================================================================\n\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n try {\n const now = new Date();\n const id = randomUUID();\n const record: DatasetRecord = {\n id,\n name: input.name,\n description: input.description ?? undefined,\n metadata: input.metadata ?? undefined,\n inputSchema: input.inputSchema ?? undefined,\n groundTruthSchema: input.groundTruthSchema ?? undefined,\n requestContextSchema: input.requestContextSchema ?? undefined,\n tags: null,\n targetType: input.targetType ?? null,\n targetIds: input.targetIds ?? null,\n scorerIds: input.scorerIds ?? null,\n version: 0,\n createdAt: now,\n updatedAt: now,\n };\n await this.db.insert({\n tableName: TABLE_DATASETS,\n record: {\n id,\n name: record.name,\n description: record.description ?? null,\n metadata: record.metadata ?? null,\n inputSchema: record.inputSchema ?? null,\n groundTruthSchema: record.groundTruthSchema ?? null,\n requestContextSchema: record.requestContextSchema ?? null,\n tags: record.tags,\n targetType: record.targetType,\n targetIds: record.targetIds,\n scorerIds: record.scorerIds,\n version: 0,\n createdAt: now,\n updatedAt: now,\n },\n });\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getDatasetById(args: { id: string }): Promise<DatasetRecord | null> {\n try {\n const row = await this.db.load<Record<string, any>>({ tableName: TABLE_DATASETS, keys: { id: args.id } });\n return row ? rowToDataset(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n try {\n const data: Record<string, any> = {};\n if (args.name !== undefined) data.name = args.name;\n if (args.description !== undefined) data.description = args.description;\n if (args.metadata !== undefined) data.metadata = args.metadata;\n if (args.inputSchema !== undefined) data.inputSchema = args.inputSchema;\n if (args.groundTruthSchema !== undefined) data.groundTruthSchema = args.groundTruthSchema;\n if (args.requestContextSchema !== undefined) data.requestContextSchema = args.requestContextSchema;\n if (args.tags !== undefined) data.tags = args.tags;\n if (args.targetType !== undefined) data.targetType = args.targetType;\n if (args.targetIds !== undefined) data.targetIds = args.targetIds;\n if (args.scorerIds !== undefined) data.scorerIds = args.scorerIds;\n data.updatedAt = new Date();\n\n await this.db.update({ tableName: TABLE_DATASETS, keys: { id: args.id }, data });\n\n const updated = await this.getDatasetById({ id: args.id });\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_DATASET', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Dataset ${args.id} not found`,\n details: { id: args.id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async deleteDataset(args: { id: string }): Promise<void> {\n try {\n // Best-effort detach of experiments referencing this dataset. These tables\n // may not exist when datasets is used standalone, so failures are swallowed.\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_EXPERIMENT_RESULTS, 'table name')}\n WHERE ${quoteIdent('experimentId', 'column name')} IN (\n SELECT ${quoteIdent('id', 'column name')} FROM ${quoteIdent(TABLE_EXPERIMENTS, 'table name')}\n WHERE ${quoteIdent('datasetId', 'column name')} = @id)`,\n params: { id: args.id },\n });\n await this.db.runDml({\n sql: `UPDATE ${quoteIdent(TABLE_EXPERIMENTS, 'table name')}\n SET ${quoteIdent('datasetId', 'column name')} = NULL,\n ${quoteIdent('datasetVersion', 'column name')} = NULL\n WHERE ${quoteIdent('datasetId', 'column name')} = @id`,\n params: { id: args.id },\n });\n } catch {\n // Experiments tables absent — nothing to detach.\n }\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n for (const table of [TABLE_DATASET_VERSIONS, TABLE_DATASET_ITEMS]) {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(table, 'table name')} WHERE ${quoteIdent('datasetId', 'column name')} = @id`,\n params: { id: args.id },\n });\n }\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_DATASETS, 'table name')} WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id: args.id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n const { page = 0, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const tableName = quoteIdent(TABLE_DATASETS, 'table name');\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName}`,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { datasets: [], pagination: { total: 0, page, perPage: perPageForResponse, hasMore: false } };\n }\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, ${quoteIdent('id', 'column name')} ASC\n LIMIT @limit OFFSET @offset`,\n params: { limit, offset },\n json: true,\n });\n const datasets = (rows as Array<Record<string, any>>).map(rowToDataset);\n return {\n datasets,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_DATASETS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // SCD-2 helpers\n // ==========================================================================\n\n /** Reads and increments the dataset version inside `tx`; throws if missing. */\n private async bumpVersion(tx: Transaction, datasetId: string, now: Date): Promise<number> {\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('version', 'column name')} AS version FROM ${quoteIdent(TABLE_DATASETS, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id LIMIT 1`,\n params: { id: datasetId },\n json: true,\n });\n const row = (rows as Array<{ version: number | string }>)[0];\n if (!row) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'DATASET_ITEM', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Dataset not found: ${datasetId}`,\n details: { datasetId },\n });\n }\n const newVersion = Number(row.version) + 1;\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(TABLE_DATASETS, 'table name')}\n SET ${quoteIdent('version', 'column name')} = @newVersion,\n ${quoteIdent('updatedAt', 'column name')} = @now\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { newVersion, now: now.toISOString(), id: datasetId },\n types: { now: 'timestamp' },\n });\n return newVersion;\n }\n\n /** Inserts a dataset version snapshot row inside `tx`. */\n private async insertVersionRow(tx: Transaction, datasetId: string, version: number, now: Date): Promise<void> {\n await this.db.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: { id: randomUUID(), datasetId, version, createdAt: now },\n transaction: tx,\n });\n }\n\n /** Closes the current (validTo IS NULL) row for an item inside `tx`. */\n private async closeCurrentRow(tx: Transaction, itemId: string, validTo: number): Promise<void> {\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(TABLE_DATASET_ITEMS, 'table name')}\n SET ${quoteIdent('validTo', 'column name')} = @validTo\n WHERE ${quoteIdent('id', 'column name')} = @id\n AND ${quoteIdent('validTo', 'column name')} IS NULL\n AND ${quoteIdent('isDeleted', 'column name')} = FALSE`,\n params: { validTo, id: itemId },\n });\n }\n\n /** Reads the current live row for an item (validTo IS NULL, not deleted). */\n private async loadCurrentItemRow(itemId: string): Promise<DatasetItemRow | null> {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_DATASET_ITEMS, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id\n AND ${quoteIdent('validTo', 'column name')} IS NULL\n AND ${quoteIdent('isDeleted', 'column name')} = FALSE LIMIT 1`,\n params: { id: itemId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? rowToItemRow(row) : null;\n }\n\n // ==========================================================================\n // Item CRUD (SCD-2)\n // ==========================================================================\n\n protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n try {\n const now = new Date();\n const itemId = randomUUID();\n let created: DatasetItem | null = null;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const newVersion = await this.bumpVersion(tx, args.datasetId, now);\n await this.db.insert({\n tableName: TABLE_DATASET_ITEMS,\n record: {\n id: itemId,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: args.input,\n groundTruth: args.groundTruth ?? null,\n expectedTrajectory: args.expectedTrajectory ?? null,\n requestContext: args.requestContext ?? null,\n metadata: args.metadata ?? null,\n source: args.source ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.insertVersionRow(tx, args.datasetId, newVersion, now);\n await tx.commit();\n created = {\n id: itemId,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n input: args.input,\n groundTruth: args.groundTruth,\n expectedTrajectory: args.expectedTrajectory,\n requestContext: args.requestContext,\n metadata: args.metadata,\n source: args.source,\n createdAt: now,\n updatedAt: now,\n };\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return created!;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'ADD_DATASET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId: args.datasetId },\n },\n error,\n );\n }\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n try {\n const existing = await this.loadCurrentItemRow(args.id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_DATASET_ITEM', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Dataset item not found: ${args.id}`,\n details: { id: args.id },\n });\n }\n if (existing.datasetId !== args.datasetId) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_DATASET_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Dataset item ${args.id} does not belong to dataset ${args.datasetId}`,\n details: { id: args.id, datasetId: args.datasetId },\n });\n }\n\n const merged = {\n input: args.input !== undefined ? args.input : existing.input,\n groundTruth: args.groundTruth !== undefined ? args.groundTruth : existing.groundTruth,\n expectedTrajectory:\n args.expectedTrajectory !== undefined ? args.expectedTrajectory : existing.expectedTrajectory,\n requestContext: args.requestContext !== undefined ? args.requestContext : existing.requestContext,\n metadata: args.metadata !== undefined ? args.metadata : existing.metadata,\n source: args.source !== undefined ? args.source : existing.source,\n };\n const now = new Date();\n let updated: DatasetItem | null = null;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const newVersion = await this.bumpVersion(tx, args.datasetId, now);\n await this.closeCurrentRow(tx, args.id, newVersion);\n await this.db.insert({\n tableName: TABLE_DATASET_ITEMS,\n record: {\n id: args.id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: merged.input,\n groundTruth: merged.groundTruth ?? null,\n expectedTrajectory: merged.expectedTrajectory ?? null,\n requestContext: merged.requestContext ?? null,\n metadata: merged.metadata ?? null,\n source: merged.source ?? null,\n createdAt: existing.createdAt,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.insertVersionRow(tx, args.datasetId, newVersion, now);\n await tx.commit();\n updated = {\n id: args.id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n input: merged.input,\n groundTruth: merged.groundTruth,\n expectedTrajectory: merged.expectedTrajectory,\n requestContext: merged.requestContext,\n metadata: merged.metadata,\n source: merged.source,\n createdAt: existing.createdAt,\n updatedAt: now,\n };\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return updated!;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_DATASET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n protected async _doDeleteItem(args: { id: string; datasetId: string }): Promise<void> {\n try {\n const existing = await this.loadCurrentItemRow(args.id);\n if (!existing) return;\n if (existing.datasetId !== args.datasetId) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'DELETE_DATASET_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Dataset item ${args.id} does not belong to dataset ${args.datasetId}`,\n details: { id: args.id, datasetId: args.datasetId },\n });\n }\n const now = new Date();\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const newVersion = await this.bumpVersion(tx, args.datasetId, now);\n await this.closeCurrentRow(tx, args.id, newVersion);\n await this.db.insert({\n tableName: TABLE_DATASET_ITEMS,\n record: {\n id: args.id,\n datasetId: args.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: true,\n input: existing.input,\n groundTruth: existing.groundTruth ?? null,\n expectedTrajectory: existing.expectedTrajectory ?? null,\n requestContext: existing.requestContext ?? null,\n metadata: existing.metadata ?? null,\n source: existing.source ?? null,\n createdAt: existing.createdAt,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.insertVersionRow(tx, args.datasetId, newVersion, now);\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_DATASET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n const { page = 0, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const conditions: string[] = [`${quoteIdent('datasetId', 'column name')} = @datasetId`];\n const params: Record<string, any> = { datasetId: args.datasetId };\n if (args.version !== undefined) {\n conditions.push(`${quoteIdent('datasetVersion', 'column name')} <= @version`);\n conditions.push(\n `(${quoteIdent('validTo', 'column name')} IS NULL OR ${quoteIdent('validTo', 'column name')} > @version)`,\n );\n conditions.push(`${quoteIdent('isDeleted', 'column name')} = FALSE`);\n params.version = args.version;\n } else {\n conditions.push(`${quoteIdent('validTo', 'column name')} IS NULL`);\n conditions.push(`${quoteIdent('isDeleted', 'column name')} = FALSE`);\n }\n if (args.search) {\n conditions.push(\n `(LOWER(TO_JSON_STRING(${quoteIdent('input', 'column name')})) LIKE @search` +\n ` OR LOWER(COALESCE(TO_JSON_STRING(${quoteIdent('groundTruth', 'column name')}), '')) LIKE @search)`,\n );\n params.search = `%${args.search.toLowerCase()}%`;\n }\n const whereSql = `WHERE ${conditions.join(' AND ')}`;\n const tableName = quoteIdent(TABLE_DATASET_ITEMS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { items: [], pagination: { total: 0, page, perPage: perPageForResponse, hasMore: false } };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, ${quoteIdent('id', 'column name')} ASC\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const items = (rows as Array<Record<string, any>>).map(rowToItem);\n return {\n items,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_DATASET_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId: args.datasetId },\n },\n error,\n );\n }\n }\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n try {\n const tableName = quoteIdent(TABLE_DATASET_ITEMS, 'table name');\n let sql: string;\n const params: Record<string, any> = { id: args.id };\n if (args.datasetVersion !== undefined) {\n sql = `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('id', 'column name')} = @id\n AND ${quoteIdent('datasetVersion', 'column name')} = @datasetVersion\n AND ${quoteIdent('isDeleted', 'column name')} = FALSE LIMIT 1`;\n params.datasetVersion = args.datasetVersion;\n } else {\n sql = `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('id', 'column name')} = @id\n AND ${quoteIdent('validTo', 'column name')} IS NULL\n AND ${quoteIdent('isDeleted', 'column name')} = FALSE LIMIT 1`;\n }\n const [rows] = await this.database.run({ sql, params, json: true });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? rowToItem(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_DATASET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async getItemsByVersion(args: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n try {\n const tableName = quoteIdent(TABLE_DATASET_ITEMS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('datasetId', 'column name')} = @datasetId\n AND ${quoteIdent('datasetVersion', 'column name')} <= @version\n AND (${quoteIdent('validTo', 'column name')} IS NULL OR ${quoteIdent('validTo', 'column name')} > @version)\n AND ${quoteIdent('isDeleted', 'column name')} = FALSE\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, ${quoteIdent('id', 'column name')} ASC`,\n params: { datasetId: args.datasetId, version: args.version },\n json: true,\n });\n return (rows as Array<Record<string, any>>).map(rowToItem);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_ITEMS_BY_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId: args.datasetId, version: args.version },\n },\n error,\n );\n }\n }\n\n async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n try {\n const tableName = quoteIdent(TABLE_DATASET_ITEMS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('id', 'column name')} = @id\n ORDER BY ${quoteIdent('datasetVersion', 'column name')} DESC`,\n params: { id: itemId },\n json: true,\n });\n return (rows as Array<Record<string, any>>).map(rowToItemRow);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_ITEM_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: itemId },\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Dataset versions\n // ==========================================================================\n\n async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n try {\n const now = new Date();\n const id = randomUUID();\n await this.db.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: { id, datasetId, version, createdAt: now },\n });\n return { id, datasetId, version, createdAt: now };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_DATASET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId, version },\n },\n error,\n );\n }\n }\n\n async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n const { page = 0, perPage: perPageInput } = input.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const tableName = quoteIdent(TABLE_DATASET_VERSIONS, 'table name');\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('datasetId', 'column name')} = @datasetId`,\n params: { datasetId: input.datasetId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], pagination: { total: 0, page, perPage: perPageForResponse, hasMore: false } };\n }\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('datasetId', 'column name')} = @datasetId\n ORDER BY ${quoteIdent('version', 'column name')} DESC\n LIMIT @limit OFFSET @offset`,\n params: { datasetId: input.datasetId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(rowToVersion);\n return {\n versions,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_DATASET_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId: input.datasetId },\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Batch item operations\n // ==========================================================================\n\n protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n try {\n // An empty batch is a no-op: don't bump the dataset version or write a snapshot.\n if (input.items.length === 0) return [];\n const now = new Date();\n const prepared = input.items.map(item => ({ id: randomUUID(), item }));\n let result: DatasetItem[] = [];\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const newVersion = await this.bumpVersion(tx, input.datasetId, now);\n for (const { id, item } of prepared) {\n await this.db.insert({\n tableName: TABLE_DATASET_ITEMS,\n record: {\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: false,\n input: item.input,\n groundTruth: item.groundTruth ?? null,\n expectedTrajectory: item.expectedTrajectory ?? null,\n requestContext: item.requestContext ?? null,\n metadata: item.metadata ?? null,\n source: item.source ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n }\n await this.insertVersionRow(tx, input.datasetId, newVersion, now);\n await tx.commit();\n result = prepared.map(({ id, item }) => ({\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n input: item.input,\n groundTruth: item.groundTruth,\n expectedTrajectory: item.expectedTrajectory,\n requestContext: item.requestContext,\n metadata: item.metadata,\n source: item.source,\n createdAt: now,\n updatedAt: now,\n }));\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return result;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_INSERT_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId: input.datasetId },\n },\n error,\n );\n }\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n try {\n // Resolve current rows up front and keep only those belonging to the dataset.\n const current: DatasetItemRow[] = [];\n for (const itemId of input.itemIds) {\n const row = await this.loadCurrentItemRow(itemId);\n if (row && row.datasetId === input.datasetId) current.push(row);\n }\n if (current.length === 0) return;\n\n const now = new Date();\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const newVersion = await this.bumpVersion(tx, input.datasetId, now);\n for (const existing of current) {\n await this.closeCurrentRow(tx, existing.id, newVersion);\n await this.db.insert({\n tableName: TABLE_DATASET_ITEMS,\n record: {\n id: existing.id,\n datasetId: input.datasetId,\n datasetVersion: newVersion,\n validTo: null,\n isDeleted: true,\n input: existing.input,\n groundTruth: existing.groundTruth ?? null,\n expectedTrajectory: existing.expectedTrajectory ?? null,\n requestContext: existing.requestContext ?? null,\n metadata: existing.metadata ?? null,\n source: existing.source ?? null,\n createdAt: existing.createdAt,\n updatedAt: now,\n },\n transaction: tx,\n });\n }\n await this.insertVersionRow(tx, input.datasetId, newVersion, now);\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_DELETE_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { datasetId: input.datasetId },\n },\n error,\n );\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n ExperimentsStorage,\n normalizePerPage,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n AddExperimentResultInput,\n CreateExperimentInput,\n CreateIndexOptions,\n Experiment,\n ExperimentResult,\n ExperimentReviewCounts,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n ListExperimentsInput,\n ListExperimentsOutput,\n UpdateExperimentInput,\n UpdateExperimentResultInput,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction toDate(value: unknown): Date {\n return value instanceof Date ? value : new Date(value as string);\n}\n\nfunction rowToExperiment(row: Record<string, any>): Experiment {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_EXPERIMENTS, row });\n return {\n id: String(t.id),\n name: t.name ?? undefined,\n description: t.description ?? undefined,\n metadata: t.metadata ?? undefined,\n datasetId: t.datasetId ?? null,\n datasetVersion: t.datasetVersion == null ? null : Number(t.datasetVersion),\n targetType: t.targetType,\n targetId: String(t.targetId),\n status: t.status,\n totalItems: Number(t.totalItems ?? 0),\n succeededCount: Number(t.succeededCount ?? 0),\n failedCount: Number(t.failedCount ?? 0),\n skippedCount: Number(t.skippedCount ?? 0),\n agentVersion: t.agentVersion ?? null,\n startedAt: t.startedAt == null ? null : toDate(t.startedAt),\n completedAt: t.completedAt == null ? null : toDate(t.completedAt),\n createdAt: toDate(t.createdAt),\n updatedAt: toDate(t.updatedAt),\n };\n}\n\nfunction rowToExperimentResult(row: Record<string, any>): ExperimentResult {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_EXPERIMENT_RESULTS, row });\n return {\n id: String(t.id),\n experimentId: String(t.experimentId),\n itemId: String(t.itemId),\n itemDatasetVersion: t.itemDatasetVersion == null ? null : Number(t.itemDatasetVersion),\n input: t.input ?? null,\n output: t.output ?? null,\n groundTruth: t.groundTruth ?? null,\n error: (t.error ?? null) as ExperimentResult['error'],\n startedAt: toDate(t.startedAt),\n completedAt: toDate(t.completedAt),\n retryCount: Number(t.retryCount ?? 0),\n traceId: t.traceId ?? null,\n status: (t.status ?? null) as ExperimentResult['status'],\n tags: (t.tags ?? null) as string[] | null,\n createdAt: toDate(t.createdAt),\n };\n}\n\n/**\n * Spanner-backed storage for experiments (`mastra_experiments`) and their per-item\n * results (`mastra_experiment_results`). Both tables are keyed by `id`; results are\n * additionally constrained to one row per `(experimentId, itemId)`.\n */\nexport class ExperimentsSpanner extends ExperimentsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (ExperimentsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_EXPERIMENTS, schema: TABLE_SCHEMAS[TABLE_EXPERIMENTS] });\n await this.db.createTable({ tableName: TABLE_EXPERIMENT_RESULTS, schema: TABLE_SCHEMAS[TABLE_EXPERIMENT_RESULTS] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_experiments_datasetid_idx',\n table: TABLE_EXPERIMENTS,\n columns: ['datasetId'],\n },\n {\n name: 'mastra_experiment_results_experimentid_idx',\n table: TABLE_EXPERIMENT_RESULTS,\n columns: ['experimentId', 'startedAt'],\n },\n {\n // One result per (experiment, item).\n name: 'mastra_experiment_results_exp_item_idx',\n table: TABLE_EXPERIMENT_RESULTS,\n columns: ['experimentId', 'itemId'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_EXPERIMENT_RESULTS });\n await this.db.clearTable({ tableName: TABLE_EXPERIMENTS });\n }\n\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n try {\n const now = new Date();\n const id = input.id ?? randomUUID();\n const experiment: Experiment = {\n id,\n name: input.name ?? undefined,\n description: input.description ?? undefined,\n metadata: input.metadata ?? undefined,\n datasetId: input.datasetId ?? null,\n datasetVersion: input.datasetVersion ?? null,\n targetType: input.targetType,\n targetId: input.targetId,\n status: 'pending',\n totalItems: input.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n agentVersion: input.agentVersion ?? null,\n startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n await this.db.insert({\n tableName: TABLE_EXPERIMENTS,\n record: {\n id,\n name: experiment.name ?? null,\n description: experiment.description ?? null,\n metadata: experiment.metadata ?? null,\n datasetId: experiment.datasetId,\n datasetVersion: experiment.datasetVersion,\n targetType: experiment.targetType,\n targetId: experiment.targetId,\n status: experiment.status,\n totalItems: experiment.totalItems,\n succeededCount: 0,\n failedCount: 0,\n skippedCount: 0,\n agentVersion: experiment.agentVersion,\n startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n },\n });\n return experiment;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async updateExperiment(input: UpdateExperimentInput): Promise<Experiment> {\n try {\n const existing = await this.getExperimentById({ id: input.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment ${input.id} not found`,\n details: { id: input.id },\n });\n }\n\n const data: Record<string, any> = {};\n if (input.name !== undefined) data.name = input.name;\n if (input.description !== undefined) data.description = input.description;\n if (input.metadata !== undefined) data.metadata = input.metadata;\n if (input.status !== undefined) data.status = input.status;\n if (input.totalItems !== undefined) data.totalItems = input.totalItems;\n if (input.succeededCount !== undefined) data.succeededCount = input.succeededCount;\n if (input.failedCount !== undefined) data.failedCount = input.failedCount;\n if (input.skippedCount !== undefined) data.skippedCount = input.skippedCount;\n if (input.startedAt !== undefined) data.startedAt = input.startedAt;\n if (input.completedAt !== undefined) data.completedAt = input.completedAt;\n data.updatedAt = new Date();\n\n await this.db.update({ tableName: TABLE_EXPERIMENTS, keys: { id: input.id }, data });\n\n const updated = await this.getExperimentById({ id: input.id });\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment ${input.id} not found`,\n details: { id: input.id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async getExperimentById(args: { id: string }): Promise<Experiment | null> {\n try {\n const row = await this.db.load<Record<string, any>>({ tableName: TABLE_EXPERIMENTS, keys: { id: args.id } });\n return row ? rowToExperiment(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n const { page = 0, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n if (args.datasetId !== undefined) {\n conditions.push(`${quoteIdent('datasetId', 'column name')} = @datasetId`);\n params.datasetId = args.datasetId;\n }\n if (args.targetType !== undefined) {\n conditions.push(`${quoteIdent('targetType', 'column name')} = @targetType`);\n params.targetType = args.targetType;\n }\n if (args.targetId !== undefined) {\n conditions.push(`${quoteIdent('targetId', 'column name')} = @targetId`);\n params.targetId = args.targetId;\n }\n if (args.agentVersion !== undefined) {\n conditions.push(`${quoteIdent('agentVersion', 'column name')} = @agentVersion`);\n params.agentVersion = args.agentVersion;\n }\n if (args.status !== undefined) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = args.status;\n }\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const tableName = quoteIdent(TABLE_EXPERIMENTS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { experiments: [], pagination: { total: 0, page, perPage: perPageForResponse, hasMore: false } };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const experiments = (rows as Array<Record<string, any>>).map(rowToExperiment);\n return {\n experiments,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_EXPERIMENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperiment(args: { id: string }): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_EXPERIMENT_RESULTS, 'table name')}\n WHERE ${quoteIdent('experimentId', 'column name')} = @id`,\n params: { id: args.id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_EXPERIMENTS, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id: args.id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n try {\n const now = new Date();\n const id = input.id ?? randomUUID();\n const result: ExperimentResult = {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion ?? null,\n input: input.input ?? null,\n output: input.output ?? null,\n groundTruth: input.groundTruth ?? null,\n error: input.error ?? null,\n startedAt: input.startedAt,\n completedAt: input.completedAt,\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n status: input.status ?? null,\n tags: input.tags ?? null,\n createdAt: now,\n };\n await this.db.insert({\n tableName: TABLE_EXPERIMENT_RESULTS,\n record: {\n id,\n experimentId: result.experimentId,\n itemId: result.itemId,\n itemDatasetVersion: result.itemDatasetVersion,\n input: result.input,\n output: result.output,\n groundTruth: result.groundTruth,\n error: result.error,\n startedAt: result.startedAt,\n completedAt: result.completedAt,\n retryCount: result.retryCount,\n traceId: result.traceId,\n status: result.status,\n tags: result.tags,\n createdAt: now,\n },\n });\n return result;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'ADD_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { experimentId: input.experimentId, itemId: input.itemId },\n },\n error,\n );\n }\n }\n\n async updateExperimentResult(input: UpdateExperimentResultInput): Promise<ExperimentResult> {\n try {\n if (input.status === undefined && input.tags === undefined) {\n const existing = await this.getExperimentResultById({ id: input.id });\n // Honor the experimentId scope even on the no-op path: a result that\n // belongs to a different experiment must not be returned.\n if (!existing || (input.experimentId !== undefined && existing.experimentId !== input.experimentId)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT_RESULT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment result ${input.id} not found`,\n details: { id: input.id },\n });\n }\n return existing;\n }\n\n const setClauses: string[] = [];\n const params: Record<string, any> = { id: input.id };\n const types: Record<string, any> = {};\n if (input.status !== undefined) {\n setClauses.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = input.status;\n if (input.status === null) types.status = 'string';\n }\n if (input.tags !== undefined) {\n setClauses.push(`${quoteIdent('tags', 'column name')} = @tags`);\n params.tags = input.tags === null ? null : JSON.stringify(input.tags);\n types.tags = 'json';\n }\n const whereClauses = [`${quoteIdent('id', 'column name')} = @id`];\n if (input.experimentId !== undefined) {\n whereClauses.push(`${quoteIdent('experimentId', 'column name')} = @experimentId`);\n params.experimentId = input.experimentId;\n }\n const rowCount = await this.db.runDml({\n sql: `UPDATE ${quoteIdent(TABLE_EXPERIMENT_RESULTS, 'table name')}\n SET ${setClauses.join(', ')} WHERE ${whereClauses.join(' AND ')}`,\n params,\n types,\n });\n if (rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT_RESULT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment result ${input.id} not found`,\n details: { id: input.id },\n });\n }\n const updated = await this.getExperimentResultById({ id: input.id });\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT_RESULT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Experiment result ${input.id} not found`,\n details: { id: input.id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async getExperimentResultById(args: { id: string }): Promise<ExperimentResult | null> {\n try {\n const row = await this.db.load<Record<string, any>>({\n tableName: TABLE_EXPERIMENT_RESULTS,\n keys: { id: args.id },\n });\n return row ? rowToExperimentResult(row) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: args.id },\n },\n error,\n );\n }\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n const { page = 0, perPage: perPageInput } = args.pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const conditions: string[] = [`${quoteIdent('experimentId', 'column name')} = @experimentId`];\n const params: Record<string, any> = { experimentId: args.experimentId };\n if (args.traceId !== undefined) {\n conditions.push(`${quoteIdent('traceId', 'column name')} = @traceId`);\n params.traceId = args.traceId;\n }\n if (args.status !== undefined) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = args.status;\n }\n const whereSql = `WHERE ${conditions.join(' AND ')}`;\n const tableName = quoteIdent(TABLE_EXPERIMENT_RESULTS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { results: [], pagination: { total: 0, page, perPage: perPageForResponse, hasMore: false } };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent('startedAt', 'column name')} ASC\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const results = (rows as Array<Record<string, any>>).map(rowToExperimentResult);\n return {\n results,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_EXPERIMENT_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { experimentId: args.experimentId },\n },\n error,\n );\n }\n }\n\n async deleteExperimentResults(args: { experimentId: string }): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_EXPERIMENT_RESULTS, 'table name')}\n WHERE ${quoteIdent('experimentId', 'column name')} = @experimentId`,\n params: { experimentId: args.experimentId },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_EXPERIMENT_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { experimentId: args.experimentId },\n },\n error,\n );\n }\n }\n\n async getReviewSummary(): Promise<ExperimentReviewCounts[]> {\n try {\n const tableName = quoteIdent(TABLE_EXPERIMENT_RESULTS, 'table name');\n const statusCol = quoteIdent('status', 'column name');\n const [rows] = await this.database.run({\n sql: `SELECT ${quoteIdent('experimentId', 'column name')} AS experimentId,\n COUNT(*) AS total,\n SUM(CASE WHEN ${statusCol} = 'needs-review' THEN 1 ELSE 0 END) AS needsReview,\n SUM(CASE WHEN ${statusCol} = 'reviewed' THEN 1 ELSE 0 END) AS reviewed,\n SUM(CASE WHEN ${statusCol} = 'complete' THEN 1 ELSE 0 END) AS complete\n FROM ${tableName}\n GROUP BY ${quoteIdent('experimentId', 'column name')}`,\n json: true,\n });\n return (rows as Array<Record<string, any>>).map(r => ({\n experimentId: String(r.experimentId),\n total: Number(r.total ?? 0),\n needsReview: Number(r.needsReview ?? 0),\n reviewed: Number(r.reviewed ?? 0),\n complete: Number(r.complete ?? 0),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_REVIEW_SUMMARY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import type { Database, Transaction } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n FavoritesStorage,\n TABLE_AGENTS,\n TABLE_FAVORITES,\n TABLE_SKILLS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n FavoriteToggleResult,\n StorageDeleteFavoritesForEntityInput,\n StorageFavoriteEntityType,\n StorageFavoriteKey,\n StorageIsFavoritedBatchInput,\n StorageListFavoritesInput,\n TABLE_NAMES,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\n\n/**\n * Maps a favorite entity type to the parent table whose denormalized\n * `favoriteCount` column the favorites domain keeps in sync.\n */\nconst ENTITY_TABLE: Record<StorageFavoriteEntityType, TABLE_NAMES> = {\n agent: TABLE_AGENTS,\n skill: TABLE_SKILLS,\n};\n\n/**\n * Spanner-backed storage for user favorites.\n *\n * Persists `(userId, entityType, entityId)` rows in `mastra_favorites` (composite\n * primary key) and keeps the denormalized `favoriteCount` on the parent entity\n * (`mastra_agents` / `mastra_skills`) in sync. All mutating operations run inside\n * a single read-write transaction so the favorite row and the counter never drift.\n */\nexport class FavoritesSpanner extends FavoritesStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_FAVORITES] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (FavoritesSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_FAVORITES, schema: TABLE_SCHEMAS[TABLE_FAVORITES] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n // Supports deleteFavoritesForEntity / counting by entity, and the\n // entity-scoped lookups used by the agents/skills favorited-first JOIN.\n name: 'mastra_favorites_entity_idx',\n table: TABLE_FAVORITES,\n columns: ['entityType', 'entityId'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /**\n * Reads the current `favoriteCount` for the parent entity inside `tx`.\n * Returns `null` when the entity row does not exist.\n */\n private async readEntityCount(tx: Transaction, entityTable: TABLE_NAMES, entityId: string): Promise<number | null> {\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('favoriteCount', 'column name')} AS count\n FROM ${quoteIdent(entityTable, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id LIMIT 1`,\n params: { id: entityId },\n json: true,\n });\n const row = (rows as Array<{ count: number | string | null }>)[0];\n if (!row) return null;\n return Number(row.count ?? 0);\n }\n\n async favorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n const { userId, entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n try {\n let favoriteCount = 0;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const existingCount = await this.readEntityCount(tx, entityTable, entityId);\n if (existingCount === null) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'FAVORITE', 'ENTITY_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Cannot favorite ${entityType} \"${entityId}\": entity does not exist`,\n details: { entityType, entityId },\n });\n }\n\n const [favRows] = await tx.run({\n sql: `SELECT 1 AS found FROM ${quoteIdent(TABLE_FAVORITES, 'table name')}\n WHERE ${quoteIdent('userId', 'column name')} = @userId\n AND ${quoteIdent('entityType', 'column name')} = @entityType\n AND ${quoteIdent('entityId', 'column name')} = @entityId LIMIT 1`,\n params: { userId, entityType, entityId },\n json: true,\n });\n\n if ((favRows as unknown[]).length === 0) {\n await this.db.insert({\n tableName: TABLE_FAVORITES,\n record: { userId, entityType, entityId, createdAt: new Date() },\n transaction: tx,\n });\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(entityTable, 'table name')}\n SET ${quoteIdent('favoriteCount', 'column name')} = COALESCE(${quoteIdent('favoriteCount', 'column name')}, 0) + 1\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id: entityId },\n });\n }\n\n favoriteCount = (await this.readEntityCount(tx, entityTable, entityId)) ?? 0;\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return { favorited: true, favoriteCount };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'FAVORITE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async unfavorite(input: StorageFavoriteKey): Promise<FavoriteToggleResult> {\n const { userId, entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n try {\n let favoriteCount = 0;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const existingCount = await this.readEntityCount(tx, entityTable, entityId);\n if (existingCount === null) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UNFAVORITE', 'ENTITY_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Cannot unfavorite ${entityType} \"${entityId}\": entity does not exist`,\n details: { entityType, entityId },\n });\n }\n\n const [deleted] = await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_FAVORITES, 'table name')}\n WHERE ${quoteIdent('userId', 'column name')} = @userId\n AND ${quoteIdent('entityType', 'column name')} = @entityType\n AND ${quoteIdent('entityId', 'column name')} = @entityId`,\n params: { userId, entityType, entityId },\n });\n\n if (Number(deleted ?? 0) > 0) {\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(entityTable, 'table name')}\n SET ${quoteIdent('favoriteCount', 'column name')} = GREATEST(COALESCE(${quoteIdent('favoriteCount', 'column name')}, 0) - 1, 0)\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id: entityId },\n });\n }\n\n favoriteCount = (await this.readEntityCount(tx, entityTable, entityId)) ?? 0;\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return { favorited: false, favoriteCount };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UNFAVORITE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async isFavorited(input: StorageFavoriteKey): Promise<boolean> {\n const { userId, entityType, entityId } = input;\n try {\n const [rows] = await this.database.run({\n sql: `SELECT 1 AS found FROM ${quoteIdent(TABLE_FAVORITES, 'table name')}\n WHERE ${quoteIdent('userId', 'column name')} = @userId\n AND ${quoteIdent('entityType', 'column name')} = @entityType\n AND ${quoteIdent('entityId', 'column name')} = @entityId LIMIT 1`,\n params: { userId, entityType, entityId },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'IS_FAVORITED', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async isFavoritedBatch(input: StorageIsFavoritedBatchInput): Promise<Set<string>> {\n const { userId, entityType, entityIds } = input;\n if (entityIds.length === 0) return new Set();\n try {\n const params: Record<string, any> = { userId, entityType };\n const placeholders = entityIds.map((id, i) => {\n const param = `e${i}`;\n params[param] = id;\n return `@${param}`;\n });\n const [rows] = await this.database.run({\n sql: `SELECT ${quoteIdent('entityId', 'column name')} AS entityId\n FROM ${quoteIdent(TABLE_FAVORITES, 'table name')}\n WHERE ${quoteIdent('userId', 'column name')} = @userId\n AND ${quoteIdent('entityType', 'column name')} = @entityType\n AND ${quoteIdent('entityId', 'column name')} IN (${placeholders.join(', ')})`,\n params,\n json: true,\n });\n return new Set((rows as Array<{ entityId: string }>).map(r => r.entityId));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'IS_FAVORITED_BATCH', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType },\n },\n error,\n );\n }\n }\n\n async listFavoritedIds(input: StorageListFavoritesInput): Promise<string[]> {\n const { userId, entityType } = input;\n try {\n const [rows] = await this.database.run({\n sql: `SELECT ${quoteIdent('entityId', 'column name')} AS entityId\n FROM ${quoteIdent(TABLE_FAVORITES, 'table name')}\n WHERE ${quoteIdent('userId', 'column name')} = @userId\n AND ${quoteIdent('entityType', 'column name')} = @entityType\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, ${quoteIdent('entityId', 'column name')} ASC`,\n params: { userId, entityType },\n json: true,\n });\n return (rows as Array<{ entityId: string }>).map(r => r.entityId);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_FAVORITED_IDS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType },\n },\n error,\n );\n }\n }\n\n async deleteFavoritesForEntity(input: StorageDeleteFavoritesForEntityInput): Promise<number> {\n const { entityType, entityId } = input;\n const entityTable = ENTITY_TABLE[entityType];\n try {\n let removed = 0;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [count] = await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_FAVORITES, 'table name')}\n WHERE ${quoteIdent('entityType', 'column name')} = @entityType\n AND ${quoteIdent('entityId', 'column name')} = @entityId`,\n params: { entityType, entityId },\n });\n removed = Number(count ?? 0);\n // Reset the denormalized counter; no-ops when the entity row is gone.\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(entityTable, 'table name')}\n SET ${quoteIdent('favoriteCount', 'column name')} = 0\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id: entityId },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return removed;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_FAVORITES_FOR_ENTITY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityType, entityId },\n },\n error,\n );\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_FAVORITES });\n // Reset denormalized counters on parent entities. These tables may not exist\n // when favorites is used standalone, so failures are swallowed.\n for (const table of [TABLE_AGENTS, TABLE_SKILLS]) {\n try {\n await this.db.runDml({\n sql: `UPDATE ${quoteIdent(table, 'table name')}\n SET ${quoteIdent('favoriteCount', 'column name')} = 0\n WHERE ${quoteIdent('favoriteCount', 'column name')} > 0`,\n });\n } catch {\n // Parent table absent in standalone favorites usage — nothing to reset.\n }\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n MCPClientsStorage,\n MCP_CLIENTS_SCHEMA,\n MCP_CLIENT_VERSIONS_SCHEMA,\n normalizePerPage,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageMCPClientType,\n StorageCreateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n StorageUpdateMCPClientInput,\n} from '@mastra/core/storage';\nimport type {\n CreateMCPClientVersionInput,\n ListMCPClientVersionsInput,\n ListMCPClientVersionsOutput,\n MCPClientVersion,\n} from '@mastra/core/storage/domains/mcp-clients';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for MCP-client definitions and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/prompt-blocks.\n */\nexport class MCPClientsSpanner extends MCPClientsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (MCPClientsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the MCP-client tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_MCP_CLIENTS, schema: MCP_CLIENTS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_MCP_CLIENT_VERSIONS, schema: MCP_CLIENT_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENTS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('mcpClientId', 'column name')}\n FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpClientId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft MCP clients:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_mcp_clients_status_createdat_idx',\n table: TABLE_MCP_CLIENTS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_mcp_clients_authorid_idx',\n table: TABLE_MCP_CLIENTS,\n columns: ['authorId'],\n },\n // Unique index on (mcpClientId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_mcp_client_versions_unique_idx',\n table: TABLE_MCP_CLIENT_VERSIONS,\n columns: ['mcpClientId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_MCP_CLIENT_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_MCP_CLIENTS });\n }\n\n /** Decodes a raw Spanner thin-row into the public MCP-client shape. */\n private parseClientRow(row: Record<string, any>): StorageMCPClientType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MCP_CLIENTS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): MCPClientVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n mcpClientId: transformed.mcpClientId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n servers: transformed.servers ?? {},\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin MCP-client record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENTS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseClientRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n const { mcpClient } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = mcpClient;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Wrap the thin-record insert and the seed-version insert in a single\n // Spanner read-write transaction so they commit or roll back together,\n // making orphaned drafts impossible. runWithAbortRetry handles the\n // ABORTED retry loop; the inner block must be idempotent.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_MCP_CLIENTS,\n record: {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpClient.authorId ?? null,\n metadata: mcpClient.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n record: {\n id: versionId,\n mcpClientId: mcpClient.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n servers: (snapshot as any).servers ?? {},\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(mcpClient.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_CLIENT', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP client ${mcpClient.id} not found after creation`,\n details: { mcpClientId: mcpClient.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: mcpClient.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_CLIENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP client ${id} not found`,\n details: { mcpClientId: id },\n });\n }\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_MCP_CLIENTS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_CLIENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP client ${id} not found after update`,\n details: { mcpClientId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: id },\n },\n error,\n );\n }\n }\n\n /** Removes an MCP client and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENTS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_CLIENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing; defaults to `status='published'` so drafts never leak. */\n async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\n // Default to status='published' so list() never leaks drafts to callers\n // that omit the filter.\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENTS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_MCP_CLIENTS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENTS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { mcpClients: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const mcpClients = (rows as Array<Record<string, any>>).map(r => this.parseClientRow(r));\n return {\n mcpClients,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing MCP client. */\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n record: {\n id: input.id,\n mcpClientId: input.mcpClientId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n servers: input.servers ?? {},\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as MCPClientVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, mcpClientId: input.mcpClientId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<MCPClientVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(mcpClientId, versionNumber)`. */\n async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { mcpClientId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for an MCP client. */\n async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { mcpClientId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_CLIENT_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single MCP client. */\n async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENT_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { mcpClientId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given MCP client. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_CLIENT_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given MCP client. */\n async countVersions(mcpClientId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_MCP_CLIENT_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpClientId', 'column name')} = @mcpClientId`,\n params: { mcpClientId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_MCP_CLIENT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n MCPServersStorage,\n MCP_SERVERS_SCHEMA,\n MCP_SERVER_VERSIONS_SCHEMA,\n normalizePerPage,\n TABLE_MCP_SERVERS,\n TABLE_MCP_SERVER_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageMCPServerType,\n StorageCreateMCPServerInput,\n StorageListMCPServersInput,\n StorageListMCPServersOutput,\n StorageUpdateMCPServerInput,\n} from '@mastra/core/storage';\nimport type {\n CreateMCPServerVersionInput,\n ListMCPServerVersionsInput,\n ListMCPServerVersionsOutput,\n MCPServerVersion,\n} from '@mastra/core/storage/domains/mcp-servers';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for MCP-server definitions and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/prompt-blocks.\n */\nexport class MCPServersSpanner extends MCPServersStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (MCPServersSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the MCP-server tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_MCP_SERVERS, schema: MCP_SERVERS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_MCP_SERVER_VERSIONS, schema: MCP_SERVER_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVERS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('mcpServerId', 'column name')}\n FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpServerId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft MCP servers:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_mcp_servers_status_createdat_idx',\n table: TABLE_MCP_SERVERS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_mcp_servers_authorid_idx',\n table: TABLE_MCP_SERVERS,\n columns: ['authorId'],\n },\n // Unique index on (mcpServerId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_mcp_server_versions_unique_idx',\n table: TABLE_MCP_SERVER_VERSIONS,\n columns: ['mcpServerId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_MCP_SERVER_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_MCP_SERVERS });\n }\n\n /** Decodes a raw Spanner thin-row into the public MCP-server shape. */\n private parseServerRow(row: Record<string, any>): StorageMCPServerType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MCP_SERVERS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): MCPServerVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n mcpServerId: transformed.mcpServerId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n version: transformed.version,\n description: transformed.description ?? undefined,\n instructions: transformed.instructions ?? undefined,\n repository: transformed.repository ?? undefined,\n releaseDate: transformed.releaseDate ?? undefined,\n isLatest: transformed.isLatest ?? undefined,\n packageCanonical: transformed.packageCanonical ?? undefined,\n tools: transformed.tools ?? undefined,\n agents: transformed.agents ?? undefined,\n workflows: transformed.workflows ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin MCP-server record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageMCPServerType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVERS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseServerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { mcpServer: StorageCreateMCPServerInput }): Promise<StorageMCPServerType> {\n const { mcpServer } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = mcpServer;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_MCP_SERVERS,\n record: {\n id: mcpServer.id,\n status: 'draft',\n activeVersionId: null,\n authorId: mcpServer.authorId ?? null,\n metadata: mcpServer.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n record: {\n id: versionId,\n mcpServerId: mcpServer.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n version: (snapshot as any).version,\n description: (snapshot as any).description ?? null,\n instructions: (snapshot as any).instructions ?? null,\n repository: (snapshot as any).repository ?? null,\n releaseDate: (snapshot as any).releaseDate ?? null,\n isLatest: (snapshot as any).isLatest ?? null,\n packageCanonical: (snapshot as any).packageCanonical ?? null,\n tools: (snapshot as any).tools ?? null,\n agents: (snapshot as any).agents ?? null,\n workflows: (snapshot as any).workflows ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(mcpServer.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_SERVER', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP server ${mcpServer.id} not found after creation`,\n details: { mcpServerId: mcpServer.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: mcpServer.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdateMCPServerInput): Promise<StorageMCPServerType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_SERVER', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `MCP server ${id} not found`,\n details: { mcpServerId: id },\n });\n }\n\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_MCP_SERVERS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_SERVER', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `MCP server ${id} not found after update`,\n details: { mcpServerId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: id },\n },\n error,\n );\n }\n }\n\n /** Removes an MCP server and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVERS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_SERVER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing; defaults to `status='published'` so drafts never leak. */\n async list(args?: StorageListMCPServersInput): Promise<StorageListMCPServersOutput> {\n // Default to status='published' so list() never leaks drafts/archived\n // to callers that omit the filter.\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVERS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_MCP_SERVERS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVERS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { mcpServers: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const mcpServers = (rows as Array<Record<string, any>>).map(r => this.parseServerRow(r));\n return {\n mcpServers,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing MCP server. */\n async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_MCP_SERVER_VERSIONS,\n record: {\n id: input.id,\n mcpServerId: input.mcpServerId,\n versionNumber: input.versionNumber,\n name: input.name,\n version: input.version,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n repository: input.repository ?? null,\n releaseDate: input.releaseDate ?? null,\n isLatest: input.isLatest ?? null,\n packageCanonical: input.packageCanonical ?? null,\n tools: input.tools ?? null,\n agents: input.agents ?? null,\n workflows: input.workflows ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as MCPServerVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, mcpServerId: input.mcpServerId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<MCPServerVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(mcpServerId, versionNumber)`. */\n async getVersionByNumber(mcpServerId: string, versionNumber: number): Promise<MCPServerVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { mcpServerId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for an MCP server. */\n async getLatestVersion(mcpServerId: string): Promise<MCPServerVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')}\n WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { mcpServerId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_MCP_SERVER_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single MCP server. */\n async listVersions(input: ListMCPServerVersionsInput): Promise<ListMCPServerVersionsOutput> {\n const { mcpServerId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVER_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { mcpServerId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_SERVER_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given MCP server. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MCP_SERVER_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given MCP server. */\n async countVersions(mcpServerId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_MCP_SERVER_VERSIONS, 'table name')} WHERE ${quoteIdent('mcpServerId', 'column name')} = @mcpServerId`,\n params: { mcpServerId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_MCP_SERVER_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpServerId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n createStorageErrorId,\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { buildDateRangeFilter, transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for memory primitives: threads, messages, and resources\n * (the durable state surface used by `@mastra/memory`).\n */\nexport class MemorySpanner extends MemoryStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (MemorySpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the threads/messages/resources tables and any indexes. */\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 await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_threads_resourceid_createdat_idx',\n table: TABLE_THREADS,\n columns: ['resourceId', 'createdAt DESC'],\n },\n {\n name: 'mastra_messages_thread_id_createdat_idx',\n table: TABLE_MESSAGES,\n columns: ['thread_id', 'createdAt DESC'],\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from threads/messages/resources tables. Intended for tests. */\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 /**\n * Fetches a thread row by id, or `null` when absent.\n *\n * When `resourceId` is supplied (including the empty string) it scopes the\n * lookup so callers can enforce multi-tenant isolation: a thread that\n * exists under a different resourceId is reported as missing rather than\n * leaking across tenants.\n */\n async getThreadById({\n threadId,\n resourceId,\n }: {\n threadId: string;\n resourceId?: string;\n }): Promise<StorageThreadType | null> {\n try {\n const params: Record<string, any> = { threadId };\n let where = `id = @threadId`;\n if (resourceId !== undefined) {\n where += ` AND ${quoteIdent('resourceId', 'column name')} = @resourceId`;\n params.resourceId = resourceId;\n }\n const [rows] = await this.database.run({\n sql: `SELECT id, ${quoteIdent('resourceId', 'column name')}, title, metadata, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${quoteIdent(TABLE_THREADS, 'table name')}\n WHERE ${where}`,\n params,\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return this.formatThreadRow(row);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n private formatThreadRow(row: Record<string, any>): StorageThreadType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_THREADS, row });\n return {\n id: transformed.id,\n resourceId: transformed.resourceId,\n title: transformed.title,\n metadata: transformed.metadata ?? {},\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Paginated thread listing with optional resourceId/metadata/date-range filters. */\n async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n try {\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_THREADS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: error instanceof Error ? error.message : 'Invalid pagination parameters',\n details: { page, ...(perPageInput !== undefined && { perPage: perPageInput }) },\n });\n }\n const perPage = normalizePerPage(perPageInput, 100);\n\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_THREADS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: error instanceof Error ? error.message : 'Invalid metadata key',\n details: { metadataKeys: filter?.metadata ? Object.keys(filter.metadata).join(', ') : '' },\n });\n }\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const { field, direction } = this.parseOrderBy(orderBy);\n\n try {\n const tableName = quoteIdent(TABLE_THREADS, 'table name');\n const whereClauses: string[] = [];\n const params: Record<string, any> = {};\n\n if (filter?.resourceId) {\n whereClauses.push(`${quoteIdent('resourceId', 'column name')} = @resourceId`);\n params.resourceId = filter.resourceId;\n }\n\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n let metadataIndex = 0;\n for (const [key, value] of Object.entries(filter.metadata)) {\n if (value !== null && typeof value === 'object') {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', '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, got ${Array.isArray(value) ? 'array' : 'object'}`,\n details: { key, valueType: Array.isArray(value) ? 'array' : 'object' },\n });\n }\n if (value === null) {\n whereClauses.push(`JSON_VALUE(metadata, '$.${key}') IS NULL`);\n } else {\n const paramName = `metadata${metadataIndex}`;\n whereClauses.push(`JSON_VALUE(metadata, '$.${key}') = @${paramName}`);\n if (typeof value === 'string') {\n params[paramName] = value;\n } else if (typeof value === 'boolean') {\n params[paramName] = value ? 'true' : 'false';\n } else {\n params[paramName] = String(value);\n }\n }\n metadataIndex++;\n }\n }\n\n const whereSql = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS total FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ total: number | string }>)[0]?.total ?? 0);\n if (total === 0) {\n return { threads: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const orderField = field === 'createdAt' ? 'createdAt' : 'updatedAt';\n const dir = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const limit = perPageInput === false ? total : perPage;\n const dataSql = `SELECT id, ${quoteIdent('resourceId', 'column name')}, title, metadata, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(orderField, 'column name')} ${dir}, id ${dir}\n LIMIT @limit OFFSET @offset`;\n const [rows] = await this.database.run({\n sql: dataSql,\n params: { ...params, limit, offset },\n json: true,\n });\n const threads = (rows as Array<Record<string, any>>).map(r => this.formatThreadRow(r));\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_THREADS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n ...(filter?.resourceId && { resourceId: filter.resourceId }),\n hasMetadataFilter: !!filter?.metadata,\n page,\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n /** Upserts a thread row by id (`INSERT OR UPDATE` semantics). */\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n await this.db.upsert({\n tableName: TABLE_THREADS,\n record: {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: thread.metadata ?? {},\n createdAt: thread.createdAt,\n updatedAt: thread.updatedAt,\n },\n });\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: thread.id },\n },\n error,\n );\n }\n }\n\n /** Updates a thread's title and merges the metadata payload. */\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 tableThreads = quoteIdent(TABLE_THREADS, 'table name');\n const now = new Date();\n let merged: Record<string, unknown> = {};\n let existingThread: StorageThreadType | null = null;\n try {\n // Read the row inside the transaction so it acquires a row lock; this\n // protects the metadata merge from a lost-update race against another\n // concurrent updateThread call.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT * FROM ${tableThreads} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_THREAD', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: { threadId: id, title },\n });\n }\n existingThread = this.formatThreadRow(row);\n merged = { ...(existingThread.metadata ?? {}), ...metadata };\n await this.db.update({\n tableName: TABLE_THREADS,\n keys: { id },\n data: {\n title,\n metadata: merged,\n updatedAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return {\n ...(existingThread as unknown as StorageThreadType),\n title,\n metadata: merged,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: id, title },\n },\n error,\n );\n }\n }\n\n /** Deletes a thread and all its messages atomically. */\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n const messagesTable = quoteIdent(TABLE_MESSAGES, 'table name');\n const threadsTable = quoteIdent(TABLE_THREADS, 'table name');\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${messagesTable} WHERE ${quoteIdent('thread_id', 'column name')} = @threadId`,\n params: { threadId },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${threadsTable} WHERE id = @threadId`,\n params: { threadId },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId },\n },\n error,\n );\n }\n }\n\n /** Parses raw message rows and converts them into the requested API format ('v1' or 'v2'). */\n private parseAndFormatMessages(messages: any[], format?: 'v1' | 'v2') {\n const parsed = messages.map(message => {\n if (typeof message.content === 'string') {\n try {\n return { ...message, content: JSON.parse(message.content) };\n } catch {\n return message;\n }\n }\n return message;\n });\n const list = new MessageList().add(parsed as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return format === 'v2' ? list.get.all.db() : list.get.all.v1();\n }\n\n /** Fetches a batch of messages by id; missing ids are silently dropped. */\n async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n try {\n const params: Record<string, any> = {};\n const placeholders = messageIds\n .map((id, i) => {\n const name = `id${i}`;\n params[name] = id;\n return `@${name}`;\n })\n .join(', ');\n const sql = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE id IN (${placeholders})\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, id DESC`;\n const [rows] = await this.database.run({ sql, params, json: true });\n const transformed = (rows as Array<Record<string, any>>).map(r =>\n transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: r }),\n );\n transformed.sort((a, b) => {\n const at = a.createdAt instanceof Date ? a.createdAt.getTime() : new Date(a.createdAt).getTime();\n const bt = b.createdAt instanceof Date ? b.createdAt.getTime() : new Date(b.createdAt).getTime();\n if (at !== bt) return at - bt;\n return String(a.id).localeCompare(String(b.id));\n });\n return { messages: this.parseAndFormatMessages(transformed, 'v2') as MastraDBMessage[] };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: JSON.stringify(messageIds) },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n return { messages: [] };\n }\n }\n\n /** Resolves the `include` clause: pinned messages plus their before/after windows. */\n private async getIncludedMessages({ include }: { include: StorageListMessagesInput['include'] }) {\n if (!include || include.length === 0) return null;\n\n const ids = include.map(i => i.id);\n const placeholders: string[] = [];\n const idParams: Record<string, any> = {};\n ids.forEach((id, i) => {\n const name = `tid${i}`;\n placeholders.push(`@${name}`);\n idParams[name] = id;\n });\n const targetsSql = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE id IN (${placeholders.join(', ')})`;\n const [targetRows] = await this.database.run({ sql: targetsSql, params: idParams, json: true });\n const targetsById = new Map<string, Record<string, any>>();\n for (const t of targetRows as Array<Record<string, any>>) targetsById.set(t.id as string, t);\n\n const allRows: Record<string, any>[] = [];\n const seen = new Set<string>();\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n const target = targetsById.get(id);\n if (!target) continue;\n\n const threadId = target.threadId as string;\n const targetCreatedAt =\n target.createdAt instanceof Date ? target.createdAt.toISOString() : (target.createdAt as string);\n\n if (!seen.has(target.id)) {\n seen.add(target.id);\n allRows.push(target);\n }\n\n if (withPreviousMessages > 0) {\n const [prev] = await this.database.run({\n sql: `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE ${quoteIdent('thread_id', 'column name')} = @threadId\n AND (${quoteIdent('createdAt', 'column name')} < @ts OR (${quoteIdent('createdAt', 'column name')} = @ts AND id < @id))\n ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, id DESC\n LIMIT @lim`,\n params: { threadId, ts: targetCreatedAt, id: target.id, lim: withPreviousMessages },\n json: true,\n });\n for (const row of (prev as Array<Record<string, any>>).reverse()) {\n if (!seen.has(row.id)) {\n seen.add(row.id);\n allRows.push(row);\n }\n }\n }\n\n if (withNextMessages > 0) {\n const [next] = await this.database.run({\n sql: `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE ${quoteIdent('thread_id', 'column name')} = @threadId\n AND (${quoteIdent('createdAt', 'column name')} > @ts OR (${quoteIdent('createdAt', 'column name')} = @ts AND id > @id))\n ORDER BY ${quoteIdent('createdAt', 'column name')} ASC, id ASC\n LIMIT @lim`,\n params: { threadId, ts: targetCreatedAt, id: target.id, lim: withNextMessages },\n json: true,\n });\n for (const row of next as Array<Record<string, any>>) {\n if (!seen.has(row.id)) {\n seen.add(row.id);\n allRows.push(row);\n }\n }\n }\n }\n\n return allRows.map(r => transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: r }));\n }\n\n /** Paginated message listing for a thread, with optional pinned-include and date-range filters. */\n async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n const threadIds = Array.isArray(threadId) ? threadId : [threadId];\n if (threadIds.length === 0 || threadIds.some(id => !id || !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', '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 // Reuse the base-class pagination contract (matches listThreads above).\n // It throws a clear Error which the outer try/catch wraps into a typed\n // MastraError below.\n this.validatePaginationInput(page, perPageInput ?? 40);\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderClause = `ORDER BY ${quoteIdent(field, 'column name')} ${direction}, id ${direction}`;\n const tableName = quoteIdent(TABLE_MESSAGES, 'table name');\n\n const filters: Record<string, any> = {\n thread_id: threadIds.length === 1 ? threadIds[0] : { $in: threadIds },\n ...(resourceId ? { resourceId } : {}),\n ...buildDateRangeFilter(filter?.dateRange, 'createdAt'),\n };\n const {\n sql: whereSql,\n params: whereParams,\n types: whereTypes,\n } = this.db.prepareWhereClause(filters, TABLE_MESSAGES);\n\n if (perPage === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // perPage=0 with includes: skip COUNT and base queries; only fetch the\n // included messages.\n if (perPage === 0 && include && include.length > 0) {\n const includeMessages = (await this.getIncludedMessages({ include })) ?? [];\n const parsedIncludes = this.parseAndFormatMessages(includeMessages, 'v2') as MastraDBMessage[];\n const dirMul = direction === 'ASC' ? 1 : -1;\n const sortedIncludes = parsedIncludes.sort((a, b) => {\n const aVal = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bVal = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n if (aVal == null || bVal == null) {\n return aVal == null && bVal == null ? a.id.localeCompare(b.id) : aVal == null ? 1 : -1;\n }\n const diff =\n (typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal))) * dirMul;\n return diff !== 0 ? diff : a.id.localeCompare(b.id) * dirMul;\n });\n return {\n messages: sortedIncludes,\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Total count\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS total FROM ${tableName}${whereSql}`,\n params: whereParams,\n types: whereTypes,\n json: true,\n });\n const total = Number((countRows as Array<{ total: number | string }>)[0]?.total ?? 0);\n\n // Paginated rows\n const baseRows: Record<string, any>[] = [];\n if (perPage > 0) {\n const baseQuery = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${tableName}${whereSql}\n ${orderClause}\n ${perPageInput === false ? '' : 'LIMIT @limit OFFSET @offset'}`;\n const dataParams: Record<string, any> = { ...whereParams };\n const dataTypes: Record<string, any> = { ...whereTypes };\n if (perPageInput !== false) {\n dataParams.limit = perPage;\n dataParams.offset = offset;\n }\n const [rows] = await this.database.run({\n sql: baseQuery,\n params: dataParams,\n types: dataTypes,\n json: true,\n });\n baseRows.push(...(rows as Array<Record<string, any>>));\n }\n\n const messages: Record<string, any>[] = baseRows.map(r =>\n transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: r }),\n );\n\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return { messages: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n // Includes\n if (include?.length) {\n const seen = new Set(messages.map(m => m.id));\n const includeMessages = await this.getIncludedMessages({ include });\n includeMessages?.forEach(msg => {\n if (!seen.has(msg.id)) {\n messages.push(msg);\n seen.add(msg.id);\n }\n });\n }\n\n const parsed = this.parseAndFormatMessages(messages, 'v2') as MastraDBMessage[];\n const mult = direction === 'ASC' ? 1 : -1;\n const finalMessages = parsed.sort((a, b) => {\n const aVal = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bVal = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n if (aVal == null || bVal == null) {\n return aVal == null && bVal == null ? a.id.localeCompare(b.id) : aVal == null ? 1 : -1;\n }\n const diff =\n (typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal))) * mult;\n if (diff !== 0) return diff;\n return a.id.localeCompare(b.id) * mult;\n });\n\n // Counting `include`d rows toward \"all returned\" is intentional: the\n // shared storage contract treats hasMore=false once the caller has the\n // entire thread in hand, regardless of whether the base page or the\n // include path delivered the trailing messages. The shared\n // `should respect pagination when using include` test pins this.\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n /** Upserts a batch of messages and bumps every touched thread's `updatedAt` in a single transaction. */\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n // Collect every distinct threadId touched by this batch and verify each\n // one exists. Previously only messages[0] was validated, so a batch\n // spanning multiple threads could insert orphaned messages and only bump\n // one parent's updatedAt.\n const threadIds = new Set<string>();\n for (const message of messages) {\n if (!message.threadId) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'SAVE_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: 'Thread ID is required for every message',\n details: { messageId: message.id ?? '' },\n });\n }\n threadIds.add(message.threadId);\n }\n const orderedThreadIds = Array.from(threadIds);\n const errorContext = orderedThreadIds.join(',');\n\n for (const tid of orderedThreadIds) {\n const thread = await this.getThreadById({ threadId: tid });\n if (!thread) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'SAVE_MESSAGES', 'THREAD_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Thread ${tid} not found`,\n details: { threadId: tid },\n });\n }\n }\n\n const tableMessages = quoteIdent(TABLE_MESSAGES, 'table name');\n const tableThreads = quoteIdent(TABLE_THREADS, 'table name');\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n for (const message of messages) {\n if (!message.resourceId) {\n throw new Error('Expected to find a resourceId for message');\n }\n const sql = `INSERT OR UPDATE INTO ${tableMessages} (id, ${quoteIdent('thread_id', 'column name')}, content, ${quoteIdent('createdAt', 'column name')}, role, type, ${quoteIdent('resourceId', 'column name')})\n VALUES (@id, @thread_id, @content, @createdAt, @role, @type, @resourceId)`;\n await tx.runUpdate({\n sql,\n params: {\n id: message.id,\n thread_id: message.threadId,\n content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n createdAt: message.createdAt instanceof Date ? message.createdAt.toISOString() : message.createdAt,\n role: message.role,\n type: message.type || 'v2',\n resourceId: message.resourceId,\n },\n });\n }\n // Bump updatedAt for every thread touched by this batch using a\n // single IN-list UPDATE (cheaper than per-thread round-trips and\n // keeps the change atomic with the message inserts).\n const updatedAt = new Date().toISOString();\n const inParams: Record<string, any> = { updatedAt };\n const placeholders = orderedThreadIds.map((tid, i) => {\n const name = `tid${i}`;\n inParams[name] = tid;\n return `@${name}`;\n });\n await tx.runUpdate({\n sql: `UPDATE ${tableThreads} SET ${quoteIdent('updatedAt', 'column name')} = @updatedAt WHERE id IN (${placeholders.join(', ')})`,\n params: inParams,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n const list = new MessageList().add(messages as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: errorContext },\n },\n error,\n );\n }\n }\n\n /** Merges partial updates onto existing messages and bumps affected thread `updatedAt`. */\n async updateMessages({\n messages,\n }: {\n messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {\n id: string;\n content?: {\n metadata?: MastraMessageContentV2['metadata'];\n content?: MastraMessageContentV2['content'];\n };\n })[];\n }): Promise<MastraDBMessage[]> {\n if (!messages || messages.length === 0) return [];\n const messageIds = messages.map(m => m.id);\n\n const params: Record<string, any> = {};\n const placeholders = messageIds\n .map((id, i) => {\n const name = `id${i}`;\n params[name] = id;\n return `@${name}`;\n })\n .join(', ');\n\n const selectSql = `SELECT id, content, role, type, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('thread_id', 'column name')} AS threadId, ${quoteIdent('resourceId', 'column name')}\n FROM ${quoteIdent(TABLE_MESSAGES, 'table name')}\n WHERE id IN (${placeholders})`;\n\n const payloadById = new Map<string, (typeof messages)[number]>();\n for (const m of messages) payloadById.set(m.id, m);\n\n const threadIdsToUpdate = new Set<string>();\n let anyExisting = false;\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n // Re-read existing rows on every retry. Doing this *outside* the\n // retry let an aborted transaction merge stale row state on the next\n // attempt, under contention that produces lost updates.\n const [existingRows] = await tx.run({ sql: selectSql, params, json: true });\n const existingMessages = (existingRows as Array<Record<string, any>>).map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // leave as-is\n }\n }\n return msg as MastraDBMessage;\n });\n if (existingMessages.length === 0) {\n await tx.commit();\n return;\n }\n anyExisting = true;\n for (const existing of existingMessages) {\n const updatePayload = payloadById.get(existing.id);\n if (!updatePayload) continue;\n const { id, ...fields } = updatePayload;\n if (Object.keys(fields).length === 0) continue;\n if (existing.threadId) threadIdsToUpdate.add(existing.threadId);\n if (updatePayload.threadId && updatePayload.threadId !== existing.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n const setClauses: string[] = [];\n const updateParams: Record<string, any> = { id };\n const columnMapping: Record<string, string> = { threadId: 'thread_id' };\n const updatable: Record<string, any> = { ...fields };\n if (updatable.content) {\n const newContent = {\n ...existing.content,\n ...updatable.content,\n ...(existing.content?.metadata && updatable.content.metadata\n ? { metadata: { ...existing.content.metadata, ...updatable.content.metadata } }\n : {}),\n };\n setClauses.push('content = @content');\n updateParams.content = JSON.stringify(newContent);\n delete updatable.content;\n }\n for (const key of Object.keys(updatable)) {\n const dbColumn = columnMapping[key] || key;\n setClauses.push(`${quoteIdent(dbColumn, 'column name')} = @${dbColumn}`);\n updateParams[dbColumn] = updatable[key];\n }\n if (setClauses.length === 0) continue;\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(TABLE_MESSAGES, 'table name')} SET ${setClauses.join(', ')} WHERE id = @id`,\n params: updateParams,\n });\n }\n if (threadIdsToUpdate.size > 0) {\n const threadParams: Record<string, any> = {};\n const inClauses = Array.from(threadIdsToUpdate).map((tid, i) => {\n const name = `tid${i}`;\n threadParams[name] = tid;\n return `@${name}`;\n });\n await tx.runUpdate({\n sql: `UPDATE ${quoteIdent(TABLE_THREADS, 'table name')} SET ${quoteIdent('updatedAt', 'column name')} = @updatedAt WHERE id IN (${inClauses.join(', ')})`,\n params: { ...threadParams, updatedAt: new Date().toISOString() },\n });\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n\n if (!anyExisting) return [];\n const [refetched] = await this.database.run({ sql: selectSql, params, json: true });\n return (refetched as Array<Record<string, any>>).map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // leave as-is\n }\n }\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_MESSAGES, row: msg });\n return transformed as MastraDBMessage;\n });\n }\n\n /** Deletes a batch of messages and bumps the affected threads' `updatedAt`. */\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) return;\n try {\n const messageTableName = quoteIdent(TABLE_MESSAGES, 'table name');\n const threadTableName = quoteIdent(TABLE_THREADS, 'table name');\n const params: Record<string, any> = {};\n const placeholders = messageIds\n .map((id, i) => {\n const name = `p${i}`;\n params[name] = id;\n return `@${name}`;\n })\n .join(', ');\n\n const [threadRows] = await this.database.run({\n sql: `SELECT DISTINCT ${quoteIdent('thread_id', 'column name')} AS thread_id FROM ${messageTableName} WHERE id IN (${placeholders})`,\n params,\n json: true,\n });\n const threadIds = (threadRows as Array<Record<string, any>>).map(r => r.thread_id).filter(Boolean) as string[];\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${messageTableName} WHERE id IN (${placeholders})`,\n params,\n });\n if (threadIds.length > 0) {\n for (const tid of threadIds) {\n await tx.runUpdate({\n sql: `UPDATE ${threadTableName} SET ${quoteIdent('updatedAt', 'column name')} = CURRENT_TIMESTAMP() WHERE id = @id`,\n params: { id: tid },\n });\n }\n }\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n /** Fetches a resource row by id, or `null` when absent. */\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT id, ${quoteIdent('workingMemory', 'column name')}, metadata, ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${quoteIdent(TABLE_RESOURCES, 'table name')}\n WHERE id = @id LIMIT 1`,\n params: { id: resourceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_RESOURCES, row });\n return {\n id: transformed.id,\n workingMemory: transformed.workingMemory,\n metadata: transformed.metadata,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n } as StorageResourceType;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_RESOURCE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n\n /** Upserts a resource row by id (`INSERT OR UPDATE` semantics). */\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n await this.db.upsert({\n tableName: TABLE_RESOURCES,\n record: {\n id: resource.id,\n workingMemory: resource.workingMemory ?? null,\n metadata: resource.metadata ?? {},\n createdAt: resource.createdAt,\n updatedAt: resource.updatedAt,\n },\n });\n return resource;\n }\n\n /** Updates a resource's `workingMemory` and merges its `metadata`. */\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 tableResources = quoteIdent(TABLE_RESOURCES, 'table name');\n const now = new Date();\n let updated: StorageResourceType | null = null;\n let createdNew = false;\n try {\n // Read the row inside the transaction so the metadata merge can't lose\n // updates from a concurrent updateResource call.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT * FROM ${tableResources} WHERE id = @id LIMIT 1`,\n params: { id: resourceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) {\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: now,\n updatedAt: now,\n };\n await this.db.upsert({\n tableName: TABLE_RESOURCES,\n record: {\n id: newResource.id,\n workingMemory: newResource.workingMemory ?? null,\n metadata: newResource.metadata ?? {},\n createdAt: newResource.createdAt,\n updatedAt: newResource.updatedAt,\n },\n transaction: tx,\n });\n updated = newResource;\n createdNew = true;\n await tx.commit();\n return;\n }\n\n const existing = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_RESOURCES,\n row,\n });\n const merged: StorageResourceType = {\n id: existing.id,\n workingMemory: workingMemory !== undefined ? workingMemory : existing.workingMemory,\n metadata: { ...(existing.metadata ?? {}), ...metadata },\n createdAt: existing.createdAt,\n updatedAt: now,\n };\n const data: Record<string, any> = { updatedAt: merged.updatedAt };\n if (workingMemory !== undefined) data.workingMemory = workingMemory;\n if (metadata) data.metadata = merged.metadata;\n await this.db.update({\n tableName: TABLE_RESOURCES,\n keys: { id: resourceId },\n data,\n transaction: tx,\n });\n updated = merged;\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n // `createdNew` is set inside the closure so subsequent reads in tests\n // don't rely on a stale row image.\n void createdNew;\n return updated as unknown as StorageResourceType;\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_RESOURCE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { resourceId },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException?.(mastraError);\n throw mastraError;\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { Spanner } from '@google-cloud/spanner';\nimport type { Database, Transaction } from '@google-cloud/spanner';\nimport type { ExecuteSqlRequest, TimestampBounds } from '@google-cloud/spanner/build/src/transaction';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, listMetricsArgsSchema, METRIC_DISTINCT_COLUMNS } from '@mastra/core/storage';\nimport type {\n AggregationInterval,\n AggregationType,\n BatchCreateMetricsArgs,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n ListMetricsArgs,\n ListMetricsResponse,\n MetricDistinctColumn,\n MetricRecord,\n} from '@mastra/core/storage';\nimport type { SpannerInitMode } from '../../db';\nimport { quoteIdent } from '../../db/utils';\n\n/** Physical table name. Not exposed by `@mastra/core/storage` (no TABLE_METRICS\n * constant exists), so the Spanner adapter owns the name itself. Follows the\n * same `mastra_ai_*` convention as `TABLE_SPANS = 'mastra_ai_spans'`. */\nexport const TABLE_AI_METRICS = 'mastra_ai_metrics';\n\n/**\n * Ordered column list for `INSERT INTO mastra_ai_metrics (...)`. The order\n * matches the DDL below so the batched insert can render value tuples without\n * having to dictionary-resolve each column.\n */\nconst METRIC_COLUMNS = [\n 'metricId',\n 'timestamp',\n 'name',\n 'value',\n 'traceId',\n 'spanId',\n 'experimentId',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'source',\n 'executionSource',\n 'serviceName',\n 'provider',\n 'model',\n 'estimatedCost',\n 'costUnit',\n 'tags',\n 'labels',\n 'costMetadata',\n 'metadata',\n 'scope',\n 'createdAt',\n] as const;\n\ntype MetricColumn = (typeof METRIC_COLUMNS)[number];\n\nconst JSON_COLUMNS = new Set<MetricColumn>(['tags', 'labels', 'costMetadata', 'metadata', 'scope']);\n\nconst TIMESTAMP_COLUMNS = new Set<MetricColumn>(['timestamp', 'createdAt']);\n\nconst NUMERIC_COLUMNS = new Set<MetricColumn>(['value', 'estimatedCost']);\n\n/** Plain SCALAR columns that are safe targets for groupBy / equality filters. */\nconst SCALAR_GROUPBY_COLUMNS = new Set<string>([\n 'name',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityVersionId',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'environment',\n 'source',\n 'executionSource',\n 'serviceName',\n 'provider',\n 'model',\n 'costUnit',\n 'traceId',\n 'spanId',\n 'experimentId',\n]);\n\nconst QUOTED_METRIC_COLUMNS_SQL = METRIC_COLUMNS.map(c => quoteIdent(c, 'column name')).join(', ');\n\n/** Build the CREATE TABLE statement for the metrics events table. */\nfunction buildCreateTableDdl(): string {\n const lines: string[] = [];\n for (const col of METRIC_COLUMNS) {\n let type: string;\n if (JSON_COLUMNS.has(col)) type = 'JSON';\n else if (TIMESTAMP_COLUMNS.has(col)) type = 'TIMESTAMP';\n else if (NUMERIC_COLUMNS.has(col)) type = 'FLOAT64';\n else type = 'STRING(MAX)';\n const nullable =\n col === 'metricId' || col === 'timestamp' || col === 'name' || col === 'value' || col === 'createdAt'\n ? ' NOT NULL'\n : '';\n lines.push(` ${quoteIdent(col, 'column name')} ${type}${nullable}`);\n }\n return `CREATE TABLE ${quoteIdent(TABLE_AI_METRICS, 'table name')} (\\n${lines.join(',\\n')}\\n) PRIMARY KEY (${quoteIdent(\n 'metricId',\n 'column name',\n )})`;\n}\n\nexport type MetricIndexDef = {\n name: string;\n columns: string[];\n /**\n * Non-key columns copied into the secondary index so common aggregate reads\n * can be index-only instead of joining back to the base metrics table.\n */\n storing?: string[];\n};\n\n/**\n * Default secondary indexes. Every analytical query starts with a name filter\n * and a timestamp range, so the leading composite index is `(name, timestamp DESC)`.\n *\n * Intentionally NOT here: a bare `(timestamp DESC)` index. A monotonically\n * increasing leading column funnels every new row through a single Spanner\n * split until the planner re-splits, capping per-region write throughput\n * regardless of node count. The `(name, ...)` and `(provider, model, ...)`\n * composites give the planner index access for the common queries while\n * smearing writes across many splits via the leading low-cardinality column.\n * Unfiltered \"latest metrics\" reads fall back to a full scan + sort, which\n * is acceptable because they're bounded by `perPage` and rarely on the\n * dashboard hot path.\n */\nexport function defaultMetricIndexDefs(): MetricIndexDef[] {\n return [\n {\n name: 'mastra_ai_metrics_name_ts_idx',\n columns: ['name', 'timestamp DESC'],\n storing: [\n 'value',\n 'estimatedCost',\n 'costUnit',\n 'provider',\n 'model',\n 'environment',\n 'serviceName',\n 'executionSource',\n 'entityType',\n 'entityName',\n ],\n },\n { name: 'mastra_ai_metrics_traceid_spanid_idx', columns: ['traceId', 'spanId'] },\n { name: 'mastra_ai_metrics_entitytype_entityname_idx', columns: ['entityType', 'entityName'] },\n { name: 'mastra_ai_metrics_orgid_userid_idx', columns: ['organizationId', 'userId'] },\n {\n name: 'mastra_ai_metrics_provider_model_ts_idx',\n columns: ['provider', 'model', 'timestamp DESC'],\n storing: ['name', 'value', 'estimatedCost', 'costUnit'],\n },\n { name: 'mastra_ai_metrics_environment_idx', columns: ['environment'] },\n { name: 'mastra_ai_metrics_service_name_idx', columns: ['serviceName'] },\n ];\n}\n\nfunction renderIndexColumns(columns: string[]): string {\n return columns\n .map(col => {\n if (col.endsWith(' DESC') || col.endsWith(' ASC')) {\n const i = col.lastIndexOf(' ');\n return `${quoteIdent(col.slice(0, i), 'column name')} ${col.slice(i + 1)}`;\n }\n return quoteIdent(col, 'column name');\n })\n .join(', ');\n}\n\nfunction normalizeIndexColumns(columns: string[]): string[] {\n return columns.map(col => (col.endsWith(' ASC') ? col.slice(0, -' ASC'.length) : col));\n}\n\nfunction sameStringSet(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const sortedA = [...a].sort();\n const sortedB = [...b].sort();\n return sortedA.every((value, index) => value === sortedB[index]);\n}\n\nfunction buildCreateIndexDdl(idx: MetricIndexDef): string {\n const cols = renderIndexColumns(idx.columns);\n const storing =\n idx.storing && idx.storing.length > 0\n ? ` STORING (${idx.storing.map(col => quoteIdent(col, 'column name')).join(', ')})`\n : '';\n return `CREATE INDEX ${quoteIdent(idx.name, 'index name')} ON ${quoteIdent(\n TABLE_AI_METRICS,\n 'table name',\n )} (${cols})${storing}`;\n}\n\nasync function tableExists(database: Database, tableName: string): Promise<boolean> {\n const [rows] = await database.run({\n sql: `SELECT 1 AS found FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '' AND TABLE_NAME = @tableName`,\n params: { tableName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n}\n\nasync function indexExists(database: Database, indexName: string): Promise<boolean> {\n const [rows] = await database.run({\n sql: `SELECT 1 AS found FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName`,\n params: { indexName },\n json: true,\n });\n return (rows as unknown[]).length > 0;\n}\n\nasync function validateMetricIndex(database: Database, expected: MetricIndexDef): Promise<void> {\n if (!(await indexExists(database, expected.name))) {\n throw validateError(\n 'METRICS_INDEX_CREATE',\n `Index ${expected.name} on ${TABLE_AI_METRICS} does not exist (initMode='validate' will not create it)`,\n { indexName: expected.name, tableName: TABLE_AI_METRICS },\n );\n }\n\n const [rows] = await database.run({\n sql: `SELECT COLUMN_NAME, COLUMN_ORDERING\n FROM INFORMATION_SCHEMA.INDEX_COLUMNS\n WHERE TABLE_SCHEMA = '' AND INDEX_NAME = @indexName\n ORDER BY ORDINAL_POSITION`,\n params: { indexName: expected.name },\n json: true,\n });\n\n const actualRows = rows as Array<{ COLUMN_NAME: string; COLUMN_ORDERING: string | null }>;\n const actualKeyColumns = actualRows\n .filter(row => row.COLUMN_ORDERING !== null)\n .map(\n row =>\n `${row.COLUMN_NAME}${row.COLUMN_ORDERING && row.COLUMN_ORDERING !== 'ASC' ? ` ${row.COLUMN_ORDERING}` : ''}`,\n );\n const expectedKeyColumns = normalizeIndexColumns(expected.columns);\n const keyColumnsMatch =\n actualKeyColumns.length === expectedKeyColumns.length &&\n actualKeyColumns.every((column, index) => column === expectedKeyColumns[index]);\n if (!keyColumnsMatch) {\n throw validateError(\n 'METRICS_INDEX_CREATE',\n `Index ${expected.name} column list mismatch (expected [${expectedKeyColumns.join(', ')}], actual [${actualKeyColumns.join(', ')}])`,\n {\n indexName: expected.name,\n tableName: TABLE_AI_METRICS,\n expectedColumns: expectedKeyColumns.join(','),\n actualColumns: actualKeyColumns.join(','),\n },\n );\n }\n\n const actualStoringColumns = actualRows.filter(row => row.COLUMN_ORDERING === null).map(row => row.COLUMN_NAME);\n const expectedStoringColumns = expected.storing ?? [];\n if (!sameStringSet(actualStoringColumns, expectedStoringColumns)) {\n throw validateError(\n 'METRICS_INDEX_CREATE',\n `Index ${expected.name} STORING column list mismatch (expected [${expectedStoringColumns.join(', ')}], actual [${actualStoringColumns.join(', ')}])`,\n {\n indexName: expected.name,\n tableName: TABLE_AI_METRICS,\n expectedStoringColumns: expectedStoringColumns.join(','),\n actualStoringColumns: actualStoringColumns.join(','),\n },\n );\n }\n}\n\nfunction validateError(action: string, message: string, details: Record<string, string>): MastraError {\n return new MastraError({\n id: createStorageErrorId('SPANNER', action, 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: message,\n details,\n });\n}\n\n/**\n * Create the metrics table + default indexes idempotently. Under\n * `initMode: 'validate'` the function issues no DDL and instead verifies that\n * the table and every default index already exist, throwing a typed user\n * error otherwise. Mirrors the contract `SpannerDB.createTable` exposes for\n * the core tables.\n */\nexport async function ensureMetricsTable(\n database: Database,\n options: { initMode: SpannerInitMode; skipDefaultIndexes?: boolean },\n): Promise<void> {\n const statements: string[] = [];\n\n const hasTable = await tableExists(database, TABLE_AI_METRICS);\n if (options.initMode === 'validate') {\n if (!hasTable) {\n throw validateError(\n 'METRICS_CREATE_TABLE',\n `Table ${TABLE_AI_METRICS} does not exist (initMode='validate' will not create it)`,\n { tableName: TABLE_AI_METRICS },\n );\n }\n if (!options.skipDefaultIndexes) {\n for (const idx of defaultMetricIndexDefs()) {\n await validateMetricIndex(database, idx);\n }\n }\n return;\n }\n\n if (!hasTable) {\n statements.push(buildCreateTableDdl());\n }\n if (!options.skipDefaultIndexes) {\n for (const idx of defaultMetricIndexDefs()) {\n if (await indexExists(database, idx.name)) continue;\n statements.push(buildCreateIndexDdl(idx));\n }\n }\n if (statements.length === 0) return;\n const [operation] = await database.updateSchema(statements);\n await operation.promise();\n}\n\nfunction decodeMetricRow(row: Record<string, unknown>): MetricRecord {\n const parseJson = (val: unknown): unknown => {\n if (val == null) return undefined;\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n return val;\n };\n const toDate = (val: unknown): Date | null => {\n if (val == null) return null;\n if (val instanceof Date) return new Date(val.getTime());\n if (typeof val === 'string') return new Date(val);\n if (typeof val === 'object' && typeof (val as { value?: unknown }).value === 'string') {\n return new Date((val as { value: string }).value);\n }\n return null;\n };\n return {\n metricId: (row.metricId as string) ?? null,\n timestamp: toDate(row.timestamp)!,\n name: row.name as string,\n value: Number(row.value),\n traceId: (row.traceId as string) ?? null,\n spanId: (row.spanId as string) ?? null,\n experimentId: (row.experimentId as string) ?? null,\n entityType: (row.entityType as MetricRecord['entityType']) ?? null,\n entityId: (row.entityId as string) ?? null,\n entityName: (row.entityName as string) ?? null,\n entityVersionId: (row.entityVersionId as string) ?? null,\n parentEntityVersionId: (row.parentEntityVersionId as string) ?? null,\n parentEntityType: (row.parentEntityType as MetricRecord['parentEntityType']) ?? null,\n parentEntityId: (row.parentEntityId as string) ?? null,\n parentEntityName: (row.parentEntityName as string) ?? null,\n rootEntityVersionId: (row.rootEntityVersionId as string) ?? null,\n rootEntityType: (row.rootEntityType as MetricRecord['rootEntityType']) ?? null,\n rootEntityId: (row.rootEntityId as string) ?? null,\n rootEntityName: (row.rootEntityName as string) ?? null,\n userId: (row.userId as string) ?? null,\n organizationId: (row.organizationId as string) ?? null,\n resourceId: (row.resourceId as string) ?? null,\n runId: (row.runId as string) ?? null,\n sessionId: (row.sessionId as string) ?? null,\n threadId: (row.threadId as string) ?? null,\n requestId: (row.requestId as string) ?? null,\n environment: (row.environment as string) ?? null,\n source: (row.source as string) ?? null,\n executionSource: (row.executionSource as string) ?? null,\n serviceName: (row.serviceName as string) ?? null,\n provider: (row.provider as string) ?? null,\n model: (row.model as string) ?? null,\n estimatedCost: row.estimatedCost === null || row.estimatedCost === undefined ? null : Number(row.estimatedCost),\n costUnit: (row.costUnit as string) ?? null,\n costMetadata: parseJson(row.costMetadata) as MetricRecord['costMetadata'],\n tags: parseJson(row.tags) as MetricRecord['tags'],\n labels: (parseJson(row.labels) as MetricRecord['labels']) ?? {},\n metadata: parseJson(row.metadata) as MetricRecord['metadata'],\n scope: parseJson(row.scope) as MetricRecord['scope'],\n } as MetricRecord;\n}\n\n/**\n * Validate a metric column or label key against an identifier-safe regex\n * before embedding it in raw SQL. Spanner accepts JSON_VALUE paths as string\n * parameters in some contexts, but we keep the path literal here so the\n * planner can fold the predicate and we get an easy-to-read query log.\n */\nfunction safeIdent(name: string, kind: string): string {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'METRICS_FILTER', 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid ${kind}: ${name}`,\n details: { [kind.replace(/\\s+/g, '')]: name },\n });\n }\n return name;\n}\n\nfunction resolveDistinctColumnSql(distinctColumn: MetricDistinctColumn | undefined): string {\n if (!distinctColumn) {\n throw new Error(`count_distinct aggregation requires a 'distinctColumn' argument`);\n }\n // Defense in depth: schema enum already restricts this, but the value lands\n // in raw SQL so re-check against the system allowlist.\n if (!(METRIC_DISTINCT_COLUMNS as readonly string[]).includes(distinctColumn)) {\n throw new Error(`Invalid distinctColumn: ${distinctColumn}`);\n }\n return quoteIdent(distinctColumn, 'column name');\n}\n\nfunction buildAggregationSql(\n aggregation: AggregationType,\n measure = 'value',\n distinctColumn?: MetricDistinctColumn,\n): string {\n switch (aggregation) {\n case 'sum':\n return `SUM(${measure})`;\n case 'avg':\n return `AVG(${measure})`;\n case 'min':\n return `MIN(${measure})`;\n case 'max':\n return `MAX(${measure})`;\n case 'count':\n return `CAST(COUNT(${measure}) AS FLOAT64)`;\n case 'count_distinct':\n // Use exact COUNT(DISTINCT) rather than APPROX_COUNT_DISTINCT for\n // portability: the latter exists in modern Spanner but isn't yet in\n // the local emulator. The cost difference only matters at very high\n // cardinality and the distinctColumn allowlist already excludes ID\n // columns that would blow up the distinct set.\n return `CAST(COUNT(DISTINCT ${resolveDistinctColumnSql(distinctColumn)}) AS FLOAT64)`;\n case 'last':\n // Spanner has no arg_max; ARRAY_AGG(value ORDER BY timestamp DESC LIMIT 1)\n // returns the most recent value per group in a single pass.\n return `(ARRAY_AGG(${measure} ORDER BY \\`timestamp\\` DESC LIMIT 1))[OFFSET(0)]`;\n default:\n return `SUM(${measure})`;\n }\n}\n\n/**\n * Cost aggregation matches what other adapters emit: SUM(estimatedCost) and a\n * shared costUnit if (and only if) all rows in the group carry the same unit.\n * Spanner has no FILTER clause; COUNT(DISTINCT col) ignores NULLs by default,\n * and so does MIN, so the IS-NOT-NULL guard isn't needed.\n */\nconst COST_SUMMARY_SELECT = `SUM(${quoteIdent('estimatedCost', 'column name')}) AS estimatedCost, CASE WHEN COUNT(DISTINCT ${quoteIdent('costUnit', 'column name')}) = 1 THEN MIN(${quoteIdent('costUnit', 'column name')}) ELSE NULL END AS costUnit`;\n\nfunction normalizeCostSummaryRow(row: Record<string, unknown>): {\n estimatedCost: number | null;\n costUnit: string | null;\n} {\n return {\n estimatedCost: row.estimatedCost == null ? null : Number(row.estimatedCost),\n costUnit: row.costUnit == null ? null : String(row.costUnit),\n };\n}\n\n/**\n * Bucket-by-time SQL. Spanner's `TIMESTAMP_TRUNC` only supports calendar parts\n * (MINUTE, HOUR, DAY, ...), so multi-minute buckets are emulated with a\n * `TIMESTAMP_SUB(MOD)` trick that snaps each row down to the nearest\n * 5/15-minute boundary.\n */\nfunction buildTimeBucketSql(interval: AggregationInterval, timestampCol = '`timestamp`'): string {\n switch (interval) {\n case '1m':\n return `TIMESTAMP_TRUNC(${timestampCol}, MINUTE)`;\n case '5m':\n return `TIMESTAMP_SUB(TIMESTAMP_TRUNC(${timestampCol}, MINUTE), INTERVAL MOD(EXTRACT(MINUTE FROM ${timestampCol}), 5) MINUTE)`;\n case '15m':\n return `TIMESTAMP_SUB(TIMESTAMP_TRUNC(${timestampCol}, MINUTE), INTERVAL MOD(EXTRACT(MINUTE FROM ${timestampCol}), 15) MINUTE)`;\n case '1h':\n return `TIMESTAMP_TRUNC(${timestampCol}, HOUR)`;\n case '1d':\n return `TIMESTAMP_TRUNC(${timestampCol}, DAY)`;\n default:\n return `TIMESTAMP_TRUNC(${timestampCol}, HOUR)`;\n }\n}\n\n/**\n * Resolve a groupBy entry: a scalar column hits the columns directly; anything\n * else is treated as a label key and routed through `JSON_VALUE(labels, ...)`.\n * Returns both the SELECT expression and the GROUP BY expression because some\n * backends can group by alias and some can't, Spanner cannot, so we re-emit\n * the full expression in GROUP BY.\n */\ntype ResolvedGroupBy = {\n key: string;\n selectSql: string;\n groupSql: string;\n /** Column name used to read this dimension back out of the row */\n resultKey: string;\n};\n\nfunction resolveGroupBy(groupBy: string[]): ResolvedGroupBy[] {\n return groupBy.map((key, index) => {\n if (SCALAR_GROUPBY_COLUMNS.has(key)) {\n const qcol = quoteIdent(key, 'column name');\n const alias = `gb_${index}`;\n return { key, selectSql: `${qcol} AS ${alias}`, groupSql: qcol, resultKey: alias };\n }\n // Treat as label key. Sanitize identifier first so we can interpolate.\n const labelKey = safeIdent(key, 'label key');\n const alias = `gb_${index}`;\n const expr = `JSON_VALUE(${quoteIdent('labels', 'column name')}, '$.${labelKey}')`;\n return { key, selectSql: `${expr} AS ${alias}`, groupSql: expr, resultKey: alias };\n });\n}\n\n/**\n * Build a parameterised WHERE clause for metric filters. Returns the SQL\n * fragment (or an empty string when there are no filters) plus the params /\n * types map ready to merge into a `database.run` call.\n *\n * The intent is to push filters into the storage layer for *every* shape the\n * public API supports: scalar fields, identifier IN lists, timestamp ranges,\n * tag containment, label equality — so the planner can prune partitions\n * before any aggregation runs.\n */\nfunction buildWhereClause(\n filters: Record<string, unknown> | undefined,\n startIndex = 0,\n): { clause: string; params: Record<string, unknown>; types: Record<string, string>; nextIndex: number } {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n const types: Record<string, string> = {};\n let i = startIndex;\n if (!filters) {\n return { clause: '', params, types, nextIndex: i };\n }\n\n const bindScalar = (col: string, value: unknown, op = '='): void => {\n const param = `f${i++}`;\n conditions.push(`${quoteIdent(col, 'column name')} ${op} @${param}`);\n if (value instanceof Date) {\n params[param] = value.toISOString();\n types[param] = 'timestamp';\n } else {\n params[param] = value;\n }\n };\n\n const bindIn = (col: string, values: readonly unknown[]): void => {\n if (values.length === 0) {\n conditions.push('1 = 0');\n return;\n }\n const placeholders: string[] = [];\n for (const v of values) {\n const param = `f${i++}`;\n placeholders.push(`@${param}`);\n params[param] = v;\n }\n conditions.push(`${quoteIdent(col, 'column name')} IN (${placeholders.join(', ')})`);\n };\n\n // Timestamp range\n const ts = filters.timestamp as\n | { start?: Date; end?: Date; startExclusive?: boolean; endExclusive?: boolean }\n | undefined;\n if (ts?.start) bindScalar('timestamp', ts.start, ts.startExclusive ? '>' : '>=');\n if (ts?.end) bindScalar('timestamp', ts.end, ts.endExclusive ? '<' : '<=');\n\n // Scalar filters mapped 1:1 to columns\n const scalarKeys = [\n 'traceId',\n 'spanId',\n 'entityType',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'userId',\n 'organizationId',\n 'experimentId',\n 'serviceName',\n 'environment',\n 'parentEntityType',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityName',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'executionSource',\n 'source',\n 'provider',\n 'model',\n 'costUnit',\n ] as const;\n for (const k of scalarKeys) {\n const v = filters[k];\n if (v !== undefined && v !== null) bindScalar(k, v);\n }\n\n // Metric name(s) — drives the leading composite index, so push it explicitly.\n if (Array.isArray(filters.name)) bindIn('name', filters.name as unknown[]);\n\n // Tags (array containment, AND of all requested tags).\n if (Array.isArray(filters.tags) && filters.tags.length > 0) {\n for (const tag of filters.tags as string[]) {\n const param = `f${i++}`;\n params[param] = String(tag);\n conditions.push(\n `EXISTS (SELECT 1 FROM UNNEST(JSON_QUERY_ARRAY(${quoteIdent('tags', 'column name')})) AS t WHERE JSON_VALUE(t) = @${param})`,\n );\n }\n }\n\n // Label equality (Record<string, string>). Sanitize keys before embedding.\n const labels = filters.labels as Record<string, string> | undefined;\n if (labels) {\n for (const [key, value] of Object.entries(labels)) {\n const labelKey = safeIdent(key, 'label key');\n const param = `f${i++}`;\n params[param] = String(value);\n conditions.push(`JSON_VALUE(${quoteIdent('labels', 'column name')}, '$.${labelKey}') = @${param}`);\n }\n }\n\n return {\n clause: conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '',\n params,\n types,\n nextIndex: i,\n };\n}\n\n/**\n * Compose name + arbitrary-filter where clauses into one merged clause. Used\n * by the OLAP paths that take a required metric name (or list) separately\n * from optional filters.\n */\nfunction combineWhere(\n nameValue: string | string[],\n filterClause: string,\n filterParams: Record<string, unknown>,\n filterTypes: Record<string, string>,\n nextIndex: number,\n): { clause: string; params: Record<string, unknown>; types: Record<string, string> } {\n const params: Record<string, unknown> = { ...filterParams };\n const types: Record<string, string> = { ...filterTypes };\n const conditions: string[] = [];\n\n if (Array.isArray(nameValue)) {\n if (nameValue.length === 0) {\n conditions.push('1 = 0');\n } else {\n const placeholders: string[] = [];\n let i = nextIndex;\n for (const n of nameValue) {\n const param = `n${i++}`;\n placeholders.push(`@${param}`);\n params[param] = n;\n }\n conditions.push(`${quoteIdent('name', 'column name')} IN (${placeholders.join(', ')})`);\n }\n } else {\n const param = `n${nextIndex}`;\n params[param] = nameValue;\n conditions.push(`${quoteIdent('name', 'column name')} = @${param}`);\n }\n\n if (filterClause) {\n // filterClause already starts with `WHERE `; strip it.\n conditions.push(filterClause.replace(/^WHERE\\s+/, ''));\n }\n\n return { clause: `WHERE ${conditions.join(' AND ')}`, params, types };\n}\n\n/**\n * Insert a batch of metric records as a single mutation.\n *\n * Uses the Spanner Mutations API (`tx.insert(table, rows)`) rather than DML\n * because metrics are append-heavy: a single mutation commits the whole batch\n * in one RPC, where the DML equivalent would round-trip per row. At dashboard\n * scales this is several × the throughput, and it also avoids the per-row\n * parameter-binding overhead.\n *\n * Encoding rules for mutations:\n * - JS `Date` instances are accepted directly for TIMESTAMP columns (the\n * client serializes via `.toJSON()`).\n * - Plain objects / arrays are accepted directly for JSON columns (the\n * client serializes with `JSON.stringify`); the server parses them\n * because the column schema is JSON.\n * - Whole-number JS numbers wrapped in `Spanner.float(n)` to force FLOAT64\n * encoding — without the wrapper the client serializes `100` as a string\n * and the server rejects it (same root cause as the DML path).\n * - `null` is passed through and respected per the column's nullability.\n */\nexport async function batchCreateMetrics(database: Database, args: BatchCreateMetricsArgs): Promise<void> {\n if (args.metrics.length === 0) return;\n\n const now = new Date();\n // Pre-stringify JSON payloads. The Spanner codec auto-stringifies plain\n // objects for JSON columns but treats arrays as protobuf `list_value`,\n // which the server rejects (\"Could not parse list_value ... as JSON\")\n // because JSON columns expect a JSON-encoded STRING on the wire. Doing\n // the JSON.stringify up-front sidesteps that fork.\n const encodeJson = (v: unknown): string | null => (v == null ? null : JSON.stringify(v));\n const rows = args.metrics.map(m => ({\n metricId: m.metricId ?? randomUUID(),\n timestamp: m.timestamp instanceof Date ? m.timestamp : new Date(m.timestamp as unknown as string | number),\n name: m.name,\n value: Spanner.float(Number(m.value)),\n traceId: m.traceId ?? null,\n spanId: m.spanId ?? null,\n experimentId: m.experimentId ?? null,\n entityType: m.entityType ?? null,\n entityId: m.entityId ?? null,\n entityName: m.entityName ?? null,\n entityVersionId: m.entityVersionId ?? null,\n parentEntityVersionId: m.parentEntityVersionId ?? null,\n parentEntityType: m.parentEntityType ?? null,\n parentEntityId: m.parentEntityId ?? null,\n parentEntityName: m.parentEntityName ?? null,\n rootEntityVersionId: m.rootEntityVersionId ?? null,\n rootEntityType: m.rootEntityType ?? null,\n rootEntityId: m.rootEntityId ?? null,\n rootEntityName: m.rootEntityName ?? null,\n userId: m.userId ?? null,\n organizationId: m.organizationId ?? null,\n resourceId: m.resourceId ?? null,\n runId: m.runId ?? null,\n sessionId: m.sessionId ?? null,\n threadId: m.threadId ?? null,\n requestId: m.requestId ?? null,\n environment: m.environment ?? null,\n source: m.source ?? null,\n executionSource: m.executionSource ?? null,\n serviceName: m.serviceName ?? null,\n provider: m.provider ?? null,\n model: m.model ?? null,\n estimatedCost: m.estimatedCost == null ? null : Spanner.float(Number(m.estimatedCost)),\n costUnit: m.costUnit ?? null,\n tags: encodeJson(m.tags),\n labels: encodeJson(m.labels ?? {}),\n costMetadata: encodeJson(m.costMetadata),\n metadata: encodeJson(m.metadata),\n scope: encodeJson(m.scope),\n createdAt: now,\n }));\n\n try {\n await runWithAbortRetry(async () => {\n await database.runTransactionAsync(async (tx: Transaction) => {\n try {\n tx.insert(TABLE_AI_METRICS, rows);\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n });\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_CREATE_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nasync function runWithAbortRetry<T>(fn: () => Promise<T>): Promise<T> {\n const maxAttempts = 5;\n let attempt = 0;\n let delay = 50;\n while (true) {\n try {\n return await fn();\n } catch (error: unknown) {\n attempt++;\n const aborted =\n !!error &&\n ((error as { code?: number }).code === 10 ||\n /ABORTED/i.test(String((error as { message?: unknown })?.message ?? '')));\n if (!aborted || attempt >= maxAttempts) throw error;\n await new Promise(resolve => setTimeout(resolve, delay + Math.random() * delay));\n delay *= 2;\n }\n }\n}\n\n/** Per-call read options accepted by every read function in this module. */\nexport type MetricsReadOptions = {\n /**\n * Maximum acceptable staleness in milliseconds for the read. When set to a\n * positive value, the query is issued as a single-use read-only transaction\n * with `maxStaleness`, which lets Spanner serve it from any replica that\n * already has data at least that fresh. The benefit is twofold:\n *\n * 1. Dashboard reads stop competing with leader-region writes for CPU.\n * 2. The planner can route the query to the closest replica, often\n * shaving 10-50ms off the round-trip vs. a strong read.\n *\n * For metrics specifically, observability dashboards routinely tolerate a\n * few seconds of staleness. `ObservabilitySpanner` defaults to 0 for\n * backwards-compatible strong reads, and callers can opt into bounded\n * staleness with `dashboardStalenessMs`. Note: maxStaleness is only valid\n * for single-use read-only transactions, which is what `database.run` issues.\n */\n stalenessMs?: number;\n};\n\n/**\n * Run a single-use read with optional bounded staleness. When `stalenessMs`\n * is positive we attach a `maxStaleness` TimestampBounds; otherwise we issue\n * a strong read against the leader.\n */\nasync function runQuery(\n database: Database,\n query: ExecuteSqlRequest,\n options?: MetricsReadOptions,\n): Promise<unknown[][]> {\n const staleness = options?.stalenessMs;\n if (typeof staleness === 'number' && staleness > 0) {\n const bounds: TimestampBounds = { maxStaleness: staleness };\n return (await database.run(query, bounds)) as unknown as unknown[][];\n }\n return (await database.run(query)) as unknown as unknown[][];\n}\n\n/** Paginated listing with the metric-records filter surface. */\nexport async function listMetrics(\n database: Database,\n args: ListMetricsArgs,\n options?: MetricsReadOptions,\n): Promise<ListMetricsResponse> {\n const { filters, pagination, orderBy } = listMetricsArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n const { clause, params, types } = buildWhereClause(filters as Record<string, unknown> | undefined);\n const orderField = orderBy?.field ?? 'timestamp';\n const orderDir = (orderBy?.direction ?? 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n\n try {\n const [countRows] = await runQuery(\n database,\n {\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${clause}`,\n params,\n types,\n json: true,\n },\n options,\n );\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return { pagination: { total: 0, page, perPage, hasMore: false }, metrics: [] };\n }\n\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${QUOTED_METRIC_COLUMNS_SQL} FROM ${tableName} ${clause} ORDER BY ${quoteIdent(\n orderField,\n 'column name',\n )} ${orderDir}, ${quoteIdent('metricId', 'column name')} ${orderDir} LIMIT @limit OFFSET @offset`,\n params: { ...params, limit: perPage, offset: page * perPage },\n types: { ...types, limit: 'int64', offset: 'int64' },\n json: true,\n },\n options,\n );\n\n return {\n pagination: { total, page, perPage, hasMore: (page + 1) * perPage < total },\n metrics: (rows as Array<Record<string, unknown>>).map(decodeMetricRow),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_METRICS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Single-value aggregate with optional period-over-period comparison. */\nexport async function getMetricAggregate(\n database: Database,\n args: GetMetricAggregateArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricAggregateResponse> {\n const aggSql = buildAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n\n try {\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause}`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n const row = (rows as Array<Record<string, unknown>>)[0] ?? {};\n const value = row.value == null ? null : Number(row.value);\n const cost = normalizeCostSummaryRow(row);\n\n // Period comparison piggybacks on the timestamp filter, without one\n // there's no anchor for the shifted window.\n const ts = args.filters?.timestamp;\n if (args.comparePeriod && ts?.start && ts.end) {\n const duration = ts.end.getTime() - ts.start.getTime();\n let prevStart: Date;\n let prevEnd: Date;\n switch (args.comparePeriod) {\n case 'previous_day':\n prevStart = new Date(ts.start.getTime() - 86_400_000);\n prevEnd = new Date(ts.end.getTime() - 86_400_000);\n break;\n case 'previous_week':\n prevStart = new Date(ts.start.getTime() - 604_800_000);\n prevEnd = new Date(ts.end.getTime() - 604_800_000);\n break;\n case 'previous_period':\n default:\n prevStart = new Date(ts.start.getTime() - duration);\n prevEnd = new Date(ts.end.getTime() - duration);\n break;\n }\n const prevFilters = {\n ...args.filters,\n timestamp: { start: prevStart, end: prevEnd, startExclusive: ts.startExclusive, endExclusive: ts.endExclusive },\n };\n const prevFilterResult = buildWhereClause(prevFilters as Record<string, unknown>);\n const prevCombined = combineWhere(\n args.name,\n prevFilterResult.clause,\n prevFilterResult.params,\n prevFilterResult.types,\n prevFilterResult.nextIndex,\n );\n const [prevRows] = await runQuery(\n database,\n {\n sql: `SELECT ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${prevCombined.clause}`,\n params: prevCombined.params,\n types: prevCombined.types,\n json: true,\n },\n options,\n );\n const prevRow = (prevRows as Array<Record<string, unknown>>)[0] ?? {};\n const previousValue = prevRow.value == null ? null : Number(prevRow.value);\n const prevCost = normalizeCostSummaryRow(prevRow);\n\n let changePercent: number | null = null;\n if (previousValue !== null && previousValue !== 0 && value !== null) {\n changePercent = ((value - previousValue) / Math.abs(previousValue)) * 100;\n }\n let costChangePercent: number | null = null;\n if (prevCost.estimatedCost !== null && prevCost.estimatedCost !== 0 && cost.estimatedCost !== null) {\n costChangePercent = ((cost.estimatedCost - prevCost.estimatedCost) / Math.abs(prevCost.estimatedCost)) * 100;\n }\n\n return {\n value,\n estimatedCost: cost.estimatedCost,\n costUnit: cost.costUnit,\n previousValue,\n previousEstimatedCost: prevCost.estimatedCost,\n changePercent,\n costChangePercent,\n };\n }\n\n return { value, estimatedCost: cost.estimatedCost, costUnit: cost.costUnit };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_AGGREGATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Breakdown by one or more dimensions (columns or label keys). */\nexport async function getMetricBreakdown(\n database: Database,\n args: GetMetricBreakdownArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricBreakdownResponse> {\n const aggSql = buildAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const selectGroupBy = resolvedGroupBy.map(g => g.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(g => g.groupSql).join(', ');\n const orderDir = (args.orderDirection ?? 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const limitClause = typeof args.limit === 'number' ? `LIMIT @limit` : '';\n const params = { ...combined.params } as Record<string, unknown>;\n const types = { ...combined.types } as Record<string, string>;\n if (typeof args.limit === 'number') {\n params.limit = args.limit;\n types.limit = 'int64';\n }\n\n try {\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${selectGroupBy}, ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause} GROUP BY ${groupByCols} ORDER BY value ${orderDir} ${limitClause}`,\n params,\n types,\n json: true,\n },\n options,\n );\n const groups = (rows as Array<Record<string, unknown>>).map(row => {\n const dimensions: Record<string, string | null> = {};\n for (const g of resolvedGroupBy) {\n const v = row[g.resultKey];\n dimensions[g.key] = v == null ? null : String(v);\n }\n const cost = normalizeCostSummaryRow(row);\n return {\n dimensions,\n value: Number(row.value ?? 0),\n estimatedCost: cost.estimatedCost,\n costUnit: cost.costUnit,\n };\n });\n return { groups };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_BREAKDOWN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Bucketed time-series, optionally split into multiple series by groupBy. */\nexport async function getMetricTimeSeries(\n database: Database,\n args: GetMetricTimeSeriesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricTimeSeriesResponse> {\n const aggSql = buildAggregationSql(args.aggregation, 'value', args.distinctColumn);\n const bucketSql = buildTimeBucketSql(args.interval);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n\n try {\n if (args.groupBy && args.groupBy.length > 0) {\n const resolvedGroupBy = resolveGroupBy(args.groupBy);\n const selectGroupBy = resolvedGroupBy.map(g => g.selectSql).join(', ');\n const groupByCols = resolvedGroupBy.map(g => g.groupSql).join(', ');\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${bucketSql} AS bucket, ${selectGroupBy}, ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause} GROUP BY bucket, ${groupByCols} ORDER BY bucket`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n\n const seriesMap = new Map<\n string,\n {\n name: string;\n costUnits: Set<string>;\n points: { timestamp: Date; value: number; estimatedCost: number | null }[];\n }\n >();\n for (const row of rows as Array<Record<string, unknown>>) {\n const dimValues = resolvedGroupBy.map(g => row[g.resultKey]);\n const seriesKey = JSON.stringify(dimValues);\n const seriesName = dimValues.map(v => (v == null ? '' : String(v))).join('|');\n const cost = normalizeCostSummaryRow(row);\n let entry = seriesMap.get(seriesKey);\n if (!entry) {\n entry = { name: seriesName, costUnits: new Set(), points: [] };\n seriesMap.set(seriesKey, entry);\n }\n if (cost.costUnit) entry.costUnits.add(cost.costUnit);\n entry.points.push({\n timestamp: coerceDate(row.bucket),\n value: Number(row.value ?? 0),\n estimatedCost: cost.estimatedCost,\n });\n }\n return {\n series: Array.from(seriesMap.values()).map(s => ({\n name: s.name,\n costUnit: s.costUnits.size === 1 ? Array.from(s.costUnits)[0]! : null,\n points: s.points,\n })),\n };\n }\n\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${bucketSql} AS bucket, ${aggSql} AS value, ${COST_SUMMARY_SELECT} FROM ${tableName} ${combined.clause} GROUP BY bucket ORDER BY bucket`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n const metricName = Array.isArray(args.name) ? args.name.join(',') : args.name;\n const allUnits = new Set<string>();\n const points = (rows as Array<Record<string, unknown>>).map(row => {\n const cost = normalizeCostSummaryRow(row);\n if (cost.costUnit) allUnits.add(cost.costUnit);\n return {\n timestamp: coerceDate(row.bucket),\n value: Number(row.value ?? 0),\n estimatedCost: cost.estimatedCost,\n };\n });\n return {\n series: [\n {\n name: metricName,\n costUnit: allUnits.size === 1 ? Array.from(allUnits)[0]! : null,\n points,\n },\n ],\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_TIME_SERIES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nfunction coerceDate(val: unknown): Date {\n if (val instanceof Date) return new Date(val.getTime());\n if (typeof val === 'string') return new Date(val);\n if (typeof val === 'object' && typeof (val as { value?: unknown }).value === 'string') {\n return new Date((val as { value: string }).value);\n }\n return new Date(String(val));\n}\n\n/**\n * Bucketed percentile series. Spanner GoogleSQL exposes `PERCENTILE_CONT`\n * only as an analytic (window) function, which neither the local emulator\n * nor older production releases support inside our query shape. Pulling raw\n * values one-by-one to compute percentiles in JS would round-trip per row.\n *\n * Instead we use `ARRAY_AGG(value ORDER BY value) GROUP BY bucket` to ship\n * one pre-sorted array per bucket, then interpolate every requested\n * percentile in JS. That's:\n * - one SQL query for any number of percentiles (vs. one-per-p with a\n * window function), so listing p50/p90/p95/p99 is the same cost as one;\n * - portable across every Spanner version because ARRAY_AGG is a core\n * aggregate (not an analytic function);\n * - exact (linear-interpolation form, matching `PERCENTILE_CONT`'s\n * definition) rather than HyperLogLog-approximate.\n *\n * The trade-off is that each bucket's array materializes server-side; for\n * pathological queries with millions of points per bucket the row could\n * exceed Spanner's 4MB row limit. Typical dashboard percentile queries\n * (single metric, recent window, modest cardinality) stay well under that.\n */\nexport async function getMetricPercentiles(\n database: Database,\n args: GetMetricPercentilesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricPercentilesResponse> {\n const bucketSql = buildTimeBucketSql(args.interval);\n const filterResult = buildWhereClause(args.filters as Record<string, unknown> | undefined);\n const combined = combineWhere(\n args.name,\n filterResult.clause,\n filterResult.params,\n filterResult.types,\n filterResult.nextIndex,\n );\n const tableName = quoteIdent(TABLE_AI_METRICS, 'table name');\n\n try {\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT ${bucketSql} AS bucket, ARRAY_AGG(${quoteIdent(\n 'value',\n 'column name',\n )} ORDER BY ${quoteIdent('value', 'column name')}) AS vals FROM ${tableName} ${combined.clause} GROUP BY bucket ORDER BY bucket`,\n params: combined.params,\n types: combined.types,\n json: true,\n },\n options,\n );\n\n const bucketArrays = (rows as Array<{ bucket: unknown; vals: unknown[] | null }>).map(row => ({\n timestamp: coerceDate(row.bucket),\n sorted: (row.vals ?? []).map(v => Number(v)).filter(v => Number.isFinite(v)),\n }));\n\n const series: GetMetricPercentilesResponse['series'] = args.percentiles.map(p => ({\n percentile: p,\n points: bucketArrays.map(({ timestamp, sorted }) => ({\n timestamp,\n value: interpolatePercentile(sorted, p),\n })),\n }));\n\n return { series };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_PERCENTILES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/**\n * Linear-interpolation percentile, matching SQL `PERCENTILE_CONT` semantics:\n * the rank is `p * (n - 1)`, and the value is the linear blend between the\n * two surrounding sorted values. Empty arrays return 0 to mirror the\n * `Number(row.pvalue ?? 0)` fallback the previous SQL form used.\n */\nfunction interpolatePercentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n if (sorted.length === 1) return sorted[0]!;\n const clamped = Math.max(0, Math.min(1, p));\n const rank = clamped * (sorted.length - 1);\n const lo = Math.floor(rank);\n const hi = Math.ceil(rank);\n if (lo === hi) return sorted[lo]!;\n const frac = rank - lo;\n return sorted[lo]! * (1 - frac) + sorted[hi]! * frac;\n}\n\n// =============================================================================\n// Discovery\n// =============================================================================\n\nexport async function getMetricNames(\n database: Database,\n args: GetMetricNamesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricNamesResponse> {\n const params: Record<string, unknown> = {};\n const conditions: string[] = [];\n if (args.prefix) {\n conditions.push(`STARTS_WITH(${quoteIdent('name', 'column name')}, @prefix)`);\n params.prefix = args.prefix;\n }\n let sql = `SELECT DISTINCT ${quoteIdent('name', 'column name')} AS name FROM ${quoteIdent(\n TABLE_AI_METRICS,\n 'table name',\n )}`;\n if (conditions.length > 0) sql += ` WHERE ${conditions.join(' AND ')}`;\n sql += ` ORDER BY name`;\n const types: Record<string, string> = {};\n if (typeof args.limit === 'number') {\n sql += ` LIMIT @limit`;\n params.limit = args.limit;\n types.limit = 'int64';\n }\n try {\n const [rows] = await runQuery(database, { sql, params, types, json: true }, options);\n return { names: (rows as Array<{ name: string }>).map(r => r.name) };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_NAMES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nexport async function getMetricLabelKeys(\n database: Database,\n args: GetMetricLabelKeysArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricLabelKeysResponse> {\n // Spanner's GoogleSQL JSON functions in the local emulator (and older\n // production releases) don't include JSON_KEYS, so we project the labels\n // JSON as a string and extract distinct top-level keys in the application\n // layer. The DISTINCT keeps the wire payload small even when many rows\n // share the same label schema.\n try {\n const [rows] = await runQuery(\n database,\n {\n sql: `SELECT DISTINCT TO_JSON_STRING(${quoteIdent('labels', 'column name')}) AS labels FROM ${quoteIdent(\n TABLE_AI_METRICS,\n 'table name',\n )} WHERE ${quoteIdent('name', 'column name')} = @metricName AND ${quoteIdent('labels', 'column name')} IS NOT NULL`,\n params: { metricName: args.metricName },\n json: true,\n },\n options,\n );\n const keys = new Set<string>();\n for (const row of rows as Array<{ labels: string | null }>) {\n if (!row.labels) continue;\n try {\n const parsed = JSON.parse(row.labels);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n for (const k of Object.keys(parsed)) keys.add(k);\n }\n } catch {\n // Malformed JSON shouldn't happen for a JSON-typed column, but if it\n // does we ignore the row rather than failing the whole discovery.\n }\n }\n return { keys: Array.from(keys).sort() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_LABEL_KEYS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\nexport async function getMetricLabelValues(\n database: Database,\n args: GetMetricLabelValuesArgs,\n options?: MetricsReadOptions,\n): Promise<GetMetricLabelValuesResponse> {\n // Sanitize labelKey before embedding in the JSON path. Limits exposure if\n // the validator upstream is ever bypassed.\n const labelKey = safeIdent(args.labelKey, 'label key');\n const path = `'$.${labelKey}'`;\n const params: Record<string, unknown> = { metricName: args.metricName };\n const conditions = [\n `${quoteIdent('name', 'column name')} = @metricName`,\n `JSON_VALUE(${quoteIdent('labels', 'column name')}, ${path}) IS NOT NULL`,\n ];\n if (args.prefix) {\n conditions.push(`STARTS_WITH(JSON_VALUE(${quoteIdent('labels', 'column name')}, ${path}), @prefix)`);\n params.prefix = args.prefix;\n }\n let sql = `SELECT DISTINCT JSON_VALUE(${quoteIdent(\n 'labels',\n 'column name',\n )}, ${path}) AS val FROM ${quoteIdent(TABLE_AI_METRICS, 'table name')} WHERE ${conditions.join(' AND ')} ORDER BY val`;\n const types: Record<string, string> = {};\n if (typeof args.limit === 'number') {\n sql += ` LIMIT @limit`;\n params.limit = args.limit;\n types.limit = 'int64';\n }\n try {\n const [rows] = await runQuery(database, { sql, params, types, json: true }, options);\n return { values: (rows as Array<{ val: string }>).map(r => r.val) };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_METRIC_LABEL_VALUES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n}\n\n/** Wipes every metric row. Intended for `dangerouslyClearAll()`. */\nexport async function clearMetrics(database: Database): Promise<void> {\n if (!(await tableExists(database, TABLE_AI_METRICS))) return;\n await database.runTransactionAsync(async (tx: Transaction) => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_AI_METRICS, 'table name')} WHERE TRUE`,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n });\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n TABLE_SCHEMAS,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n BatchCreateMetricsArgs,\n BatchCreateSpansArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n CreateIndexOptions,\n CreateSpanArgs,\n GetMetricAggregateArgs,\n GetMetricAggregateResponse,\n GetMetricBreakdownArgs,\n GetMetricBreakdownResponse,\n GetMetricLabelKeysArgs,\n GetMetricLabelKeysResponse,\n GetMetricLabelValuesArgs,\n GetMetricLabelValuesResponse,\n GetMetricNamesArgs,\n GetMetricNamesResponse,\n GetMetricPercentilesArgs,\n GetMetricPercentilesResponse,\n GetMetricTimeSeriesArgs,\n GetMetricTimeSeriesResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetSpanArgs,\n GetSpanResponse,\n GetTraceArgs,\n GetTraceLightResponse,\n GetTraceResponse,\n LightSpanRecord,\n ListMetricsArgs,\n ListMetricsResponse,\n ListTracesArgs,\n ListTracesResponse,\n SpanRecord,\n TracingStorageStrategy,\n UpdateSpanArgs,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig, SpannerInitMode } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\nimport * as metricsOps from './metrics';\nimport { TABLE_AI_METRICS } from './metrics';\n\nfunction invalidTraceFilterKey(kind: string, key: string): MastraError {\n return new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_TRACES', 'VALIDATE_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid ${kind} key: ${key}`,\n details: { [`${kind}Key`]: key },\n });\n}\n\n/**\n * Observability domain for Spanner. Stores AI tracing spans in `mastra_ai_spans`\n * and supports the trace read/write surface that powers the Mastra observability\n * UI: per-span CRUD, per-trace fetch, lightweight trace skeletons for the\n * waterfall view, and root-span pagination with the listTraces filters.\n */\nexport class ObservabilitySpanner extends ObservabilityStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n private readonly initMode: SpannerInitMode;\n /**\n * Bounded-staleness window (in ms) applied to every metrics read path.\n * Default 10000 (weak reads).\n */\n private readonly dashboardStalenessMs: number;\n /**\n * When true (the default), every metric method throws the base-class\n * `*_NOT_IMPLEMENTED` error and the metrics table is not created during\n * `init()`. See the option doc on `SpannerDomainDatabaseConfig` for the\n * full rationale.\n */\n private readonly disableMetrics: boolean;\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SPANS, TABLE_AI_METRICS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, dashboardStalenessMs, disableMetrics } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.initMode = initMode ?? 'sync';\n this.dashboardStalenessMs = dashboardStalenessMs ?? 10000;\n // Default to disabled: Spanner is not a good fit for the metrics\n // workload at scale. Set `disableMetrics: false` to opt in.\n this.disableMetrics = disableMetrics ?? true;\n this.indexes = indexes?.filter(idx =>\n (ObservabilitySpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /** Build the read-options object that every metrics read path threads through. */\n private readOptions(): metricsOps.MetricsReadOptions {\n return { stalenessMs: this.dashboardStalenessMs };\n }\n\n /**\n * Throw the same shape of NOT_IMPLEMENTED error the base class would when\n * a method isn't overridden\n */\n private metricsDisabledError(method: Uppercase<string>): MastraError {\n return new MastraError({\n id: `OBSERVABILITY_STORAGE_${method}_NOT_IMPLEMENTED` as Uppercase<string>,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Spanner metrics are disabled (set disableMetrics: false on the SpannerStore to opt in).`,\n });\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SPANS, schema: TABLE_SCHEMAS[TABLE_SPANS] });\n // `requestContext` was added after the initial schema shipped; backfill on\n // existing tables so older deployments keep working when they upgrade.\n await this.db.alterTable({\n tableName: TABLE_SPANS,\n schema: TABLE_SCHEMAS[TABLE_SPANS],\n ifNotExists: ['requestContext'],\n });\n if (!this.disableMetrics) {\n await metricsOps.ensureMetricsTable(this.database, {\n initMode: this.initMode,\n skipDefaultIndexes: this.skipDefaultIndexes,\n });\n }\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_ai_spans_traceid_startedat_idx',\n table: TABLE_SPANS,\n columns: ['traceId', 'startedAt DESC'],\n },\n {\n name: 'mastra_ai_spans_parentspanid_startedat_idx',\n table: TABLE_SPANS,\n columns: ['parentSpanId', 'startedAt DESC'],\n },\n {\n name: 'mastra_ai_spans_name_idx',\n table: TABLE_SPANS,\n columns: ['name'],\n },\n {\n name: 'mastra_ai_spans_spantype_startedat_idx',\n table: TABLE_SPANS,\n columns: ['spanType', 'startedAt DESC'],\n },\n {\n name: 'mastra_ai_spans_entitytype_entityid_idx',\n table: TABLE_SPANS,\n columns: ['entityType', 'entityId'],\n },\n {\n name: 'mastra_ai_spans_entitytype_entityname_idx',\n table: TABLE_SPANS,\n columns: ['entityType', 'entityName'],\n },\n {\n name: 'mastra_ai_spans_orgid_userid_idx',\n table: TABLE_SPANS,\n columns: ['organizationId', 'userId'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SPANS });\n // Only touch the metrics table when we actually own it.\n if (!this.disableMetrics) {\n await metricsOps.clearMetrics(this.database);\n }\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_SPANS,\n record: {\n ...span,\n createdAt: now,\n updatedAt: now,\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n name: span.name,\n },\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const now = new Date();\n const records = args.records.map(record => ({\n ...record,\n createdAt: now,\n updatedAt: now,\n }));\n await this.db.batchInsert({ tableName: TABLE_SPANS, records });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n await this.db.update({\n tableName: TABLE_SPANS,\n keys: { traceId, spanId },\n data: {\n ...updates,\n updatedAt: new Date(),\n },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { spanId, traceId },\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n const now = new Date();\n await this.db.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => ({\n keys: { traceId: record.traceId, spanId: record.spanId },\n data: { ...record.updates, updatedAt: now },\n })),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n AND ${quoteIdent('spanId', 'column name')} = @spanId LIMIT 1`,\n params: { traceId, spanId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return {\n span: transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n\n async getRootSpan(args: GetRootSpanArgs): Promise<GetRootSpanResponse | null> {\n const { traceId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n AND ${quoteIdent('parentSpanId', 'column name')} IS NULL LIMIT 1`,\n params: { traceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return {\n span: transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_ROOT_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTrace(args: GetTraceArgs): Promise<GetTraceResponse | null> {\n const { traceId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n ORDER BY ${quoteIdent('startedAt', 'column name')} ASC`,\n params: { traceId },\n json: true,\n });\n const spans = rows as Array<Record<string, any>>;\n if (spans.length === 0) return null;\n return {\n traceId,\n spans: spans.map(row => transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async getTraceLight(args: GetTraceArgs): Promise<GetTraceLightResponse | null> {\n const { traceId } = args;\n try {\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const [rows] = await this.database.run({\n sql: `SELECT ${quoteIdent('traceId', 'column name')}, ${quoteIdent('spanId', 'column name')},\n ${quoteIdent('parentSpanId', 'column name')}, ${quoteIdent('name', 'column name')},\n ${quoteIdent('entityType', 'column name')}, ${quoteIdent('entityId', 'column name')},\n ${quoteIdent('entityName', 'column name')},\n ${quoteIdent('spanType', 'column name')}, ${quoteIdent('error', 'column name')},\n ${quoteIdent('isEvent', 'column name')},\n ${quoteIdent('startedAt', 'column name')}, ${quoteIdent('endedAt', 'column name')},\n ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('updatedAt', 'column name')}\n FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} = @traceId\n ORDER BY ${quoteIdent('startedAt', 'column name')} ASC`,\n params: { traceId },\n json: true,\n });\n const spans = rows as Array<Record<string, any>>;\n if (spans.length === 0) return null;\n return {\n traceId,\n spans: spans.map(row => transformFromSpannerRow<LightSpanRecord>({ tableName: TABLE_SPANS, row })),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_TRACE_LIGHT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { traceId },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const page = pagination?.page ?? 0;\n const perPage = pagination?.perPage ?? 10;\n\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const rAlias = 'r';\n\n try {\n // Root-only filter. The aliased columns let the hasChildError EXISTS\n // subquery correlate without ambiguity.\n const conditions: string[] = [`${rAlias}.${quoteIdent('parentSpanId', 'column name')} IS NULL`];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n let pi = 0;\n const nextParam = () => `f${pi++}`;\n const bindScalar = (col: string, value: any, op = '='): void => {\n const param = nextParam();\n conditions.push(`${rAlias}.${quoteIdent(col, 'column name')} ${op} @${param}`);\n params[param] = value instanceof Date ? value.toISOString() : value;\n const colType = TABLE_SCHEMAS[TABLE_SPANS]?.[col]?.type;\n if (colType === 'timestamp') {\n types[param] = 'timestamp';\n }\n };\n\n if (filters) {\n if (filters.startedAt?.start) {\n bindScalar('startedAt', filters.startedAt.start, '>=');\n }\n if (filters.startedAt?.end) {\n bindScalar('startedAt', filters.startedAt.end, '<=');\n }\n if (filters.endedAt?.start) {\n bindScalar('endedAt', filters.endedAt.start, '>=');\n }\n if (filters.endedAt?.end) {\n bindScalar('endedAt', filters.endedAt.end, '<=');\n }\n\n if (filters.spanType !== undefined) bindScalar('spanType', filters.spanType);\n\n if (filters.entityType !== undefined) bindScalar('entityType', filters.entityType);\n if (filters.entityId !== undefined) bindScalar('entityId', filters.entityId);\n if (filters.entityName !== undefined) bindScalar('entityName', filters.entityName);\n\n if (filters.userId !== undefined) bindScalar('userId', filters.userId);\n if (filters.organizationId !== undefined) bindScalar('organizationId', filters.organizationId);\n if (filters.resourceId !== undefined) bindScalar('resourceId', filters.resourceId);\n\n if (filters.runId !== undefined) bindScalar('runId', filters.runId);\n if (filters.sessionId !== undefined) bindScalar('sessionId', filters.sessionId);\n if (filters.threadId !== undefined) bindScalar('threadId', filters.threadId);\n if (filters.requestId !== undefined) bindScalar('requestId', filters.requestId);\n\n if (filters.environment !== undefined) bindScalar('environment', filters.environment);\n if (filters.source !== undefined) bindScalar('source', filters.source);\n if (filters.serviceName !== undefined) bindScalar('serviceName', filters.serviceName);\n\n // Scope (JSON) is stored as a tagged record; filter each property\n // using JSON_VALUE so common one-shot lookups still hit the index.\n if (filters.scope != null) {\n for (const [key, value] of Object.entries(filters.scope as Record<string, unknown>)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) throw invalidTraceFilterKey('scope', key);\n const param = nextParam();\n conditions.push(`JSON_VALUE(${rAlias}.${quoteIdent('scope', 'column name')}, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Same approach for metadata: per-key JSON_VALUE equality. PG's\n // jsonb `@>` containment is faster for nested objects, but Spanner\n // has no native equivalent so we settle for top-level scalar match.\n if (filters.metadata != null) {\n for (const [key, value] of Object.entries(filters.metadata as Record<string, unknown>)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) throw invalidTraceFilterKey('metadata', key);\n const param = nextParam();\n conditions.push(`JSON_VALUE(${rAlias}.${quoteIdent('metadata', 'column name')}, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n // Tags are a JSON array; require every requested tag to appear in\n // the stored array. We unnest with JSON_QUERY_ARRAY per tag rather\n // than emitting a single contains expression because Spanner JSON\n // has no array-containment operator.\n if (filters.tags != null && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n const param = nextParam();\n conditions.push(\n `EXISTS (SELECT 1 FROM UNNEST(JSON_QUERY_ARRAY(${rAlias}.${quoteIdent('tags', 'column name')})) AS t WHERE JSON_VALUE(t) = @${param})`,\n );\n params[param] = typeof tag === 'string' ? tag : JSON.stringify(tag);\n }\n }\n\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n conditions.push(`${rAlias}.${quoteIdent('error', 'column name')} IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(\n `${rAlias}.${quoteIdent('endedAt', 'column name')} IS NULL AND ${rAlias}.${quoteIdent('error', 'column name')} IS NULL`,\n );\n break;\n case TraceStatus.SUCCESS:\n conditions.push(\n `${rAlias}.${quoteIdent('endedAt', 'column name')} IS NOT NULL AND ${rAlias}.${quoteIdent('error', 'column name')} IS NULL`,\n );\n break;\n }\n }\n\n if (filters.hasChildError !== undefined) {\n // Spanner correlated subqueries can reference outer columns via the\n // alias\n const existsClause = `EXISTS (SELECT 1 FROM ${tableName} c WHERE c.${quoteIdent('traceId', 'column name')} = ${rAlias}.${quoteIdent('traceId', 'column name')} AND c.${quoteIdent('error', 'column name')} IS NOT NULL)`;\n conditions.push(filters.hasChildError ? existsClause : `NOT ${existsClause}`);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const orderField = orderBy?.field ?? 'startedAt';\n const sortDirection = (orderBy?.direction ?? 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n // Emulate NULLS FIRST/LAST: Spanner has no syntax for it, so we put a\n // synthetic \"is null\" expression in front of the real ordering column.\n // For endedAt we want NULLS FIRST on DESC (running traces float to the\n // top when viewing newest) and NULLS LAST on ASC (running traces sink\n // to the bottom when viewing oldest). startedAt is NOT NULL so no\n // emulation is needed there.\n const nullsClause =\n orderField === 'endedAt'\n ? `(${rAlias}.${quoteIdent(orderField, 'column name')} IS NULL) ${sortDirection === 'DESC' ? 'DESC' : 'ASC'}, `\n : '';\n const orderSql = `ORDER BY ${nullsClause}${rAlias}.${quoteIdent(orderField, 'column name')} ${sortDirection}, ${rAlias}.${quoteIdent('spanId', 'column name')} ${sortDirection}`;\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${rAlias} ${whereSql}`,\n params,\n types,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n\n if (total === 0) {\n return {\n pagination: { total: 0, page, perPage, hasMore: false },\n spans: [],\n };\n }\n\n const [rows] = await this.database.run({\n sql: `SELECT ${rAlias}.* FROM ${tableName} ${rAlias} ${whereSql} ${orderSql} LIMIT @limit OFFSET @offset`,\n params: { ...params, limit: perPage, offset: page * perPage },\n types: { ...types, limit: 'int64', offset: 'int64' },\n json: true,\n });\n\n const spans = (rows as Array<Record<string, any>>).map(row =>\n transformFromSpannerRow<SpanRecord>({ tableName: TABLE_SPANS, row }),\n );\n\n return {\n pagination: {\n total,\n page,\n perPage,\n hasMore: (page + 1) * perPage < total,\n },\n spans: toTraceSpans(spans),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n if (args.traceIds.length === 0) return;\n const tableName = quoteIdent(TABLE_SPANS, 'table name');\n const params: Record<string, any> = {};\n const placeholders = args.traceIds.map((id, i) => {\n const name = `t${i}`;\n params[name] = id;\n return `@${name}`;\n });\n await this.db.runDml({\n sql: `DELETE FROM ${tableName} WHERE ${quoteIdent('traceId', 'column name')} IN (${placeholders.join(', ')})`,\n params,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n override async batchCreateMetrics(args: BatchCreateMetricsArgs): Promise<void> {\n if (this.disableMetrics) throw this.metricsDisabledError('BATCH_CREATE_METRICS');\n return metricsOps.batchCreateMetrics(this.database, args);\n }\n\n override async listMetrics(args: ListMetricsArgs): Promise<ListMetricsResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('LIST_METRICS');\n return metricsOps.listMetrics(this.database, args, this.readOptions());\n }\n\n override async getMetricAggregate(args: GetMetricAggregateArgs): Promise<GetMetricAggregateResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_AGGREGATE');\n return metricsOps.getMetricAggregate(this.database, args, this.readOptions());\n }\n\n override async getMetricBreakdown(args: GetMetricBreakdownArgs): Promise<GetMetricBreakdownResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_BREAKDOWN');\n return metricsOps.getMetricBreakdown(this.database, args, this.readOptions());\n }\n\n override async getMetricTimeSeries(args: GetMetricTimeSeriesArgs): Promise<GetMetricTimeSeriesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_TIME_SERIES');\n return metricsOps.getMetricTimeSeries(this.database, args, this.readOptions());\n }\n\n override async getMetricPercentiles(args: GetMetricPercentilesArgs): Promise<GetMetricPercentilesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_PERCENTILES');\n return metricsOps.getMetricPercentiles(this.database, args, this.readOptions());\n }\n\n override async getMetricNames(args: GetMetricNamesArgs): Promise<GetMetricNamesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_NAMES');\n return metricsOps.getMetricNames(this.database, args, this.readOptions());\n }\n\n override async getMetricLabelKeys(args: GetMetricLabelKeysArgs): Promise<GetMetricLabelKeysResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_LABEL_KEYS');\n return metricsOps.getMetricLabelKeys(this.database, args, this.readOptions());\n }\n\n override async getMetricLabelValues(args: GetMetricLabelValuesArgs): Promise<GetMetricLabelValuesResponse> {\n if (this.disableMetrics) throw this.metricsDisabledError('GET_METRIC_LABEL_VALUES');\n return metricsOps.getMetricLabelValues(this.database, args, this.readOptions());\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n PromptBlocksStorage,\n PROMPT_BLOCKS_SCHEMA,\n PROMPT_BLOCK_VERSIONS_SCHEMA,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n StorageUpdatePromptBlockInput,\n} from '@mastra/core/storage';\nimport type {\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n PromptBlockVersion,\n} from '@mastra/core/storage/domains/prompt-blocks';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for prompt blocks and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/scorer-definitions.\n */\nexport class PromptBlocksSpanner extends PromptBlocksStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx =>\n (PromptBlocksSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /** Creates the prompt-block tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: PROMPT_BLOCKS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS, schema: PROMPT_BLOCK_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Removes orphaned draft prompt-block records where the paired version row\n * was never written. Skipped under `initMode: 'validate'` (no destructive\n * DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCKS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('blockId', 'column name')}\n FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')}\n WHERE ${quoteIdent('blockId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft prompt blocks:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_prompt_blocks_status_createdat_idx',\n table: TABLE_PROMPT_BLOCKS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_prompt_blocks_authorid_idx',\n table: TABLE_PROMPT_BLOCKS,\n columns: ['authorId'],\n },\n // Unique index on (blockId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_prompt_block_versions_unique_idx',\n table: TABLE_PROMPT_BLOCK_VERSIONS,\n columns: ['blockId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_PROMPT_BLOCK_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_PROMPT_BLOCKS });\n }\n\n /** Decodes a raw Spanner thin-row into the public prompt-block shape. */\n private parsePromptBlockRow(row: Record<string, any>): StoragePromptBlockType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_PROMPT_BLOCKS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): PromptBlockVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n blockId: transformed.blockId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n content: transformed.content ?? '',\n rules: transformed.rules ?? undefined,\n requestContextSchema: transformed.requestContextSchema ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin prompt-block record by id, or `null` when absent. */\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCKS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parsePromptBlockRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = promptBlock;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Wrap the thin-record insert and the seed-version insert in a single\n // Spanner read-write transaction so they commit or roll back together,\n // making orphaned drafts impossible. runWithAbortRetry handles the\n // ABORTED retry loop; the inner block must be idempotent.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_PROMPT_BLOCKS,\n record: {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: null,\n authorId: promptBlock.authorId ?? null,\n metadata: promptBlock.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n record: {\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n content: (snapshot as any).content ?? '',\n rules: (snapshot as any).rules ?? null,\n requestContextSchema: (snapshot as any).requestContextSchema ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(promptBlock.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Prompt block ${promptBlock.id} not found after creation`,\n details: { blockId: promptBlock.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: promptBlock.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Prompt block ${id} not found`,\n details: { blockId: id },\n });\n }\n\n // Only thin-record fields land on the entity row; content updates create\n // a new version through the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_PROMPT_BLOCKS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_PROMPT_BLOCK', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Prompt block ${id} not found after update`,\n details: { blockId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: id },\n },\n error,\n );\n }\n }\n\n /** Removes a prompt block and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCKS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_PROMPT_BLOCK', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional status / authorId / metadata filters. */\n async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCKS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_PROMPT_BLOCKS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCKS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { promptBlocks: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const promptBlocks = (rows as Array<Record<string, any>>).map(r => this.parsePromptBlockRow(r));\n return {\n promptBlocks,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing prompt block. */\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n record: {\n id: input.id,\n blockId: input.blockId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n content: input.content ?? '',\n rules: input.rules ?? null,\n requestContextSchema: input.requestContextSchema ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as PromptBlockVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, blockId: input.blockId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<PromptBlockVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(blockId, versionNumber)`. */\n async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')}\n WHERE ${quoteIdent('blockId', 'column name')} = @blockId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { blockId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for a prompt block. */\n async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')}\n WHERE ${quoteIdent('blockId', 'column name')} = @blockId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { blockId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_PROMPT_BLOCK_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single prompt block. */\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCK_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('blockId', 'column name')} = @blockId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { blockId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given prompt block. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given prompt block. */\n async countVersions(blockId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_PROMPT_BLOCK_VERSIONS, 'table name')} WHERE ${quoteIdent('blockId', 'column name')} = @blockId`,\n params: { blockId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_PROMPT_BLOCK_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n SchedulesStorage,\n TABLE_SCHEDULES,\n TABLE_SCHEDULE_TRIGGERS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n Schedule,\n ScheduleFilter,\n ScheduleStatus,\n ScheduleTarget,\n ScheduleTrigger,\n ScheduleTriggerListOptions,\n ScheduleUpdate,\n} from '@mastra/core/storage';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction rowToSchedule(row: Record<string, any>): Schedule {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SCHEDULES, row });\n const target = transformed.target as ScheduleTarget | undefined;\n if (!target || typeof target !== 'object') {\n throw new Error(`Schedule row ${transformed.id} has invalid target`);\n }\n const schedule: Schedule = {\n id: String(transformed.id),\n target,\n cron: String(transformed.cron),\n status: String(transformed.status) as ScheduleStatus,\n nextFireAt: Number(transformed.next_fire_at),\n createdAt: Number(transformed.created_at),\n updatedAt: Number(transformed.updated_at),\n };\n if (transformed.timezone != null) schedule.timezone = String(transformed.timezone);\n if (transformed.last_fire_at != null) schedule.lastFireAt = Number(transformed.last_fire_at);\n if (transformed.last_run_id != null) schedule.lastRunId = String(transformed.last_run_id);\n if (transformed.metadata != null) schedule.metadata = transformed.metadata as Record<string, unknown>;\n if (transformed.owner_type != null) schedule.ownerType = String(transformed.owner_type) as Schedule['ownerType'];\n if (transformed.owner_id != null) schedule.ownerId = String(transformed.owner_id);\n return schedule;\n}\n\nfunction rowToTrigger(row: Record<string, any>): ScheduleTrigger {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SCHEDULE_TRIGGERS, row });\n const trigger: ScheduleTrigger = {\n id: transformed.id != null ? String(transformed.id) : undefined,\n scheduleId: String(transformed.schedule_id),\n runId: transformed.run_id != null ? String(transformed.run_id) : null,\n scheduledFireAt: Number(transformed.scheduled_fire_at),\n actualFireAt: Number(transformed.actual_fire_at),\n outcome: String(transformed.outcome) as ScheduleTrigger['outcome'],\n triggerKind:\n transformed.trigger_kind != null\n ? (String(transformed.trigger_kind) as ScheduleTrigger['triggerKind'])\n : 'schedule-fire',\n };\n if (transformed.error != null) trigger.error = String(transformed.error);\n if (transformed.parent_trigger_id != null) trigger.parentTriggerId = String(transformed.parent_trigger_id);\n if (transformed.metadata != null) trigger.metadata = transformed.metadata as Record<string, unknown>;\n return trigger;\n}\n\n/**\n * Spanner-backed storage for `WorkflowScheduler` schedules and trigger history.\n *\n * `mastra_schedule_triggers.id` is the table's only primary-key column\n * (matches `TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS]`). `schedule_id` is filtered\n * via a secondary index registered in {@link getDefaultIndexDefinitions}.\n */\nexport class SchedulesSpanner extends SchedulesStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (SchedulesSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SCHEDULES, schema: TABLE_SCHEMAS[TABLE_SCHEDULES] });\n await this.db.createTable({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS],\n });\n // Add the target_workflow_id generated column BEFORE indexes so its index\n // can be created in the same init pass.\n await this.ensureTargetWorkflowIdColumn();\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n // listDueSchedules: WHERE status = 'active' AND next_fire_at <= @now ORDER BY next_fire_at ASC\n name: 'mastra_schedules_status_nextfireat_idx',\n table: TABLE_SCHEDULES,\n columns: ['status', 'next_fire_at'],\n },\n {\n // listSchedules({ workflowId }): WHERE target_workflow_id = @id\n // Filters on the STORED generated column added by ensureTargetWorkflowIdColumn().\n // If the column wasn't created (legacy databases), createDefaultIndexes() filters\n // this entry out and listSchedules falls back to JSON_VALUE.\n name: 'mastra_schedules_targetworkflowid_idx',\n table: TABLE_SCHEDULES,\n columns: ['target_workflow_id'],\n },\n {\n // listTriggers: WHERE schedule_id = @id ORDER BY actual_fire_at DESC\n // Also supports DELETE FROM mastra_schedule_triggers WHERE schedule_id = @id\n // (the table's PK is id only, so schedule_id needs its own index).\n name: 'mastra_schedule_triggers_scheduleid_actualfireat_idx',\n table: TABLE_SCHEDULE_TRIGGERS,\n columns: ['schedule_id', 'actual_fire_at DESC'],\n },\n ];\n }\n\n /**\n * Creates the default indexes; no-op when `skipDefaultIndexes` was set.\n * Filters out the target_workflow_id index when that generated column is\n * absent (e.g. ensureTargetWorkflowIdColumn() failed, or `initMode: 'validate'`\n * skipped the DDL). Otherwise the createIndex call would fail on a missing\n * column.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n const hasTargetWorkflowId = await this.hasTargetWorkflowIdColumn();\n const indexes = this.getDefaultIndexDefinitions().filter(\n idx => hasTargetWorkflowId || !idx.columns.some(c => c.startsWith('target_workflow_id')),\n );\n await this.db.createIndexes(indexes);\n }\n\n /**\n * Spanner-specific optimization: add a STORED generated column that extracts\n * `workflowId` from the JSON `target` payload, so the listSchedules workflowId\n * filter can use a regular secondary index instead of a full JSON_VALUE scan.\n */\n private async ensureTargetWorkflowIdColumn(): Promise<void> {\n // In validate mode the schema is owned externally, so we never issue DDL.\n // hasTargetWorkflowIdColumn() / listSchedules will pick up whether the\n // column is present at runtime via INFORMATION_SCHEMA and route accordingly.\n if (this.db.initMode === 'validate') return;\n try {\n const ddl =\n `ALTER TABLE ${quoteIdent(TABLE_SCHEDULES, 'table name')} ` +\n `ADD COLUMN IF NOT EXISTS ${quoteIdent('target_workflow_id', 'column name')} ` +\n `STRING(MAX) AS (JSON_VALUE(${quoteIdent('target', 'column name')}, '$.workflowId')) STORED`;\n const [operation] = await this.database.updateSchema([ddl]);\n await operation.promise();\n this.targetWorkflowIdColumnAvailable = true;\n } catch (error) {\n this.logger?.warn?.(\n 'Failed to add target_workflow_id generated column; workflowId filtering will fall back to JSON_VALUE scan',\n error,\n );\n }\n }\n\n /**\n * Cached lookup for whether the `target_workflow_id` generated column exists.\n * Resolves true after `ensureTargetWorkflowIdColumn()` succeeds, otherwise\n * falls back to an INFORMATION_SCHEMA probe (lets us still pick up the fast\n * path on databases that already had the column from a prior deploy).\n */\n private targetWorkflowIdColumnAvailable: boolean | null = null;\n /** Returns true when the `target_workflow_id` generated column exists. */\n private async hasTargetWorkflowIdColumn(): Promise<boolean> {\n if (this.targetWorkflowIdColumnAvailable !== null) return this.targetWorkflowIdColumnAvailable;\n try {\n this.targetWorkflowIdColumnAvailable = await this.db.hasColumn(TABLE_SCHEDULES, 'target_workflow_id');\n } catch {\n this.targetWorkflowIdColumnAvailable = false;\n }\n return this.targetWorkflowIdColumnAvailable;\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SCHEDULE_TRIGGERS });\n await this.db.clearTable({ tableName: TABLE_SCHEDULES });\n }\n\n async createSchedule(schedule: Schedule): Promise<Schedule> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('id', 'column name')} FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id LIMIT 1`,\n params: { id: schedule.id },\n json: true,\n });\n if ((rows as Array<Record<string, any>>).length > 0) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_SCHEDULE', 'ALREADY_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Schedule with id \"${schedule.id}\" already exists`,\n details: { id: schedule.id },\n });\n }\n await this.db.insert({\n tableName: TABLE_SCHEDULES,\n record: {\n id: schedule.id,\n target: schedule.target,\n cron: schedule.cron,\n timezone: schedule.timezone ?? null,\n status: schedule.status,\n next_fire_at: schedule.nextFireAt,\n last_fire_at: schedule.lastFireAt ?? null,\n last_run_id: schedule.lastRunId ?? null,\n created_at: schedule.createdAt,\n updated_at: schedule.updatedAt,\n metadata: schedule.metadata ?? null,\n owner_type: schedule.ownerType ?? null,\n owner_id: schedule.ownerId ?? null,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return schedule;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: schedule.id },\n },\n error,\n );\n }\n }\n\n async getSchedule(id: string): Promise<Schedule | null> {\n try {\n const row = await this.db.load<Record<string, any>>({ tableName: TABLE_SCHEDULES, keys: { id } });\n return row ? rowToSchedule(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async listSchedules(filter?: ScheduleFilter): Promise<Schedule[]> {\n try {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n const types: Record<string, any> = {};\n\n if (filter?.status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = filter.status;\n }\n if (filter?.workflowId) {\n // Prefer the indexed STORED generated column when present\n const useFastPath = await this.hasTargetWorkflowIdColumn();\n if (useFastPath) {\n conditions.push(`${quoteIdent('target_workflow_id', 'column name')} = @workflowId`);\n } else {\n conditions.push(`JSON_VALUE(${quoteIdent('target', 'column name')}, '$.workflowId') = @workflowId`);\n }\n params.workflowId = filter.workflowId;\n }\n if (filter?.ownerType !== undefined) {\n if (filter.ownerType === null) {\n conditions.push(`${quoteIdent('owner_type', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdent('owner_type', 'column name')} = @ownerType`);\n params.ownerType = filter.ownerType;\n }\n }\n if (filter?.ownerId !== undefined) {\n if (filter.ownerId === null) {\n conditions.push(`${quoteIdent('owner_id', 'column name')} IS NULL`);\n } else {\n conditions.push(`${quoteIdent('owner_id', 'column name')} = @ownerId`);\n params.ownerId = filter.ownerId;\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const sql = `SELECT * FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n ${where}\n ORDER BY ${quoteIdent('created_at', 'column name')} ASC`;\n const [rows] = await this.database.run({ sql, params, types, json: true });\n return (rows as Array<Record<string, any>>).map(rowToSchedule);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCHEDULES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: filter ? { ...filter } : {},\n },\n error,\n );\n }\n }\n\n async listDueSchedules(now: number, limit?: number): Promise<Schedule[]> {\n try {\n const cap = Math.max(0, Math.floor(limit ?? 100));\n const sql = `SELECT * FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = @status\n AND ${quoteIdent('next_fire_at', 'column name')} <= @now\n ORDER BY ${quoteIdent('next_fire_at', 'column name')} ASC\n LIMIT @lim`;\n const [rows] = await this.database.run({\n sql,\n params: { status: 'active', now, lim: cap },\n types: { now: 'int64', lim: 'int64' },\n json: true,\n });\n return (rows as Array<Record<string, any>>).map(rowToSchedule);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_DUE_SCHEDULES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { now, ...(limit !== undefined ? { limit } : {}) },\n },\n error,\n );\n }\n }\n\n async updateSchedule(id: string, patch: ScheduleUpdate): Promise<Schedule> {\n try {\n const data: Record<string, any> = {};\n if ('cron' in patch && patch.cron !== undefined) data.cron = patch.cron;\n if ('timezone' in patch) data.timezone = patch.timezone ?? null;\n if ('status' in patch && patch.status !== undefined) data.status = patch.status;\n if ('nextFireAt' in patch && patch.nextFireAt !== undefined) data.next_fire_at = patch.nextFireAt;\n if ('target' in patch && patch.target !== undefined) data.target = patch.target;\n if ('metadata' in patch) data.metadata = patch.metadata ?? null;\n if ('ownerType' in patch) data.owner_type = patch.ownerType ?? null;\n if ('ownerId' in patch) data.owner_id = patch.ownerId ?? null;\n\n if (Object.keys(data).length === 0) {\n // Nothing meaningful to patch; just confirm existence.\n const existing = await this.getSchedule(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Schedule ${id} not found`,\n details: { id },\n });\n }\n return existing;\n }\n\n data.updated_at = Date.now();\n await this.db.update({ tableName: TABLE_SCHEDULES, keys: { id }, data });\n\n const updated = await this.getSchedule(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Schedule ${id} not found`,\n details: { id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async updateScheduleNextFire(\n id: string,\n expectedNextFireAt: number,\n newNextFireAt: number,\n lastFireAt: number,\n lastRunId: string,\n ): Promise<boolean> {\n try {\n const sql = `UPDATE ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n SET ${quoteIdent('next_fire_at', 'column name')} = @newNext,\n ${quoteIdent('last_fire_at', 'column name')} = @lastFire,\n ${quoteIdent('last_run_id', 'column name')} = @lastRun,\n ${quoteIdent('updated_at', 'column name')} = @updatedAt\n WHERE ${quoteIdent('id', 'column name')} = @id\n AND ${quoteIdent('next_fire_at', 'column name')} = @expected\n AND ${quoteIdent('status', 'column name')} = @status`;\n const rowCount = await this.db.runDml({\n sql,\n params: {\n id,\n expected: expectedNextFireAt,\n newNext: newNextFireAt,\n lastFire: lastFireAt,\n lastRun: lastRunId,\n updatedAt: Date.now(),\n status: 'active',\n },\n types: {\n expected: 'int64',\n newNext: 'int64',\n lastFire: 'int64',\n updatedAt: 'int64',\n },\n });\n return rowCount > 0;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SCHEDULE_NEXT_FIRE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async deleteSchedule(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCHEDULE_TRIGGERS, 'table name')}\n WHERE ${quoteIdent('schedule_id', 'column name')} = @id`,\n params: { id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCHEDULES, 'table name')}\n WHERE ${quoteIdent('id', 'column name')} = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCHEDULE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async recordTrigger(trigger: ScheduleTrigger): Promise<void> {\n try {\n await this.db.insert({\n tableName: TABLE_SCHEDULE_TRIGGERS,\n record: {\n id: trigger.id ?? randomUUID(),\n schedule_id: trigger.scheduleId,\n run_id: trigger.runId ?? null,\n scheduled_fire_at: trigger.scheduledFireAt,\n actual_fire_at: trigger.actualFireAt,\n outcome: trigger.outcome,\n error: trigger.error ?? null,\n trigger_kind: trigger.triggerKind ?? 'schedule-fire',\n parent_trigger_id: trigger.parentTriggerId ?? null,\n metadata: trigger.metadata ?? null,\n },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'RECORD_TRIGGER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scheduleId: trigger.scheduleId, runId: trigger.runId ?? '' },\n },\n error,\n );\n }\n }\n\n async listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise<ScheduleTrigger[]> {\n try {\n const conditions: string[] = [`${quoteIdent('schedule_id', 'column name')} = @scheduleId`];\n const params: Record<string, any> = { scheduleId };\n const types: Record<string, any> = {};\n\n if (opts?.fromActualFireAt != null) {\n conditions.push(`${quoteIdent('actual_fire_at', 'column name')} >= @fromAt`);\n params.fromAt = opts.fromActualFireAt;\n types.fromAt = 'int64';\n }\n if (opts?.toActualFireAt != null) {\n conditions.push(`${quoteIdent('actual_fire_at', 'column name')} < @toAt`);\n params.toAt = opts.toActualFireAt;\n types.toAt = 'int64';\n }\n\n let limitClause = '';\n if (opts?.limit != null) {\n limitClause = 'LIMIT @lim';\n params.lim = Math.max(0, Math.floor(opts.limit));\n types.lim = 'int64';\n }\n\n const sql = `SELECT * FROM ${quoteIdent(TABLE_SCHEDULE_TRIGGERS, 'table name')}\n WHERE ${conditions.join(' AND ')}\n ORDER BY ${quoteIdent('actual_fire_at', 'column name')} DESC\n ${limitClause}`;\n const [rows] = await this.database.run({ sql, params, types, json: true });\n return (rows as Array<Record<string, any>>).map(rowToTrigger);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_TRIGGERS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scheduleId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n ScorerDefinitionsStorage,\n SCORER_DEFINITIONS_SCHEMA,\n SCORER_DEFINITION_VERSIONS_SCHEMA,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n StorageUpdateScorerDefinitionInput,\n} from '@mastra/core/storage';\nimport type {\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n ScorerDefinitionVersion,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for scorer definitions and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/skills/prompt-blocks.\n */\nexport class ScorerDefinitionsSpanner extends ScorerDefinitionsStorage {\n private database: Database;\n private db: SpannerDB;\n private skipDefaultIndexes?: boolean;\n private indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx =>\n (ScorerDefinitionsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /** Creates the scorer-definition tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SCORER_DEFINITIONS, schema: SCORER_DEFINITIONS_SCHEMA });\n await this.db.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: SCORER_DEFINITION_VERSIONS_SCHEMA,\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('scorerDefinitionId', 'column name')}\n FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft scorer definitions:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_scorer_definitions_status_createdat_idx',\n table: TABLE_SCORER_DEFINITIONS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_scorer_definitions_authorid_idx',\n table: TABLE_SCORER_DEFINITIONS,\n columns: ['authorId'],\n },\n // Unique index on (scorerDefinitionId, versionNumber) prevents duplicate\n // versions from concurrent createVersion calls.\n {\n name: 'mastra_scorer_definition_versions_unique_idx',\n table: TABLE_SCORER_DEFINITION_VERSIONS,\n columns: ['scorerDefinitionId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SCORER_DEFINITION_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_SCORER_DEFINITIONS });\n }\n\n /** Decodes a raw Spanner thin-row into the public scorer-definition shape. */\n private parseScorerRow(row: Record<string, any>): StorageScorerDefinitionType {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_SCORER_DEFINITIONS,\n row,\n });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n metadata: transformed.metadata ?? undefined,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n };\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): ScorerDefinitionVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n scorerDefinitionId: transformed.scorerDefinitionId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? undefined,\n type: transformed.type,\n model: transformed.model ?? undefined,\n instructions: transformed.instructions ?? undefined,\n scoreRange: transformed.scoreRange ?? undefined,\n presetConfig: transformed.presetConfig ?? undefined,\n defaultSampling: transformed.defaultSampling ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin scorer-definition record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseScorerRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n const { scorerDefinition } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = scorerDefinition;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_SCORER_DEFINITIONS,\n record: {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: null,\n authorId: scorerDefinition.authorId ?? null,\n metadata: scorerDefinition.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n record: {\n id: versionId,\n scorerDefinitionId: scorerDefinition.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n type: (snapshot as any).type,\n model: (snapshot as any).model ?? null,\n instructions: (snapshot as any).instructions ?? null,\n scoreRange: (snapshot as any).scoreRange ?? null,\n presetConfig: (snapshot as any).presetConfig ?? null,\n defaultSampling: (snapshot as any).defaultSampling ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(scorerDefinition.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Scorer definition ${scorerDefinition.id} not found after creation`,\n details: { scorerDefinitionId: scorerDefinition.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: scorerDefinition.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId, metadata). */\n async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Scorer definition ${id} not found`,\n details: { scorerDefinitionId: id },\n });\n }\n\n // Only thin-record fields land on the entity row; content updates create\n // a new version through the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata ?? null;\n\n await this.db.update({ tableName: TABLE_SCORER_DEFINITIONS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SCORER_DEFINITION', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Scorer definition ${id} not found after update`,\n details: { scorerDefinitionId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: id },\n },\n error,\n );\n }\n }\n\n /** Removes a scorer definition and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCORER_DEFINITION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional status / authorId / metadata filters. */\n async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_SCORER_DEFINITIONS, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (status) {\n conditions.push(`${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n // SECURITY: the JSON path inside `JSON_VALUE(metadata, '$.<key>')`\n // must be a string literal, Spanner does NOT accept a parameter\n // for the JSON path expression, so the key is concatenated into\n // SQL.\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITIONS', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(metadata, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { scorerDefinitions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const scorerDefinitions = (rows as Array<Record<string, any>>).map(r => this.parseScorerRow(r));\n return {\n scorerDefinitions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing scorer definition. */\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n record: {\n id: input.id,\n scorerDefinitionId: input.scorerDefinitionId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n type: input.type,\n model: input.model ?? null,\n instructions: input.instructions ?? null,\n scoreRange: input.scoreRange ?? null,\n presetConfig: input.presetConfig ?? null,\n defaultSampling: input.defaultSampling ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as ScorerDefinitionVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, scorerDefinitionId: input.scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(scorerDefinitionId, versionNumber)`. */\n async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { scorerDefinitionId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for a scorer definition. */\n async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { scorerDefinitionId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORER_DEFINITION_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single scorer definition. */\n async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITION_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { scorerDefinitionId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given scorer definition. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given scorer definition. */\n async countVersions(scorerDefinitionId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_SCORER_DEFINITION_VERSIONS, 'table name')} WHERE ${quoteIdent('scorerDefinitionId', 'column name')} = @scorerDefinitionId`,\n params: { scorerDefinitionId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_SCORER_DEFINITION_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { ListScoresResponse, SaveScorePayload, ScoreRowData, ScoringSource } from '@mastra/core/evals';\nimport { saveScorePayloadSchema } from '@mastra/core/evals';\nimport type { StoragePagination, CreateIndexOptions } from '@mastra/core/storage';\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 { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n // Pre-process Spanner-specific types (timestamp objects, jsonb strings) before\n // delegating to the shared core transform.\n const normalized = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SCORERS, row });\n return coreTransformScoreRow(normalized, { convertTimestamps: true });\n}\n\nexport class ScoresSpanner extends ScoresStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORERS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (ScoresSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SCORERS, schema: TABLE_SCHEMAS[TABLE_SCORERS] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_scores_trace_id_span_id_idx',\n table: TABLE_SCORERS,\n columns: ['traceId', 'spanId'],\n },\n {\n name: 'mastra_scores_run_id_idx',\n table: TABLE_SCORERS,\n columns: ['runId'],\n },\n {\n name: 'mastra_scores_entity_idx',\n table: TABLE_SCORERS,\n columns: ['entityId', 'entityType'],\n },\n // listScoresByScorerId orders by createdAt DESC; an index leading with\n // scorerId lets the query seek per-scorer rather than scanning.\n {\n name: 'mastra_scores_scorer_id_created_at_idx',\n table: TABLE_SCORERS,\n columns: ['scorerId', 'createdAt DESC'],\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\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 [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SCORERS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return transformScoreRow(row);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id },\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let validatedScore: SaveScorePayload;\n try {\n validatedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n try {\n const scoreId = randomUUID();\n const now = new Date();\n const {\n scorer,\n preprocessStepResult,\n analyzeStepResult,\n metadata,\n input,\n output,\n additionalContext,\n requestContext,\n entity,\n ...rest\n } = validatedScore;\n\n const insertedRecord = {\n id: scoreId,\n ...rest,\n input: input ?? {},\n output: output ?? {},\n preprocessStepResult: preprocessStepResult ?? null,\n analyzeStepResult: analyzeStepResult ?? null,\n metadata: metadata ?? null,\n additionalContext: additionalContext ?? null,\n requestContext: requestContext ?? null,\n entity: entity ?? null,\n scorer: scorer ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await this.db.insert({\n tableName: TABLE_SCORERS,\n record: insertedRecord,\n });\n\n return { score: insertedRecord as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n private async listScoresByConditions(\n conditions: string[],\n params: Record<string, any>,\n pagination: StoragePagination,\n ): Promise<ListScoresResponse> {\n const tableName = quoteIdent(TABLE_SCORERS, 'table name');\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n const { page, perPage: perPageInput } = pagination;\n if (total === 0) {\n return { pagination: { total: 0, page, perPage: perPageInput, hasMore: false }, scores: [] };\n }\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n const end = perPageInput === false ? total : start + perPage;\n\n const sql = `SELECT * FROM ${tableName} ${whereSql} ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, id DESC LIMIT @limit OFFSET @offset`;\n const [rows] = await this.database.run({\n sql,\n params: { ...params, limit: limitValue, offset: start },\n json: true,\n });\n return {\n pagination: { total, page, perPage: perPageForResponse, hasMore: end < total },\n scores: (rows as Array<Record<string, any>>).map(r => transformScoreRow(r)),\n };\n }\n\n async listScoresByScorerId({\n scorerId,\n pagination,\n entityId,\n entityType,\n source,\n }: {\n scorerId: string;\n pagination: StoragePagination;\n entityId?: string;\n entityType?: string;\n source?: ScoringSource;\n }): Promise<ListScoresResponse> {\n try {\n const conditions = [`${quoteIdent('scorerId', 'column name')} = @scorerId`];\n const params: Record<string, any> = { scorerId };\n if (entityId) {\n conditions.push(`${quoteIdent('entityId', 'column name')} = @entityId`);\n params.entityId = entityId;\n }\n if (entityType) {\n conditions.push(`${quoteIdent('entityType', 'column name')} = @entityType`);\n params.entityType = entityType;\n }\n if (source) {\n conditions.push(`${quoteIdent('source', 'column name')} = @source`);\n params.source = source;\n }\n return await this.listScoresByConditions(conditions, params, pagination);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerId },\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 return await this.listScoresByConditions(\n [`${quoteIdent('runId', 'column name')} = @runId`],\n { runId },\n pagination,\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId },\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 return await this.listScoresByConditions(\n [\n `${quoteIdent('entityId', 'column name')} = @entityId`,\n `${quoteIdent('entityType', 'column name')} = @entityType`,\n ],\n { entityId, entityType },\n pagination,\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { entityId, entityType },\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 return await this.listScoresByConditions(\n [`${quoteIdent('traceId', 'column name')} = @traceId`, `${quoteIdent('spanId', 'column name')} = @spanId`],\n { traceId, spanId },\n pagination,\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { traceId, spanId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n SkillsStorage,\n SKILLS_SCHEMA,\n SKILL_VERSIONS_SCHEMA,\n TABLE_FAVORITES,\n TABLE_SKILLS,\n TABLE_SKILL_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageSkillType,\n StorageCreateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageUpdateSkillInput,\n} from '@mastra/core/storage';\nimport type {\n CreateSkillVersionInput,\n ListSkillVersionsInput,\n ListSkillVersionsOutput,\n SkillVersion,\n} from '@mastra/core/storage/domains/skills';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for skills and their immutable versions.\n * Mirrors the thin-record + versions pattern used by agents/prompt-blocks/scorer-definitions.\n */\nexport class SkillsSpanner extends SkillsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SKILLS, TABLE_SKILL_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (SkillsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Creates the skill tables, indexes, and (when opted in) sweeps stale drafts. */\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_SKILLS, schema: SKILLS_SCHEMA });\n await this.db.createTable({ tableName: TABLE_SKILL_VERSIONS, schema: SKILL_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n // Sweep any orphaned drafts left behind by previous partial create() calls.\n await this.cleanupStaleDrafts();\n }\n\n /**\n * Sweeps orphaned draft thin-rows whose paired version row was never written.\n * Skipped under `initMode: 'validate'` (no destructive DML in validate mode).\n */\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILLS, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('skillId', 'column name')}\n FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')}\n WHERE ${quoteIdent('skillId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft skills:', error);\n }\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_skills_status_createdat_idx',\n table: TABLE_SKILLS,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_skills_authorid_idx',\n table: TABLE_SKILLS,\n columns: ['authorId'],\n },\n // Unique index on (skillId, versionNumber) prevents duplicate versions\n // from concurrent createVersion calls.\n {\n name: 'mastra_skill_versions_unique_idx',\n table: TABLE_SKILL_VERSIONS,\n columns: ['skillId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /** Creates the default indexes; no-op when `skipDefaultIndexes` was set. */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every row from this domain's tables. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_SKILL_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_SKILLS });\n }\n\n /** Decodes a raw Spanner thin-row into the public skill shape. */\n private parseSkillRow(row: Record<string, any>): StorageSkillType {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_SKILLS, row });\n return {\n id: transformed.id,\n status: transformed.status,\n activeVersionId: transformed.activeVersionId ?? undefined,\n authorId: transformed.authorId ?? undefined,\n visibility: (transformed.visibility as 'private' | 'public' | undefined) ?? undefined,\n // Denormalized favorite counter maintained by the favorites domain. Surface\n // it as 0 when absent so list/get responses carry a stable numeric value.\n favoriteCount:\n transformed.favoriteCount === null || transformed.favoriteCount === undefined\n ? 0\n : Number(transformed.favoriteCount),\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n } as StorageSkillType;\n }\n\n /** Decodes a raw Spanner version row into the public version shape. */\n private parseVersionRow(row: Record<string, any>): SkillVersion {\n const transformed = transformFromSpannerRow<Record<string, any>>({\n tableName: TABLE_SKILL_VERSIONS,\n row,\n });\n return {\n id: transformed.id,\n skillId: transformed.skillId,\n versionNumber: Number(transformed.versionNumber),\n name: transformed.name,\n description: transformed.description ?? '',\n instructions: transformed.instructions ?? '',\n license: transformed.license ?? undefined,\n compatibility: transformed.compatibility ?? undefined,\n source: transformed.source ?? undefined,\n references: transformed.references ?? undefined,\n scripts: transformed.scripts ?? undefined,\n assets: transformed.assets ?? undefined,\n metadata: transformed.metadata ?? undefined,\n tree: transformed.tree ?? undefined,\n changedFields: transformed.changedFields ?? undefined,\n changeMessage: transformed.changeMessage ?? undefined,\n createdAt: transformed.createdAt,\n };\n }\n\n /** Fetches the thin skill record by id, or `null` when absent. */\n async getById(id: string): Promise<StorageSkillType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILLS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseSkillRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: id },\n },\n error,\n );\n }\n }\n\n /** Atomically inserts a draft thin row + version 1 in a single Spanner transaction. */\n async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n const { skill } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, visibility: _visibility, ...snapshot } = skill as any;\n const visibility = (skill as any).visibility ?? (skill.authorId ? 'private' : null);\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Wrap the thin-record insert and the seed-version insert in a single\n // Spanner read-write transaction so they commit or roll back together,\n // making orphaned drafts impossible. runWithAbortRetry handles the\n // ABORTED retry loop; the inner block must be idempotent.\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_SKILLS,\n record: {\n id: skill.id,\n status: 'draft',\n activeVersionId: null,\n authorId: skill.authorId ?? null,\n visibility,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_SKILL_VERSIONS,\n record: {\n id: versionId,\n skillId: skill.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n instructions: (snapshot as any).instructions ?? null,\n license: (snapshot as any).license ?? null,\n compatibility: (snapshot as any).compatibility ?? null,\n source: (snapshot as any).source ?? null,\n references: (snapshot as any).references ?? null,\n scripts: (snapshot as any).scripts ?? null,\n assets: (snapshot as any).assets ?? null,\n metadata: (snapshot as any).metadata ?? null,\n tree: (snapshot as any).tree ?? null,\n changedFields: Object.keys(snapshot),\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n // The Spanner client does NOT auto-rollback when the runFn throws\n // the transaction (and its row locks) stay pending on the server\n // until explicitly released. Without this rollback, a failed\n // create() blocks subsequent reads/writes against the same rows.\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(skill.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_SKILL', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Skill ${skill.id} not found after creation`,\n details: { skillId: skill.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: skill.id },\n },\n error,\n );\n }\n }\n\n /** Updates thin-record fields (status, activeVersionId, authorId). */\n async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SKILL', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Skill ${id} not found`,\n details: { skillId: id },\n });\n }\n\n // Only thin-record fields land on the entity row; content updates create\n // a new version through the server's auto-versioning layer.\n const updateData: Record<string, unknown> = { updatedAt: new Date() };\n if (updates.authorId !== undefined) updateData.authorId = updates.authorId;\n if ((updates as any).visibility !== undefined) updateData.visibility = (updates as any).visibility;\n if (updates.activeVersionId !== undefined) updateData.activeVersionId = updates.activeVersionId;\n if (updates.status !== undefined) updateData.status = updates.status;\n\n await this.db.update({ tableName: TABLE_SKILLS, keys: { id }, data: updateData });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_SKILL', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Skill ${id} not found after update`,\n details: { skillId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: id },\n },\n error,\n );\n }\n }\n\n /** Removes a skill and all its versions atomically in a single transaction. */\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILLS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SKILL', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: id },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional authorId filter. */\n async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n const {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n status,\n visibility,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILLS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n // Empty entityIds can never match a row — short-circuit before querying.\n if (entityIds && entityIds.length === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const tableName = quoteIdent(TABLE_SKILLS, 'table name');\n const favoritesTable = quoteIdent(TABLE_FAVORITES, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n const useJoin = Boolean(pinFavoritedFor);\n if (useJoin) params.pinUserId = pinFavoritedFor;\n\n if (status !== undefined) {\n conditions.push(`a.${quoteIdent('status', 'column name')} = @status`);\n params.status = status;\n }\n if (visibility !== undefined) {\n conditions.push(`a.${quoteIdent('visibility', 'column name')} = @visibility`);\n params.visibility = visibility;\n }\n if (authorId !== undefined) {\n conditions.push(`a.${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (entityIds && entityIds.length > 0) {\n const placeholders = entityIds.map((id, i) => {\n const param = `eid${i}`;\n params[param] = id;\n return `@${param}`;\n });\n conditions.push(`a.${quoteIdent('id', 'column name')} IN (${placeholders.join(', ')})`);\n }\n if (useJoin && favoritedOnly) {\n conditions.push(`s.${quoteIdent('userId', 'column name')} IS NOT NULL`);\n } else if (favoritedOnly) {\n conditions.push('1 = 0');\n }\n\n const joinClause = useJoin\n ? `LEFT JOIN ${favoritesTable} s ON s.${quoteIdent('entityType', 'column name')} = 'skill'` +\n ` AND s.${quoteIdent('entityId', 'column name')} = a.${quoteIdent('id', 'column name')}` +\n ` AND s.${quoteIdent('userId', 'column name')} = @pinUserId`\n : '';\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} a ${joinClause} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { skills: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const orderParts: string[] = [];\n if (useJoin) {\n orderParts.push(`(s.${quoteIdent('userId', 'column name')} IS NOT NULL) DESC`);\n }\n orderParts.push(`a.${quoteIdent(field, 'column name')} ${dirSql}`);\n orderParts.push(`a.${quoteIdent('id', 'column name')} ${dirSql}`);\n const [rows] = await this.database.run({\n sql: `SELECT a.* FROM ${tableName} a ${joinClause} ${whereSql}\n ORDER BY ${orderParts.join(', ')}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const skills = (rows as Array<Record<string, any>>).map(r => this.parseSkillRow(r));\n return {\n skills,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILLS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /** Inserts a new immutable version row for an existing skill. */\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_SKILL_VERSIONS,\n record: {\n id: input.id,\n skillId: input.skillId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n instructions: input.instructions ?? null,\n license: input.license ?? null,\n compatibility: input.compatibility ?? null,\n source: input.source ?? null,\n references: input.references ?? null,\n scripts: input.scripts ?? null,\n assets: input.assets ?? null,\n metadata: input.metadata ?? null,\n tree: input.tree ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as SkillVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, skillId: input.skillId },\n },\n error,\n );\n }\n }\n\n /** Fetches a version row by its id, or `null` when absent. */\n async getVersion(id: string): Promise<SkillVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Fetches a specific version by `(skillId, versionNumber)`. */\n async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')}\n WHERE ${quoteIdent('skillId', 'column name')} = @skillId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { skillId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId, versionNumber },\n },\n error,\n );\n }\n }\n\n /** Returns the highest-numbered version for a skill. */\n async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')}\n WHERE ${quoteIdent('skillId', 'column name')} = @skillId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { skillId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_SKILL_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId },\n },\n error,\n );\n }\n }\n\n /** Paginated listing of versions for a single skill. */\n async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILL_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_SKILL_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('skillId', 'column name')} = @skillId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { skillId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId },\n },\n error,\n );\n }\n }\n\n /** Deletes a single version row by id. */\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SKILL_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n /** Deletes every version row belonging to the given skill. */\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_SKILL_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId: entityId },\n },\n error,\n );\n }\n }\n\n /** Returns the total number of version rows for the given skill. */\n async countVersions(skillId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_SKILL_VERSIONS, 'table name')} WHERE ${quoteIdent('skillId', 'column name')} = @skillId`,\n params: { skillId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_SKILL_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { skillId },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n WorkflowsStorage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n normalizePerPage,\n} from '@mastra/core/storage';\nimport type {\n StorageListWorkflowRunsInput,\n WorkflowRun,\n WorkflowRuns,\n UpdateWorkflowStateOptions,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/**\n * Spanner-backed storage for workflow run snapshots, including persistence,\n * incremental updates, and listing of historical runs.\n */\nexport class WorkflowsSpanner extends WorkflowsStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_SNAPSHOT] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode } = resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (WorkflowsSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /** Spanner serialises read-write transactions, so concurrent updates are safe. */\n supportsConcurrentUpdates(): boolean {\n return true;\n }\n\n /** Returns the default index set this domain creates during `init()`. */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n // Indexes here cover the access patterns of listWorkflowRuns and\n // getWorkflowRunById. Note: secondary indexes whose leading column is a\n // monotonically-increasing timestamp (createdAt) can hot-spot under\n // high write throughput in Spanner, operators expecting heavy churn\n // can opt out via `skipDefaultIndexes` and supply hashed alternatives.\n return [\n {\n // listWorkflowRuns({ workflowName, ... }) ORDER BY createdAt DESC\n name: 'mastra_workflow_snapshot_workflowname_createdat_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['workflow_name', 'createdAt DESC', 'run_id DESC'],\n },\n {\n // listWorkflowRuns() global path ORDER BY createdAt DESC, run_id DESC\n name: 'mastra_workflow_snapshot_createdat_runid_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['createdAt DESC', 'run_id DESC'],\n },\n {\n // getWorkflowRunById({ runId }) without workflowName the PK leads\n // with workflow_name so a runId-only lookup needs its own path.\n name: 'mastra_workflow_snapshot_runid_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['run_id'],\n },\n {\n // listWorkflowRuns({ resourceId, ... }) ORDER BY createdAt DESC\n name: 'mastra_workflow_snapshot_resourceid_createdat_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['resourceId', 'createdAt DESC', 'run_id DESC'],\n },\n {\n // listWorkflowRuns({ status, ... }) filters on the STORED generated\n // column added by ensureStatusColumn(). If the column wasn't created\n // (legacy databases), createIndex will fail and listWorkflowRuns\n // falls back to the JSON_VALUE expression.\n name: 'mastra_workflow_snapshot_snapshotstatus_createdat_idx',\n table: TABLE_WORKFLOW_SNAPSHOT,\n columns: ['snapshotStatus', 'createdAt DESC', 'run_id DESC'],\n },\n ];\n }\n\n /**\n * Creates the default indexes; no-op when `skipDefaultIndexes` was set.\n * Filters out the snapshotStatus index when that generated column is absent\n * (e.g. ensureStatusColumn() failed, or `initMode: 'validate'` skipped the\n * DDL). Otherwise the createIndex call would fail on a missing column.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n const hasStatus = await this.hasStatusColumn();\n const indexes = this.getDefaultIndexDefinitions().filter(\n idx => hasStatus || !idx.columns.some(c => c.startsWith('snapshotStatus')),\n );\n await this.db.createIndexes(indexes);\n }\n\n /** Creates the workflow snapshot table, the snapshotStatus generated column, and indexes. */\n async init(): Promise<void> {\n await this.db.createTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n });\n // Add the snapshotStatus generated column BEFORE indexes so the index on\n // it can be created in the same init pass.\n await this.ensureStatusColumn();\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Spanner-specific optimization: add a STORED generated column that extracts\n * `status` from the JSON snapshot, so the listWorkflowRuns status filter can\n * use a regular secondary index instead of a full JSON_VALUE scan.\n *\n * The column is owned and maintained entirely by the Spanner adapter; the\n * shared `@mastra/core` schema doesn't reference it. The DDL is idempotent\n * (`ADD COLUMN IF NOT EXISTS`) and the schema operation is awaited; Spanner\n * backfills existing rows asynchronously after the operation returns, while\n * new rows pick up the value on every write.\n */\n private async ensureStatusColumn(): Promise<void> {\n // In validate mode the schema is owned externally, so we never issue DDL.\n // hasStatusColumn() / listWorkflowRuns will pick up whether the column is\n // present at runtime via INFORMATION_SCHEMA and route accordingly.\n if (this.db.initMode === 'validate') return;\n try {\n const ddl =\n `ALTER TABLE ${quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name')} ` +\n `ADD COLUMN IF NOT EXISTS ${quoteIdent('snapshotStatus', 'column name')} ` +\n `STRING(MAX) AS (JSON_VALUE(${quoteIdent('snapshot', 'column name')}, '$.status')) STORED`;\n const [operation] = await this.database.updateSchema([ddl]);\n await operation.promise();\n this.statusColumnAvailable = true;\n } catch (error) {\n this.logger?.warn?.(\n 'Failed to add snapshotStatus generated column; status filtering will fall back to JSON_VALUE scan',\n error,\n );\n }\n }\n\n /**\n * Cached lookup for whether the `snapshotStatus` generated column exists.\n * Resolves true after `ensureStatusColumn()` succeeds, otherwise falls back\n * to an INFORMATION_SCHEMA probe (lets us still pick up the fast path on\n * databases that already had the column from a prior deploy).\n */\n private statusColumnAvailable: boolean | null = null;\n /** Returns true when the `snapshotStatus` generated column exists. */\n private async hasStatusColumn(): Promise<boolean> {\n if (this.statusColumnAvailable !== null) return this.statusColumnAvailable;\n try {\n this.statusColumnAvailable = await this.db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'snapshotStatus');\n } catch {\n this.statusColumnAvailable = false;\n }\n return this.statusColumnAvailable;\n }\n\n /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n /** Removes every workflow snapshot row. Intended for tests. */\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n /** Decodes a raw Spanner snapshot row into the public `WorkflowRun` shape. */\n private parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n const transformed = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_WORKFLOW_SNAPSHOT, row });\n let snapshot: WorkflowRunState | string = transformed.snapshot;\n if (typeof snapshot === 'string') {\n try {\n snapshot = JSON.parse(snapshot) as WorkflowRunState;\n } catch (e) {\n this.logger?.warn?.(`Failed to parse snapshot for workflow ${transformed.workflow_name}:`, e);\n }\n }\n return {\n workflowName: transformed.workflow_name,\n runId: transformed.run_id,\n snapshot,\n createdAt: transformed.createdAt,\n updatedAt: transformed.updatedAt,\n resourceId: transformed.resourceId,\n };\n }\n\n /** Upserts a workflow run snapshot, preserving the original `createdAt` on update. */\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 now = new Date();\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n // Read resourceId alongside createdAt so we can preserve the\n // existing association when the caller omits resourceId on update\n // (Spanner's INSERT OR UPDATE would otherwise null it out).\n const [rows] = await tx.run({\n sql: `SELECT ${quoteIdent('createdAt', 'column name')}, ${quoteIdent('resourceId', 'column name')} FROM ${table}\n WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n json: true,\n });\n const existing = (rows as Array<Record<string, any>>)[0];\n const resolvedCreatedAt = existing?.createdAt\n ? new Date(existing.createdAt instanceof Date ? existing.createdAt.getTime() : existing.createdAt)\n : (createdAt ?? now);\n const resolvedResourceId = resourceId !== undefined ? resourceId : (existing?.resourceId ?? null);\n await this.db.upsert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n workflow_name: workflowName,\n run_id: runId,\n resourceId: resolvedResourceId,\n snapshot,\n createdAt: resolvedCreatedAt,\n updatedAt: updatedAt ?? now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n /** Loads the snapshot payload for a `(workflowName, runId)` pair, or `null` when absent. */\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.db.load<{ snapshot: WorkflowRunState | string }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n if (!result) return null;\n return result.snapshot as WorkflowRunState;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n /** Merges a step result and request-context delta into a snapshot inside an RW transaction. */\n async updateWorkflowResults({\n workflowName,\n runId,\n stepId,\n result,\n requestContext,\n }: {\n workflowName: string;\n runId: string;\n stepId: string;\n result: StepResult<any, any, any, any>;\n requestContext: Record<string, any>;\n }): Promise<Record<string, StepResult<any, any, any, any>>> {\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n let mergedContext: Record<string, StepResult<any, any, any, any>> = {};\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n // Reading the snapshot row inside a read-write transaction takes a lock on\n // it, protecting against concurrent writers without explicit locking syntax.\n // We also fetch createdAt so the upsert can preserve it on the update path\n // (Spanner's INSERT OR UPDATE replaces every column listed).\n const [rows] = await tx.run({\n sql: `SELECT snapshot, ${quoteIdent('createdAt', 'column name')} FROM ${table}\n WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n json: true,\n });\n let snapshot: WorkflowRunState;\n const existing = (rows as Array<Record<string, any>>)[0];\n if (!existing) {\n snapshot = {\n context: {},\n activePaths: [],\n activeStepsPath: {},\n timestamp: Date.now(),\n suspendedPaths: {},\n resumeLabels: {},\n serializedStepGraph: [],\n status: 'pending',\n value: {},\n waitingPaths: {},\n runId,\n requestContext: {},\n } as WorkflowRunState;\n } else {\n const raw = existing.snapshot;\n snapshot = (typeof raw === 'string' ? JSON.parse(raw) : raw) as WorkflowRunState;\n }\n snapshot.context[stepId] = result;\n snapshot.requestContext = { ...snapshot.requestContext, ...requestContext };\n const now = new Date();\n const resolvedCreatedAt = existing?.createdAt\n ? new Date(existing.createdAt instanceof Date ? existing.createdAt.getTime() : existing.createdAt)\n : now;\n await this.db.upsert({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n record: {\n workflow_name: workflowName,\n run_id: runId,\n snapshot,\n createdAt: resolvedCreatedAt,\n updatedAt: now,\n },\n transaction: tx,\n });\n mergedContext = snapshot.context;\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return mergedContext;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKFLOW_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId, stepId },\n },\n error,\n );\n }\n }\n\n /** Applies a top-level snapshot patch (e.g. status, value) inside an RW transaction. */\n async updateWorkflowState({\n workflowName,\n runId,\n opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n }): Promise<WorkflowRunState | undefined> {\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n let updated: WorkflowRunState | undefined;\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n const [rows] = await tx.run({\n sql: `SELECT snapshot FROM ${table} WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n json: true,\n });\n const existing = (rows as Array<Record<string, any>>)[0];\n if (!existing) {\n await tx.commit();\n return;\n }\n const raw = existing.snapshot;\n const snapshot = (typeof raw === 'string' ? JSON.parse(raw) : raw) as WorkflowRunState;\n if (!snapshot || !snapshot.context) {\n await tx.commit();\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKFLOW_STATE', 'SNAPSHOT_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n details: { workflowName, runId },\n },\n new Error(`Snapshot not found for runId ${runId}`),\n );\n }\n updated = { ...snapshot, ...opts } as WorkflowRunState;\n await this.db.update({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n data: { snapshot: updated, updatedAt: new Date() },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKFLOW_STATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName, runId },\n },\n error,\n );\n }\n }\n\n /** Fetches a single workflow run by `runId` (optionally narrowed by `workflowName`). */\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n if (!runId || runId.trim() === '') {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'GET_WORKFLOW_RUN_BY_ID', 'EMPTY_RUN_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'getWorkflowRunById requires a non-empty runId',\n details: { workflowName: workflowName || '' },\n });\n }\n try {\n const conditions: string[] = [`${quoteIdent('run_id', 'column name')} = @runId`];\n const params: Record<string, any> = { runId };\n if (workflowName) {\n conditions.push(`${quoteIdent('workflow_name', 'column name')} = @workflowName`);\n params.workflowName = workflowName;\n }\n const whereSql = `WHERE ${conditions.join(' AND ')}`;\n const sql = `SELECT * FROM ${quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name')} ${whereSql} LIMIT 1`;\n const [rows] = await this.database.run({ sql, params, json: true });\n const row = (rows as Array<Record<string, any>>)[0];\n if (!row) return null;\n return this.parseWorkflowRun(row);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName: workflowName || '' },\n },\n error,\n );\n }\n }\n\n /** Deletes the snapshot row for a `(workflowName, runId)` pair. */\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n const table = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${table} WHERE workflow_name = @workflow_name AND run_id = @run_id`,\n params: { workflow_name: workflowName, run_id: runId },\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { runId, workflowName },\n },\n error,\n );\n }\n }\n\n /** Paginated listing with optional workflowName, status, resourceId, and date-range filters. */\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n page,\n perPage,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n // Spanner needs an explicit `timestamp` type hint when the param is an\n // ISO string (the client otherwise infers `string`, which fails the\n // STRING -> TIMESTAMP coercion in the predicate). Mirrors the rule in\n // SpannerDB.aggregateParams / prepareWhereClause.\n const types: Record<string, any> = {};\n\n if (workflowName) {\n conditions.push(`${quoteIdent('workflow_name', 'column name')} = @workflowName`);\n params.workflowName = workflowName;\n }\n if (status) {\n // Status lives inside the snapshot JSON payload (the @mastra/core\n // schema has no top-level status column). To avoid a full JSON_VALUE\n // scan we maintain a STORED generated column `snapshotStatus` and an\n // index on it (see ensureStatusColumn / getDefaultIndexDefinitions).\n // Older databases that pre-date the migration fall back to the\n // expression predicate.\n if (await this.hasStatusColumn()) {\n conditions.push(`${quoteIdent('snapshotStatus', 'column name')} = @status`);\n } else {\n conditions.push(`JSON_VALUE(${quoteIdent('snapshot', 'column name')}, '$.status') = @status`);\n }\n params.status = status;\n }\n if (resourceId) {\n // resourceId is part of the current TABLE_WORKFLOW_SNAPSHOT schema,\n // so it's always present on a database initialised by this adapter.\n // No backward-compat probe needed (validate mode catches a missing\n // column at init() time before any query runs).\n conditions.push(`${quoteIdent('resourceId', 'column name')} = @resourceId`);\n params.resourceId = resourceId;\n }\n if (fromDate instanceof Date && !isNaN(fromDate.getTime())) {\n conditions.push(`${quoteIdent('createdAt', 'column name')} >= @fromDate`);\n params.fromDate = fromDate.toISOString();\n types.fromDate = 'timestamp';\n }\n if (toDate instanceof Date && !isNaN(toDate.getTime())) {\n conditions.push(`${quoteIdent('createdAt', 'column name')} <= @toDate`);\n params.toDate = toDate.toISOString();\n types.toDate = 'timestamp';\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const tableName = quoteIdent(TABLE_WORKFLOW_SNAPSHOT, 'table name');\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n\n let total = 0;\n if (usePagination) {\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n types,\n json: true,\n });\n total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n }\n\n let sql = `SELECT * FROM ${tableName} ${whereSql} ORDER BY ${quoteIdent('createdAt', 'column name')} DESC, ${quoteIdent('run_id', 'column name')} DESC`;\n if (usePagination) {\n const normalized = normalizePerPage(perPage, Number.MAX_SAFE_INTEGER);\n const offset = page! * normalized;\n sql += ` LIMIT @perPage OFFSET @offset`;\n params.perPage = normalized;\n params.offset = offset;\n }\n const [rows] = await this.database.run({ sql, params, types, json: true });\n const runs = (rows as Array<Record<string, any>>).map(r => this.parseWorkflowRun(r));\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workflowName: workflowName || 'all' },\n },\n error,\n );\n }\n }\n}\n","import type { Database } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n WorkspacesStorage,\n WORKSPACES_SCHEMA,\n WORKSPACE_VERSIONS_SCHEMA,\n TABLE_WORKSPACES,\n TABLE_WORKSPACE_VERSIONS,\n} from '@mastra/core/storage';\nimport type {\n CreateIndexOptions,\n StorageCreateWorkspaceInput,\n StorageListWorkspacesInput,\n StorageListWorkspacesOutput,\n StorageUpdateWorkspaceInput,\n StorageWorkspaceType,\n} from '@mastra/core/storage';\nimport type {\n CreateWorkspaceVersionInput,\n ListWorkspaceVersionsInput,\n ListWorkspaceVersionsOutput,\n WorkspaceVersion,\n} from '@mastra/core/storage/domains/workspaces';\nimport { SpannerDB, resolveSpannerConfig } from '../../db';\nimport type { SpannerDomainConfig } from '../../db';\nimport { quoteIdent } from '../../db/utils';\nimport { transformFromSpannerRow } from '../utils';\n\n/** Snapshot config fields that live exclusively on version rows. */\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'filesystem',\n 'sandbox',\n 'mounts',\n 'search',\n 'skills',\n 'tools',\n 'autoSync',\n 'operationTimeout',\n] as const;\n\n/**\n * Spanner-backed storage for workspaces and their immutable version snapshots.\n * Mirrors the thin-record + versions pattern used by skills/agents: the\n * `mastra_workspaces` row holds only metadata (status, activeVersionId, authorId,\n * metadata) while all configuration lives in `mastra_workspace_versions`.\n */\nexport class WorkspacesSpanner extends WorkspacesStorage {\n private database: Database;\n private db: SpannerDB;\n private readonly skipDefaultIndexes?: boolean;\n private readonly indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS] as const;\n\n constructor(config: SpannerDomainConfig) {\n super();\n const { database, indexes, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup } =\n resolveSpannerConfig(config);\n this.database = database;\n this.db = new SpannerDB({ database, skipDefaultIndexes, initMode, cleanupStaleDraftsOnStartup });\n this.skipDefaultIndexes = skipDefaultIndexes;\n this.indexes = indexes?.filter(idx => (WorkspacesSpanner.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.db.createTable({ tableName: TABLE_WORKSPACES, schema: WORKSPACES_SCHEMA });\n await this.db.createTable({ tableName: TABLE_WORKSPACE_VERSIONS, schema: WORKSPACE_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n await this.cleanupStaleDrafts();\n }\n\n private async cleanupStaleDrafts(): Promise<void> {\n if (this.db.initMode === 'validate') return;\n if (!this.db.cleanupStaleDraftsOnStartup) return;\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_WORKSPACES, 'table name')}\n WHERE ${quoteIdent('status', 'column name')} = 'draft'\n AND ${quoteIdent('activeVersionId', 'column name')} IS NULL\n AND id NOT IN (\n SELECT ${quoteIdent('workspaceId', 'column name')}\n FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')}\n WHERE ${quoteIdent('workspaceId', 'column name')} IS NOT NULL\n )`,\n });\n } catch (error) {\n this.logger?.warn?.('Failed to clean up stale draft workspaces:', error);\n }\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'mastra_workspaces_status_createdat_idx',\n table: TABLE_WORKSPACES,\n columns: ['status', 'createdAt DESC'],\n },\n {\n name: 'mastra_workspaces_authorid_idx',\n table: TABLE_WORKSPACES,\n columns: ['authorId'],\n },\n {\n name: 'mastra_workspace_versions_unique_idx',\n table: TABLE_WORKSPACE_VERSIONS,\n columns: ['workspaceId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.skipDefaultIndexes) return;\n await this.db.createIndexes(this.getDefaultIndexDefinitions());\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.indexes || this.indexes.length === 0) return;\n await this.db.createIndexes(this.indexes);\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.db.clearTable({ tableName: TABLE_WORKSPACE_VERSIONS });\n await this.db.clearTable({ tableName: TABLE_WORKSPACES });\n }\n\n private parseWorkspaceRow(row: Record<string, any>): StorageWorkspaceType {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_WORKSPACES, row });\n return {\n id: t.id,\n status: t.status,\n activeVersionId: t.activeVersionId ?? undefined,\n authorId: t.authorId ?? undefined,\n metadata: t.metadata ?? undefined,\n createdAt: t.createdAt,\n updatedAt: t.updatedAt,\n };\n }\n\n private parseVersionRow(row: Record<string, any>): WorkspaceVersion {\n const t = transformFromSpannerRow<Record<string, any>>({ tableName: TABLE_WORKSPACE_VERSIONS, row });\n return {\n id: t.id,\n workspaceId: t.workspaceId,\n versionNumber: Number(t.versionNumber),\n name: t.name,\n description: t.description ?? undefined,\n filesystem: t.filesystem ?? undefined,\n sandbox: t.sandbox ?? undefined,\n mounts: t.mounts ?? undefined,\n search: t.search ?? undefined,\n skills: t.skills ?? undefined,\n tools: t.tools ?? undefined,\n autoSync: t.autoSync == null ? undefined : Boolean(t.autoSync),\n operationTimeout: t.operationTimeout == null ? undefined : Number(t.operationTimeout),\n changedFields: t.changedFields ?? undefined,\n changeMessage: t.changeMessage ?? undefined,\n createdAt: t.createdAt,\n };\n }\n\n async getById(id: string): Promise<StorageWorkspaceType | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_WORKSPACES, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseWorkspaceRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_WORKSPACE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId: id },\n },\n error,\n );\n }\n }\n\n async create(input: { workspace: StorageCreateWorkspaceInput }): Promise<StorageWorkspaceType> {\n const { workspace } = input;\n try {\n const now = new Date();\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshot } = workspace;\n const versionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await this.db.insert({\n tableName: TABLE_WORKSPACES,\n record: {\n id: workspace.id,\n status: 'draft',\n activeVersionId: null,\n authorId: workspace.authorId ?? null,\n metadata: workspace.metadata ?? null,\n createdAt: now,\n updatedAt: now,\n },\n transaction: tx,\n });\n await this.db.insert({\n tableName: TABLE_WORKSPACE_VERSIONS,\n record: {\n id: versionId,\n workspaceId: workspace.id,\n versionNumber: 1,\n name: (snapshot as any).name,\n description: (snapshot as any).description ?? null,\n filesystem: (snapshot as any).filesystem ?? null,\n sandbox: (snapshot as any).sandbox ?? null,\n mounts: (snapshot as any).mounts ?? null,\n search: (snapshot as any).search ?? null,\n skills: (snapshot as any).skills ?? null,\n tools: (snapshot as any).tools ?? null,\n autoSync: (snapshot as any).autoSync ?? false,\n operationTimeout: (snapshot as any).operationTimeout ?? null,\n changedFields: [...SNAPSHOT_FIELDS],\n changeMessage: 'Initial version',\n createdAt: now,\n },\n transaction: tx,\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n\n const created = await this.getById(workspace.id);\n if (!created) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'CREATE_WORKSPACE', 'NOT_FOUND_AFTER_CREATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Workspace ${workspace.id} not found after creation`,\n details: { workspaceId: workspace.id },\n });\n }\n return created;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId: workspace.id },\n },\n error,\n );\n }\n }\n\n async update(input: StorageUpdateWorkspaceInput): Promise<StorageWorkspaceType> {\n const { id, ...updates } = input;\n try {\n const existing = await this.getById(id);\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKSPACE', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Workspace ${id} not found`,\n details: { workspaceId: id },\n });\n }\n\n const { authorId, activeVersionId, metadata, status, ...rawConfigFields } = updates;\n\n // Strip undefined config keys so omitted PATCH fields don't overwrite values.\n const configFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rawConfigFields)) {\n if (value !== undefined) configFields[key] = value;\n }\n\n const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKSPACE', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for workspace ${id}`,\n details: { workspaceId: id },\n });\n }\n\n const {\n id: _vid,\n workspaceId: _wid,\n versionNumber: _vnum,\n changedFields: _cf,\n changeMessage: _cm,\n createdAt: _ca,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = SNAPSHOT_FIELDS.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field]) !== JSON.stringify((latestConfig as Record<string, unknown>)[field]),\n );\n\n if (changedFields.length > 0) {\n const newVersionId = globalThis.crypto?.randomUUID\n ? globalThis.crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n await this.createVersion({\n id: newVersionId,\n workspaceId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...(newConfig as object),\n changedFields: [...changedFields],\n changeMessage: `Updated ${changedFields.join(', ')}`,\n } as CreateWorkspaceVersionInput);\n }\n }\n\n const data: Record<string, unknown> = { updatedAt: new Date() };\n if (authorId !== undefined) data.authorId = authorId;\n if (activeVersionId !== undefined) {\n data.activeVersionId = activeVersionId;\n // Auto-publish when an active version is set (consistent with other adapters).\n if (status === undefined) data.status = 'published';\n }\n if (status !== undefined) data.status = status;\n if (metadata !== undefined) {\n data.metadata = { ...(existing.metadata || {}), ...metadata };\n }\n\n await this.db.update({ tableName: TABLE_WORKSPACES, keys: { id }, data });\n\n const updated = await this.getById(id);\n if (!updated) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKSPACE', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Workspace ${id} not found after update`,\n details: { workspaceId: id },\n });\n }\n return updated;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'UPDATE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId: id },\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n await this.db.runWithAbortRetry(() =>\n this.database.runTransactionAsync(async tx => {\n try {\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')} WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId`,\n params: { workspaceId: id },\n });\n await tx.runUpdate({\n sql: `DELETE FROM ${quoteIdent(TABLE_WORKSPACES, 'table name')} WHERE id = @id`,\n params: { id },\n });\n await tx.commit();\n } catch (err) {\n await tx.rollback().catch(() => {});\n throw err;\n }\n }),\n );\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_WORKSPACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListWorkspacesInput): Promise<StorageListWorkspacesOutput> {\n const { page = 0, perPage: perPageInput, orderBy, authorId, metadata } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_WORKSPACES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = quoteIdent(TABLE_WORKSPACES, 'table name');\n const conditions: string[] = [];\n const params: Record<string, any> = {};\n\n if (authorId !== undefined) {\n conditions.push(`${quoteIdent('authorId', 'column name')} = @authorId`);\n params.authorId = authorId;\n }\n if (metadata && Object.keys(metadata).length > 0) {\n let i = 0;\n for (const [key, value] of Object.entries(metadata)) {\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)) {\n throw new MastraError({\n id: createStorageErrorId('SPANNER', 'LIST_WORKSPACES', 'INVALID_METADATA_KEY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Invalid metadata key: ${key}. Keys must be alphanumeric with underscores.`,\n details: { key },\n });\n }\n const param = `m${i++}`;\n conditions.push(`JSON_VALUE(${quoteIdent('metadata', 'column name')}, '$.${key}') = @${param}`);\n params[param] = typeof value === 'string' ? value : JSON.stringify(value);\n }\n }\n\n const whereSql = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} ${whereSql}`,\n params,\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { workspaces: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const dirSql = (direction || 'DESC').toUpperCase() === 'ASC' ? 'ASC' : 'DESC';\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName} ${whereSql}\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { ...params, limit, offset },\n json: true,\n });\n const workspaces = (rows as Array<Record<string, any>>).map(r => this.parseWorkspaceRow(r));\n return {\n workspaces,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_WORKSPACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async createVersion(input: CreateWorkspaceVersionInput): Promise<WorkspaceVersion> {\n try {\n const now = new Date();\n await this.db.insert({\n tableName: TABLE_WORKSPACE_VERSIONS,\n record: {\n id: input.id,\n workspaceId: input.workspaceId,\n versionNumber: input.versionNumber,\n name: input.name,\n description: input.description ?? null,\n filesystem: input.filesystem ?? null,\n sandbox: input.sandbox ?? null,\n mounts: input.mounts ?? null,\n search: input.search ?? null,\n skills: input.skills ?? null,\n tools: input.tools ?? null,\n autoSync: input.autoSync ?? false,\n operationTimeout: input.operationTimeout ?? null,\n changedFields: input.changedFields ?? null,\n changeMessage: input.changeMessage ?? null,\n createdAt: now,\n },\n });\n return { ...input, createdAt: now } as WorkspaceVersion;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'CREATE_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: input.id, workspaceId: input.workspaceId },\n },\n error,\n );\n }\n }\n\n async getVersion(id: string): Promise<WorkspaceVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')} WHERE id = @id LIMIT 1`,\n params: { id },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async getVersionByNumber(workspaceId: string, versionNumber: number): Promise<WorkspaceVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')}\n WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId\n AND ${quoteIdent('versionNumber', 'column name')} = @versionNumber\n LIMIT 1`,\n params: { workspaceId, versionNumber },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_WORKSPACE_VERSION_BY_NUMBER', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId, versionNumber },\n },\n error,\n );\n }\n }\n\n async getLatestVersion(workspaceId: string): Promise<WorkspaceVersion | null> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')}\n WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId\n ORDER BY ${quoteIdent('versionNumber', 'column name')} DESC\n LIMIT 1`,\n params: { workspaceId },\n json: true,\n });\n const row = (rows as Array<Record<string, any>>)[0];\n return row ? this.parseVersionRow(row) : null;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'GET_WORKSPACE_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListWorkspaceVersionsInput): Promise<ListWorkspaceVersionsOutput> {\n const { workspaceId, page = 0, perPage: perPageInput, orderBy } = input;\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_WORKSPACE_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const dirSql = direction === 'ASC' ? 'ASC' : 'DESC';\n const tableName = quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name');\n\n const [countRows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${tableName} WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId`,\n params: { workspaceId },\n json: true,\n });\n const total = Number((countRows as Array<{ count: number | string }>)[0]?.count ?? 0);\n if (total === 0) {\n return { versions: [], total: 0, page, perPage: perPageForResponse, hasMore: false };\n }\n\n const limit = perPageInput === false ? total : perPage;\n const [rows] = await this.database.run({\n sql: `SELECT * FROM ${tableName}\n WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId\n ORDER BY ${quoteIdent(field, 'column name')} ${dirSql}, id ${dirSql}\n LIMIT @limit OFFSET @offset`,\n params: { workspaceId, limit, offset },\n json: true,\n });\n const versions = (rows as Array<Record<string, any>>).map(r => this.parseVersionRow(r));\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'LIST_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId },\n },\n error,\n );\n }\n }\n\n async deleteVersion(id: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')} WHERE id = @id`,\n params: { id },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_WORKSPACE_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { versionId: id },\n },\n error,\n );\n }\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n await this.db.runDml({\n sql: `DELETE FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')} WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId`,\n params: { workspaceId: entityId },\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'DELETE_WORKSPACE_VERSIONS_BY_PARENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(workspaceId: string): Promise<number> {\n try {\n const [rows] = await this.database.run({\n sql: `SELECT COUNT(*) AS count FROM ${quoteIdent(TABLE_WORKSPACE_VERSIONS, 'table name')} WHERE ${quoteIdent('workspaceId', 'column name')} = @workspaceId`,\n params: { workspaceId },\n json: true,\n });\n return Number((rows as Array<{ count: number | string }>)[0]?.count ?? 0);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'COUNT_WORKSPACE_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { workspaceId },\n },\n error,\n );\n }\n }\n}\n","import { Spanner } from '@google-cloud/spanner';\nimport type { Database, Instance } from '@google-cloud/spanner';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains, CreateIndexOptions } from '@mastra/core/storage';\n\nimport type { SpannerInitMode } from './db';\nimport { AgentsSpanner } from './domains/agents';\nimport { BackgroundTasksSpanner } from './domains/background-tasks';\nimport { BlobsSpanner } from './domains/blobs';\nimport { ChannelsSpanner } from './domains/channels';\nimport { DatasetsSpanner } from './domains/datasets';\nimport { ExperimentsSpanner } from './domains/experiments';\nimport { FavoritesSpanner } from './domains/favorites';\nimport { MCPClientsSpanner } from './domains/mcp-clients';\nimport { MCPServersSpanner } from './domains/mcp-servers';\nimport { MemorySpanner } from './domains/memory';\nimport { ObservabilitySpanner } from './domains/observability';\nimport { PromptBlocksSpanner } from './domains/prompt-blocks';\nimport { SchedulesSpanner } from './domains/schedules';\nimport { ScorerDefinitionsSpanner } from './domains/scorer-definitions';\nimport { ScoresSpanner } from './domains/scores';\nimport { SkillsSpanner } from './domains/skills';\nimport { WorkflowsSpanner } from './domains/workflows';\nimport { WorkspacesSpanner } from './domains/workspaces';\n\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsSpanner,\n BackgroundTasksSpanner,\n BlobsSpanner,\n ChannelsSpanner,\n DatasetsSpanner,\n ExperimentsSpanner,\n FavoritesSpanner,\n MCPClientsSpanner,\n MCPServersSpanner,\n MemorySpanner,\n ObservabilitySpanner,\n PromptBlocksSpanner,\n SchedulesSpanner,\n ScorerDefinitionsSpanner,\n ScoresSpanner,\n SkillsSpanner,\n WorkflowsSpanner,\n WorkspacesSpanner,\n};\nexport type { SpannerDomainConfig, SpannerInitMode } from './db';\n\n/** Domain keys this adapter implements; the only valid values for `enabledDomains`. */\nexport const SPANNER_DOMAIN_KEYS = [\n 'scores',\n 'workflows',\n 'memory',\n 'backgroundTasks',\n 'agents',\n 'mcpClients',\n 'mcpServers',\n 'skills',\n 'blobs',\n 'promptBlocks',\n 'scorerDefinitions',\n 'schedules',\n 'observability',\n 'channels',\n 'datasets',\n 'experiments',\n 'favorites',\n 'workspaces',\n] as const satisfies ReadonlyArray<keyof StorageDomains>;\n\nexport type SpannerDomainKey = (typeof SPANNER_DOMAIN_KEYS)[number];\n\n/**\n * Cloud Spanner configuration accepted by `SpannerStore`.\n *\n * Supports either:\n * - Pre-configured `database` (a `@google-cloud/spanner` Database handle), or\n * - Connection details (`projectId`, `instanceId`, `databaseId`) from which the\n * store creates a Spanner client internally.\n */\nexport type SpannerConfigType = {\n id: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n *\n * When `disableInit` is true, the store will not automatically create or alter\n * tables on first use. You must call `storage.init()` explicitly during a\n * separate deploy/migration step.\n */\n disableInit?: boolean;\n /**\n * When true, default indexes will not be created during initialization.\n * @default false\n */\n skipDefaultIndexes?: boolean;\n /**\n * Custom indexes to create during initialization. Each index must specify the\n * table it belongs to; the store routes indexes to the correct domain.\n */\n indexes?: CreateIndexOptions[];\n /**\n * Controls whether `init()` is allowed to apply schema changes.\n *\n * - `'sync'` (default): the adapter creates missing tables, columns, and\n * indexes during `init()`. This is the historical behavior.\n * - `'validate'`: the adapter applies no DDL during `init()` and instead\n * verifies that every table, column, and default/custom index it would\n * have created already exists. Missing schema elements throw a typed\n * user error so the operator can reconcile the externally-managed\n * schema with what the adapter expects.\n *\n * `'validate'` is intended for environments where another process\n * (Terraform, Liquibase, a release pipeline, etc.) owns the schema.\n * @default 'sync'\n */\n initMode?: SpannerInitMode;\n /**\n * When true, versioned domains (agents / skills / prompt-blocks /\n * mcp-clients / mcp-servers / scorer-definitions) sweep orphaned draft\n * thin-row records during `init()` i.e. drafts whose paired version\n * row was never written. The transactional `create()` rewrite makes\n * these orphans impossible going forward; this opt-in is for cleaning\n * up legacy data left by older deployments or for environments where\n * the small startup cost is acceptable.\n * @default false\n */\n cleanupStaleDraftsOnStartup?: boolean;\n /**\n * Restricts which storage domains this adapter constructs and initializes.\n *\n * When omitted (the default), all domains the adapter implements are\n * registered, matching historical behavior. When provided, only the listed\n * domains are constructed and added to `this.stores`; `init()` will only\n * touch those domains, and `getStore()` returns `undefined` for the rest.\n *\n * Useful when another store owns some domains in a composite, or when the\n * deployment environment manages only a subset of the schema (e.g. a\n * workflows-only Spanner database in `initMode: 'validate'`, where\n * validating tables for unused domains would fail).\n */\n enabledDomains?: ReadonlyArray<SpannerDomainKey>;\n /**\n * Maximum acceptable staleness (in milliseconds) for the observability\n * domain's read paths (metrics list / aggregates / breakdowns /\n * time-series / percentiles / discovery). When set to a positive value,\n * those queries run as bounded-staleness single-use reads, which Spanner\n * can route to any replica that's at least that fresh. They stop\n * competing with leader-region writes for CPU and can land on a closer\n * replica.\n *\n * Default is `10000` (weak reads against the leader).\n * @default 10000\n */\n dashboardStalenessMs?: number;\n /**\n * When true (the default), the observability domain's metric methods\n * throw `*_NOT_IMPLEMENTED` and the metrics table is not created during\n * `init()`. The `MastraStorageExporter` reads those errors and silently\n * drops metric emissions.\n *\n * This is the recommended default because Spanner is row-oriented and\n * OLTP-shaped — the metrics workload is write-heavy, scan-heavy, and\n * benefits from columnar storage. Pair Spanner spans with a dedicated\n * OLAP metrics store (DuckDB, ClickHouse) via a\n * `MastraCompositeStore`-level wrapper that fans out by signal.\n * @default true\n */\n disableMetrics?: boolean;\n} & (\n | {\n /** Pre-configured Spanner Database handle. */\n database: Database;\n }\n | {\n projectId: string;\n instanceId: string;\n databaseId: string;\n /**\n * Optional pass-through to the `@google-cloud/spanner` client constructor.\n * Useful for credentials, custom service paths (e.g. against the emulator),\n * or auth overrides.\n */\n spannerOptions?: ConstructorParameters<typeof Spanner>[0];\n }\n);\n\nexport type SpannerConfig = SpannerConfigType;\n\nconst isPreConfiguredDatabase = (config: SpannerConfigType): config is SpannerConfigType & { database: Database } =>\n 'database' in config && !!(config as any).database;\n\n/**\n * Google Cloud Spanner storage adapter for Mastra. Implements the GoogleSQL\n * dialect of Cloud Spanner.\n *\n * @example\n * ```typescript\n * const storage = new SpannerStore({\n * id: 'my-store',\n * projectId: 'my-project',\n * instanceId: 'my-instance',\n * databaseId: 'mastra',\n * });\n *\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n * ```\n */\nexport class SpannerStore extends MastraCompositeStore {\n public database: Database;\n public spanner?: Spanner;\n public instance?: Instance;\n private readonly ownsClient: boolean;\n stores: StorageDomains;\n\n constructor(config: SpannerConfigType) {\n if (!config.id || config.id.trim() === '') {\n throw new Error('SpannerStore: id must be provided and cannot be empty.');\n }\n super({ id: config.id, name: 'SpannerStore', disableInit: config.disableInit });\n try {\n if (isPreConfiguredDatabase(config)) {\n this.database = config.database;\n this.ownsClient = false;\n } else {\n for (const key of ['projectId', 'instanceId', 'databaseId'] as const) {\n if (!(key in config) || typeof (config as any)[key] !== 'string' || (config as any)[key].trim() === '') {\n throw new Error(`SpannerStore: ${key} must be provided and cannot be empty.`);\n }\n }\n this.spanner = new Spanner({\n projectId: config.projectId,\n ...(config.spannerOptions ?? {}),\n });\n this.instance = this.spanner.instance(config.instanceId);\n this.database = this.instance.database(config.databaseId);\n this.ownsClient = true;\n }\n\n const domainConfig = {\n database: this.database,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n initMode: config.initMode,\n cleanupStaleDraftsOnStartup: config.cleanupStaleDraftsOnStartup,\n dashboardStalenessMs: config.dashboardStalenessMs,\n disableMetrics: config.disableMetrics,\n };\n\n let enabled: Set<SpannerDomainKey> | null = null;\n if (config.enabledDomains) {\n enabled = new Set();\n for (const key of config.enabledDomains) {\n if (!(SPANNER_DOMAIN_KEYS as readonly string[]).includes(key)) {\n throw new Error(\n `SpannerStore: enabledDomains contains unknown domain '${key}'. Valid keys: ${SPANNER_DOMAIN_KEYS.join(', ')}.`,\n );\n }\n enabled.add(key);\n }\n if (enabled.size === 0) {\n throw new Error('SpannerStore: enabledDomains must contain at least one domain when provided.');\n }\n }\n const wants = (key: SpannerDomainKey) => enabled === null || enabled.has(key);\n\n this.stores = {\n ...(wants('scores') && { scores: new ScoresSpanner(domainConfig) }),\n ...(wants('workflows') && { workflows: new WorkflowsSpanner(domainConfig) }),\n ...(wants('memory') && { memory: new MemorySpanner(domainConfig) }),\n ...(wants('backgroundTasks') && { backgroundTasks: new BackgroundTasksSpanner(domainConfig) }),\n ...(wants('agents') && { agents: new AgentsSpanner(domainConfig) }),\n ...(wants('mcpClients') && { mcpClients: new MCPClientsSpanner(domainConfig) }),\n ...(wants('mcpServers') && { mcpServers: new MCPServersSpanner(domainConfig) }),\n ...(wants('skills') && { skills: new SkillsSpanner(domainConfig) }),\n ...(wants('blobs') && { blobs: new BlobsSpanner(domainConfig) }),\n ...(wants('promptBlocks') && { promptBlocks: new PromptBlocksSpanner(domainConfig) }),\n ...(wants('scorerDefinitions') && { scorerDefinitions: new ScorerDefinitionsSpanner(domainConfig) }),\n ...(wants('schedules') && { schedules: new SchedulesSpanner(domainConfig) }),\n ...(wants('observability') && { observability: new ObservabilitySpanner(domainConfig) }),\n ...(wants('channels') && { channels: new ChannelsSpanner(domainConfig) }),\n ...(wants('datasets') && { datasets: new DatasetsSpanner(domainConfig) }),\n ...(wants('experiments') && { experiments: new ExperimentsSpanner(domainConfig) }),\n ...(wants('favorites') && { favorites: new FavoritesSpanner(domainConfig) }),\n ...(wants('workspaces') && { workspaces: new WorkspacesSpanner(domainConfig) }),\n };\n } catch (e) {\n throw new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n e,\n );\n }\n }\n\n /**\n * Initializes the storage by running each domain's `init()` sequentially.\n *\n * Spanner does not allow concurrent schema changes against the same database,\n * so the default `MastraCompositeStore.init()` (which fans out via\n * `Promise.all`) cannot be used here.\n *\n * Concurrent callers all await the same in-flight promise: the first call\n * installs a pending `hasInitialized` immediately, before any awaits, so a\n * second caller landing on `init()` sees it and queues behind the same loop\n * instead of starting its own.\n */\n async init(): Promise<void> {\n if ((this as any).shouldCacheInit && (this as any).hasInitialized) {\n await (this as any).hasInitialized;\n return;\n }\n\n let resolveInit!: (value: boolean) => void;\n let rejectInit!: (reason: unknown) => void;\n const pending = new Promise<boolean>((resolve, reject) => {\n resolveInit = resolve;\n rejectInit = reject;\n });\n // Install the pending promise before any await, so concurrent init() calls\n // observe it and wait on the same loop.\n (this as any).hasInitialized = pending;\n // Concurrent callers attach their own .then/.catch via `await`, but the\n // root throw below propagates to the current call. Attach a no-op catch\n // here so a rejected `pending` without other awaiters is not flagged as\n // an unhandled rejection.\n pending.catch(() => {});\n\n try {\n // Initialize domains sequentially to avoid concurrent DDL errors in Spanner.\n const domainOrder: Array<keyof StorageDomains> = [\n 'memory',\n 'workflows',\n 'scores',\n 'backgroundTasks',\n 'agents',\n 'mcpClients',\n 'mcpServers',\n 'skills',\n 'blobs',\n 'promptBlocks',\n 'scorerDefinitions',\n 'schedules',\n 'observability',\n 'channels',\n 'datasets',\n 'experiments',\n 'workspaces',\n 'favorites',\n ];\n for (const key of domainOrder) {\n const store = this.stores?.[key];\n if (store) {\n await store.init();\n }\n }\n resolveInit(true);\n } catch (error) {\n // Allow a future init() call to retry the loop after a failure.\n (this as any).hasInitialized = null;\n const wrapped =\n error instanceof MastraError\n ? error\n : new MastraError(\n {\n id: createStorageErrorId('SPANNER', 'INIT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n rejectInit(wrapped);\n throw wrapped;\n }\n }\n\n /**\n * Closes the Spanner client and database handle if this store owns them.\n * Pre-configured databases are left alone for the caller to manage.\n */\n async close() {\n if (!this.ownsClient) return;\n try {\n await this.database.close();\n if (this.spanner) {\n // Spanner node lib wraps most functions (including this one with PromisifyAll), but currently there's a bug that causes awaiting on it to hand indefinitely.\n // Current workaround is to just call it without await https://github.com/googleapis/google-cloud-node/issues/8106\n this.spanner.close();\n }\n } catch (error) {\n throw error;\n }\n }\n}\n"]}