@mastra/pg 1.3.0 → 1.4.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.
Files changed (33) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/dist/docs/SKILL.md +1 -1
  3. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  4. package/dist/index.cjs +2423 -180
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.js +2422 -182
  7. package/dist/index.js.map +1 -1
  8. package/dist/storage/db/index.d.ts +23 -4
  9. package/dist/storage/db/index.d.ts.map +1 -1
  10. package/dist/storage/domains/agents/index.d.ts +5 -0
  11. package/dist/storage/domains/agents/index.d.ts.map +1 -1
  12. package/dist/storage/domains/datasets/index.d.ts +48 -0
  13. package/dist/storage/domains/datasets/index.d.ts.map +1 -0
  14. package/dist/storage/domains/experiments/index.d.ts +34 -0
  15. package/dist/storage/domains/experiments/index.d.ts.map +1 -0
  16. package/dist/storage/domains/mcp-clients/index.d.ts +33 -0
  17. package/dist/storage/domains/mcp-clients/index.d.ts.map +1 -0
  18. package/dist/storage/domains/memory/index.d.ts +10 -0
  19. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  20. package/dist/storage/domains/observability/index.d.ts +10 -0
  21. package/dist/storage/domains/observability/index.d.ts.map +1 -1
  22. package/dist/storage/domains/prompt-blocks/index.d.ts +10 -0
  23. package/dist/storage/domains/prompt-blocks/index.d.ts.map +1 -1
  24. package/dist/storage/domains/scorer-definitions/index.d.ts +10 -0
  25. package/dist/storage/domains/scorer-definitions/index.d.ts.map +1 -1
  26. package/dist/storage/domains/scores/index.d.ts +10 -0
  27. package/dist/storage/domains/scores/index.d.ts.map +1 -1
  28. package/dist/storage/domains/workflows/index.d.ts +5 -0
  29. package/dist/storage/domains/workflows/index.d.ts.map +1 -1
  30. package/dist/storage/index.d.ts +10 -2
  31. package/dist/storage/index.d.ts.map +1 -1
  32. package/dist/storage/test-utils.d.ts.map +1 -1
  33. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config.ts","../src/vector/filter.ts","../src/vector/sql-builder.ts","../src/vector/index.ts","../src/storage/client.ts","../src/storage/db/constraint-utils.ts","../src/storage/db/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","result","parseFieldKey","conditions","operator","operatorValue","operatorFn","operatorResult","MastraVector","pg","error","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory","Mutex","parseSqlIdentifier","validateTopK","validateUpsertInput","mastraError","xxhash","installedSchema","existingSchema","Pool","getSqlType","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","TABLE_SCHEMAS","MastraBase","getDefaultValue","createStorageErrorId","quotedCol","getSchemaName","getTableName","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","normalizePerPage","calculatePagination","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MessageList","randomUUID","ObservabilityStorage","listTracesArgsSchema","TraceStatus","toTraceSpans","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","SNAPSHOT_FIELDS","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","coreTransformScoreRow","ScoresStorage","TABLE_SCORERS","saveScorePayloadSchema","WorkflowsStorage","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ConnectionOptions } from 'node:tls';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport type { ClientConfig, Pool, PoolConfig } from 'pg';\n\n/**\n * Base configuration options shared across PostgreSQL configs.\n */\nexport interface PostgresBaseConfig {\n id: string;\n schemaName?: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new PostgresStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new PostgresStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n /**\n * When true, default indexes will not be created during initialization.\n * This is useful when:\n * 1. You want to manage indexes separately or use custom indexes only\n * 2. Default indexes don't match your query patterns\n * 3. You want to reduce initialization time in development\n *\n * @default false\n */\n skipDefaultIndexes?: boolean;\n /**\n * Custom indexes to create during initialization.\n * These indexes are created in addition to default indexes (unless skipDefaultIndexes is true).\n *\n * Each index must specify which table it belongs to. The store will route each index\n * to the appropriate domain based on the table name.\n *\n * @example\n * ```typescript\n * const store = new PostgresStore({\n * connectionString: '...',\n * indexes: [\n * { name: 'my_threads_type_idx', table: 'mastra_threads', columns: ['metadata->>\\'type\\''] },\n * { name: 'my_messages_status_idx', table: 'mastra_messages', columns: ['metadata->>\\'status\\''] },\n * ],\n * });\n * ```\n */\n indexes?: CreateIndexOptions[];\n}\n\n/**\n * Connection string configuration.\n */\nexport interface ConnectionStringConfig extends PostgresBaseConfig {\n connectionString: string;\n ssl?: boolean | ConnectionOptions;\n max?: number;\n idleTimeoutMillis?: number;\n}\n\n/**\n * Host-based configuration.\n */\nexport interface HostConfig extends PostgresBaseConfig {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | ConnectionOptions;\n max?: number;\n idleTimeoutMillis?: number;\n}\n\n/**\n * Pre-configured pg.Pool configuration.\n */\nexport interface PoolInstanceConfig extends PostgresBaseConfig {\n /**\n * Pre-configured pg.Pool instance.\n * Use this for direct control over the connection pool, or for\n * integration with libraries that expect a pg.Pool.\n *\n * @example\n * ```typescript\n * import { Pool } from 'pg';\n *\n * const pool = new Pool({ connectionString: '...' });\n * const store = new PostgresStore({ id: 'my-store', pool });\n *\n * // Use store.pool for other libraries that need a pg.Pool\n * ```\n */\n pool: Pool;\n}\n\n/**\n * PostgreSQL configuration for PostgresStore.\n *\n * Accepts either:\n * - A pre-configured pg.Pool: `{ id, pool, schemaName? }`\n * - Connection string: `{ id, connectionString, ... }`\n * - Host/port config: `{ id, host, port, database, user, password, ... }`\n * - Cloud SQL connector config: `{ id, stream, ... }` (via pg.ClientConfig)\n */\nexport type PostgresStoreConfig =\n | PoolInstanceConfig\n | ConnectionStringConfig\n | HostConfig\n | (PostgresBaseConfig & ClientConfig);\n\n/**\n * PostgreSQL configuration for PgVector (uses pg with ConnectionOptions)\n */\nexport type PgVectorConfig = (ConnectionStringConfig | HostConfig | (PostgresBaseConfig & ClientConfig)) & {\n pgPoolOptions?: Omit<PoolConfig, 'connectionString'>;\n};\n\n/**\n * Type guard for pre-configured pg.Pool config\n */\nexport const isPoolConfig = (cfg: PostgresStoreConfig): cfg is PoolInstanceConfig => {\n return 'pool' in cfg;\n};\n\n/**\n * Type guard for connection string config\n */\nexport const isConnectionStringConfig = (cfg: PostgresStoreConfig): cfg is ConnectionStringConfig => {\n return 'connectionString' in cfg && typeof cfg.connectionString === 'string';\n};\n\n/**\n * Type guard for host-based config\n */\nexport const isHostConfig = (cfg: PostgresStoreConfig): cfg is HostConfig => {\n return 'host' in cfg && 'database' in cfg && 'user' in cfg && 'password' in cfg;\n};\n\n/**\n * Type guard for Cloud SQL connector config\n */\nexport const isCloudSqlConfig = (cfg: PostgresStoreConfig): cfg is PostgresBaseConfig & ClientConfig => {\n return 'stream' in cfg || ('password' in cfg && typeof cfg.password === 'function');\n};\n\n/**\n * Validate PostgresStore configuration.\n */\nexport const validateConfig = (name: string, config: PostgresStoreConfig) => {\n if (!config.id || typeof config.id !== 'string' || config.id.trim() === '') {\n throw new Error(`${name}: id must be provided and cannot be empty.`);\n }\n\n // Pool config: user provides pre-configured pg.Pool\n if (isPoolConfig(config)) {\n if (!config.pool) {\n throw new Error(`${name}: pool must be provided when using pool config.`);\n }\n return; // Valid pool config\n }\n\n if (isConnectionStringConfig(config)) {\n if (\n !config.connectionString ||\n typeof config.connectionString !== 'string' ||\n config.connectionString.trim() === ''\n ) {\n throw new Error(\n `${name}: connectionString must be provided and cannot be empty. Passing an empty string may cause fallback to local Postgres defaults.`,\n );\n }\n } else if (isCloudSqlConfig(config)) {\n // valid connector config; no-op\n } else if (isHostConfig(config)) {\n const required = ['host', 'database', 'user', 'password'] as const;\n for (const key of required) {\n if (!config[key] || typeof config[key] !== 'string' || config[key].trim() === '') {\n throw new Error(\n `${name}: ${key} must be provided and cannot be empty. Passing an empty string may cause fallback to local Postgres defaults.`,\n );\n }\n }\n } else {\n throw new Error(\n `${name}: invalid config. Provide either {pool}, {connectionString}, {host,port,database,user,password}, or a pg ClientConfig (e.g., Cloud SQL connector with \\`stream\\`).`,\n );\n }\n};\n","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n OperatorSupport,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n VectorFieldValue,\n} from '@mastra/core/vector/filter';\n\ntype PGOperatorValueMap = Omit<OperatorValueMap, '$in' | '$all' | '$nin' | '$eq' | '$ne'> & {\n $size: number;\n $contains: VectorFieldValue | Record<string, unknown>;\n $all: VectorFieldValue;\n $in: VectorFieldValue;\n $nin: VectorFieldValue;\n $eq: VectorFieldValue;\n $ne: VectorFieldValue;\n};\n\ntype PGBlacklisted = BlacklistedRootOperators | '$contains' | '$size';\n\ntype PGFilterValue = VectorFieldValue | RegExp;\n\nexport type PGVectorFilter = VectorFilter<\n keyof PGOperatorValueMap,\n PGOperatorValueMap,\n LogicalOperatorValueMap,\n PGBlacklisted,\n PGFilterValue\n>;\n\n/**\n * Translates MongoDB-style filters to PG compatible filters.\n *\n * Key differences from MongoDB:\n *\n * Logical Operators ($and, $or, $nor):\n * - Can be used at the top level or nested within fields\n * - Can take either a single condition or an array of conditions\n *\n */\nexport class PGFilterTranslator extends BaseFilterTranslator<PGVectorFilter> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n custom: ['$contains', '$size'],\n };\n }\n\n translate(filter?: PGVectorFilter): PGVectorFilter {\n if (this.isEmpty(filter)) {\n return filter;\n }\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private translateNode(node: PGVectorFilter, currentPath: string = ''): any {\n // Helper to wrap result with path if needed\n const withPath = (result: any) => (currentPath ? { [currentPath]: result } : result);\n\n // Handle primitives\n if (this.isPrimitive(node)) {\n return withPath({ $eq: this.normalizeComparisonValue(node) });\n }\n\n // Handle arrays\n if (Array.isArray(node)) {\n return withPath({ $in: this.normalizeArrayValues(node) });\n }\n\n // Handle regex\n if (node instanceof RegExp) {\n return withPath(this.translateRegexPattern(node.source, node.flags));\n }\n\n const entries = Object.entries(node as Record<string, any>);\n const result: Record<string, any> = {};\n\n if (node && '$options' in node && !('$regex' in node)) {\n throw new Error('$options is not valid without $regex');\n }\n\n // Handle special regex object format\n if (node && '$regex' in node) {\n const options = (node as any).$options || '';\n return withPath(this.translateRegexPattern((node as any).$regex, options));\n }\n\n // Process remaining entries\n for (const [key, value] of entries) {\n // Skip options as they're handled with $regex\n if (key === '$options') continue;\n\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n\n if (this.isLogicalOperator(key)) {\n result[key] = Array.isArray(value)\n ? value.map((filter: VectorFilter) => this.translateNode(filter))\n : this.translateNode(value);\n } else if (this.isOperator(key)) {\n if (this.isArrayOperator(key) && !Array.isArray(value) && key !== '$elemMatch') {\n result[key] = [value];\n } else if (this.isBasicOperator(key) && Array.isArray(value)) {\n result[key] = JSON.stringify(value);\n } else {\n result[key] = value;\n }\n } else if (typeof value === 'object' && value !== null) {\n // Handle nested objects\n const hasOperators = Object.keys(value).some(k => this.isOperator(k));\n if (hasOperators) {\n result[newPath] = this.translateNode(value);\n } else {\n Object.assign(result, this.translateNode(value, newPath));\n }\n } else {\n result[newPath] = this.translateNode(value);\n }\n }\n\n return result;\n }\n\n private translateRegexPattern(pattern: string, options: string = ''): any {\n if (!options) return { $regex: pattern };\n\n const flags = options\n .split('')\n .filter(f => 'imsux'.includes(f))\n .join('');\n\n return { $regex: flags ? `(?${flags})${pattern}` : pattern };\n }\n}\n","import { parseFieldKey } from '@mastra/core/utils';\nimport type {\n BasicOperator,\n NumericOperator,\n ArrayOperator,\n ElementOperator,\n LogicalOperator,\n RegexOperator,\n VectorFilter,\n} from '@mastra/core/vector/filter';\nimport type { PGVectorFilter } from './filter';\n\ntype OperatorType =\n | BasicOperator\n | NumericOperator\n | ArrayOperator\n | ElementOperator\n | LogicalOperator\n | '$contains'\n | Exclude<RegexOperator, '$options'>\n | '$size';\n\ntype FilterOperator = {\n sql: string;\n needsValue: boolean;\n transformValue?: () => any;\n};\n\ntype OperatorFn = (key: string, paramIndex: number, value?: any) => FilterOperator;\n\nconst createBasicOperator = (symbol: string) => {\n return (key: string, paramIndex: number) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `CASE \n WHEN $${paramIndex}::text IS NULL THEN metadata#>>'{${jsonPathKey}}' IS ${symbol === '=' ? '' : 'NOT'} NULL\n ELSE metadata#>>'{${jsonPathKey}}' ${symbol} $${paramIndex}::text\n END`,\n needsValue: true,\n };\n };\n};\n\nconst createNumericOperator = (symbol: string) => {\n return (key: string, paramIndex: number, value?: any) => {\n const jsonPathKey = parseJsonPathKey(key);\n\n // Check if the value is a number or can be parsed as a number\n const isNumeric =\n typeof value === 'number' || (typeof value === 'string' && !isNaN(Number(value)) && value.trim() !== '');\n\n // Use numeric comparison for numbers, text comparison for strings/dates\n if (isNumeric) {\n return {\n sql: `(metadata#>>'{${jsonPathKey}}')::numeric ${symbol} $${paramIndex}::numeric`,\n needsValue: true,\n };\n } else {\n // Use text comparison for strings (including ISO 8601 dates which sort correctly)\n return {\n sql: `metadata#>>'{${jsonPathKey}}' ${symbol} $${paramIndex}::text`,\n needsValue: true,\n };\n }\n };\n};\n\nfunction buildElemMatchConditions(value: any, paramIndex: number): { sql: string; values: any[] } {\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('$elemMatch requires an object with conditions');\n }\n\n const conditions: string[] = [];\n const values: any[] = [];\n\n Object.entries(value).forEach(([field, val]) => {\n const nextParamIndex = paramIndex + values.length;\n\n let paramOperator;\n let paramKey;\n let paramValue;\n\n if (field.startsWith('$')) {\n paramOperator = field;\n paramKey = '';\n paramValue = val;\n } else if (typeof val === 'object' && !Array.isArray(val)) {\n const [op, opValue] = Object.entries(val || {})[0] || [];\n paramOperator = op;\n paramKey = field;\n paramValue = opValue;\n } else {\n paramOperator = '$eq';\n paramKey = field;\n paramValue = val;\n }\n\n const operatorFn = FILTER_OPERATORS[paramOperator as OperatorType];\n if (!operatorFn) {\n throw new Error(`Invalid operator: ${paramOperator}`);\n }\n const result = operatorFn(paramKey, nextParamIndex, paramValue);\n\n const sql = result.sql.replaceAll('metadata#>>', 'elem#>>');\n conditions.push(sql);\n if (result.needsValue) {\n values.push(paramValue);\n }\n });\n\n return {\n sql: conditions.join(' AND '),\n values,\n };\n}\n\n// Define all filter operators\nconst FILTER_OPERATORS: Record<OperatorType, OperatorFn> = {\n $eq: createBasicOperator('='),\n $ne: createBasicOperator('!='),\n $gt: createNumericOperator('>'),\n $gte: createNumericOperator('>='),\n $lt: createNumericOperator('<'),\n $lte: createNumericOperator('<='),\n\n // Array Operators\n $in: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata->'${jsonPathKey}') = 'array' THEN\n EXISTS (\n SELECT 1 FROM jsonb_array_elements_text(metadata->'${jsonPathKey}') as elem\n WHERE elem = ANY($${paramIndex}::text[])\n )\n ELSE metadata#>>'{${jsonPathKey}}' = ANY($${paramIndex}::text[])\n END\n )`,\n needsValue: true,\n };\n },\n $nin: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata->'${jsonPathKey}') = 'array' THEN\n NOT EXISTS (\n SELECT 1 FROM jsonb_array_elements_text(metadata->'${jsonPathKey}') as elem\n WHERE elem = ANY($${paramIndex}::text[])\n )\n ELSE metadata#>>'{${jsonPathKey}}' != ALL($${paramIndex}::text[])\n END\n )`,\n needsValue: true,\n };\n },\n $all: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `CASE WHEN array_length($${paramIndex}::text[], 1) IS NULL THEN false \n ELSE (metadata#>'{${jsonPathKey}}')::jsonb ?& $${paramIndex}::text[] END`,\n needsValue: true,\n };\n },\n $elemMatch: (key: string, paramIndex: number, value: any): FilterOperator => {\n const { sql, values } = buildElemMatchConditions(value, paramIndex);\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata->'${jsonPathKey}') = 'array' THEN\n EXISTS (\n SELECT 1 \n FROM jsonb_array_elements(metadata->'${jsonPathKey}') as elem\n WHERE ${sql}\n )\n ELSE FALSE\n END\n )`,\n needsValue: true,\n transformValue: () => values,\n };\n },\n // Element Operators\n $exists: (key, paramIndex, value) => {\n const jsonPathKey = parseJsonPathKey(key);\n // If value is false, check that the key does NOT exist\n if (value === false) {\n return {\n sql: `NOT (metadata ? '${jsonPathKey}')`,\n needsValue: false,\n };\n }\n // Otherwise (true or truthy), check that the key exists\n return {\n sql: `metadata ? '${jsonPathKey}'`,\n needsValue: false,\n };\n },\n\n // Logical Operators\n $and: key => ({ sql: `(${key})`, needsValue: false }),\n $or: key => ({ sql: `(${key})`, needsValue: false }),\n $not: key => ({ sql: `NOT (${key})`, needsValue: false }),\n $nor: key => ({ sql: `NOT (${key})`, needsValue: false }),\n\n // Regex Operators\n $regex: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `metadata#>>'{${jsonPathKey}}' ~ $${paramIndex}`,\n needsValue: true,\n };\n },\n\n $contains: (key, paramIndex, value: any) => {\n const jsonPathKey = parseJsonPathKey(key);\n let sql;\n if (Array.isArray(value)) {\n sql = `(metadata->'${jsonPathKey}') ?& $${paramIndex}`;\n } else if (typeof value === 'string') {\n sql = `metadata->>'${jsonPathKey}' ILIKE '%' || $${paramIndex} || '%' ESCAPE '\\\\'`;\n } else {\n sql = `metadata->>'${jsonPathKey}' = $${paramIndex}`;\n }\n return {\n sql,\n needsValue: true,\n transformValue: () =>\n Array.isArray(value) ? value.map(String) : typeof value === 'string' ? escapeLikePattern(value) : value,\n };\n },\n /**\n * $objectContains: Postgres-only operator for true JSONB object containment.\n * Usage: { field: { $objectContains: { ...subobject } } }\n */\n // $objectContains: (key, paramIndex) => ({\n // sql: `metadata @> $${paramIndex}::jsonb`,\n // needsValue: true,\n // transformValue: value => {\n // const parts = key.split('.');\n // return JSON.stringify(parts.reduceRight((value, key) => ({ [key]: value }), value));\n // },\n // }),\n $size: (key: string, paramIndex: number) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata#>'{${jsonPathKey}}') = 'array' THEN \n jsonb_array_length(metadata#>'{${jsonPathKey}}') = $${paramIndex}\n ELSE FALSE\n END\n )`,\n needsValue: true,\n };\n },\n};\n\ninterface FilterResult {\n sql: string;\n values: any[];\n}\n\nconst parseJsonPathKey = (key: string) => {\n const parsedKey = key !== '' ? parseFieldKey(key) : '';\n return parsedKey.replace(/\\./g, ',');\n};\n\nfunction escapeLikePattern(str: string): string {\n return str.replace(/([%_\\\\])/g, '\\\\$1');\n}\n\n/**\n * Build a filter query for DELETE operations (no minScore/topK parameters)\n */\nexport function buildDeleteFilterQuery(filter: PGVectorFilter): FilterResult {\n const values: any[] = [];\n\n function buildCondition(key: string, value: any, parentPath: string): string {\n // Handle logical operators ($and/$or)\n if (['$and', '$or', '$not', '$nor'].includes(key)) {\n return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n }\n\n // If condition is not a FilterCondition object, assume it's an equality check\n if (!value || typeof value !== 'object') {\n values.push(value);\n return `metadata#>>'{${parseJsonPathKey(key)}}' = $${values.length}`;\n }\n\n // Handle operator conditions\n const entries = Object.entries(value);\n\n // If multiple operators on same field (e.g., { $gte: 20, $lte: 80 }), combine with AND\n if (entries.length > 1) {\n const conditions = entries.map(([operator, operatorValue]) => {\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const nestedConditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n return `NOT (${nestedConditions})`;\n }\n\n if (!FILTER_OPERATORS[operator as OperatorType]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n });\n return conditions.join(' AND ');\n }\n\n // Single operator case\n const [[operator, operatorValue] = []] = entries;\n\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n\n return `NOT (${conditions})`;\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n }\n\n function handleLogicalOperator(\n key: '$and' | '$or' | '$not' | '$nor',\n value: VectorFilter[],\n parentPath: string,\n ): string {\n if (key === '$not') {\n // For top-level $not\n const entries = Object.entries(value);\n const conditions = entries\n .map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key))\n .join(' AND ');\n return `NOT (${conditions})`;\n }\n\n // Handle empty conditions\n if (!value || value.length === 0) {\n switch (key) {\n case '$and':\n case '$nor':\n return 'true'; // Empty $and/$nor match everything\n case '$or':\n return 'false'; // Empty $or matches nothing\n default:\n return 'true';\n }\n }\n\n const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n const conditions = value.map((f: VectorFilter) => {\n const entries = Object.entries(f || {});\n if (entries.length === 0) return '';\n\n const [firstKey, firstValue] = entries[0] || [];\n if (['$and', '$or', '$not', '$nor'].includes(firstKey as string)) {\n return buildCondition(firstKey as string, firstValue, parentPath);\n }\n return entries.map(([k, v]) => buildCondition(k, v, parentPath)).join(` ${joinOperator} `);\n });\n\n const joined = conditions.join(` ${joinOperator} `);\n const operatorFn = FILTER_OPERATORS[key]!;\n return operatorFn(joined, 0, value).sql;\n }\n\n if (!filter) {\n return { sql: '', values };\n }\n\n const conditions = Object.entries(filter)\n .map(([key, value]) => buildCondition(key, value, ''))\n .filter(Boolean)\n .join(' AND ');\n\n return { sql: conditions ? `WHERE ${conditions}` : '', values };\n}\n\nexport function buildFilterQuery(filter: PGVectorFilter, minScore: number, topK: number): FilterResult {\n const values = [minScore, topK];\n\n function buildCondition(key: string, value: any, parentPath: string): string {\n // Handle logical operators ($and/$or)\n if (['$and', '$or', '$not', '$nor'].includes(key)) {\n return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n }\n\n // If condition is not a FilterCondition object, assume it's an equality check\n if (!value || typeof value !== 'object') {\n values.push(value);\n return `metadata#>>'{${parseJsonPathKey(key)}}' = $${values.length}`;\n }\n\n // Handle operator conditions\n const entries = Object.entries(value);\n\n // If multiple operators on same field (e.g., { $gte: 20, $lte: 80 }), combine with AND\n if (entries.length > 1) {\n const conditions = entries.map(([operator, operatorValue]) => {\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const nestedConditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n return `NOT (${nestedConditions})`;\n }\n\n if (!FILTER_OPERATORS[operator as OperatorType]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n });\n return conditions.join(' AND ');\n }\n\n // Single operator case\n const [[operator, operatorValue] = []] = entries;\n\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n\n return `NOT (${conditions})`;\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n }\n\n function handleLogicalOperator(\n key: '$and' | '$or' | '$not' | '$nor',\n value: VectorFilter[],\n parentPath: string,\n ): string {\n if (key === '$not') {\n // For top-level $not\n const entries = Object.entries(value);\n const conditions = entries\n .map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key))\n .join(' AND ');\n return `NOT (${conditions})`;\n }\n\n // Handle empty conditions\n if (!value || value.length === 0) {\n switch (key) {\n case '$and':\n case '$nor':\n return 'true'; // Empty $and/$nor match everything\n case '$or':\n return 'false'; // Empty $or matches nothing\n default:\n return 'true';\n }\n }\n\n const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n const conditions = value.map((f: VectorFilter) => {\n const entries = Object.entries(f || {});\n if (entries.length === 0) return '';\n\n const [firstKey, firstValue] = entries[0] || [];\n if (['$and', '$or', '$not', '$nor'].includes(firstKey as string)) {\n return buildCondition(firstKey as string, firstValue, parentPath);\n }\n return entries.map(([k, v]) => buildCondition(k, v, parentPath)).join(` ${joinOperator} `);\n });\n\n const joined = conditions.join(` ${joinOperator} `);\n const operatorFn = FILTER_OPERATORS[key]!;\n return operatorFn(joined, 0, value).sql;\n }\n\n if (!filter) {\n return { sql: '', values };\n }\n\n const conditions = Object.entries(filter)\n .map(([key, value]) => buildCondition(key, value, ''))\n .filter(Boolean)\n .join(' AND ');\n\n return { sql: conditions ? `WHERE ${conditions}` : '', values };\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { MastraVector, validateUpsertInput, validateTopK } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DeleteVectorsParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { Mutex } from 'async-mutex';\nimport * as pg from 'pg';\nimport xxhash from 'xxhash-wasm';\n\nimport { validateConfig, isCloudSqlConfig, isConnectionStringConfig, isHostConfig } from '../shared/config';\nimport type { PgVectorConfig } from '../shared/config';\nimport { PGFilterTranslator } from './filter';\nimport type { PGVectorFilter } from './filter';\nimport { buildFilterQuery, buildDeleteFilterQuery } from './sql-builder';\nimport type { IndexConfig, IndexType, VectorType } from './types';\n\nexport interface PGIndexStats extends IndexStats {\n type: IndexType;\n /**\n * The pgvector storage type used for this index.\n * - 'vector': Full precision (4 bytes per dimension)\n * - 'halfvec': Half precision (2 bytes per dimension)\n */\n vectorType: VectorType;\n config: {\n m?: number;\n efConstruction?: number;\n lists?: number;\n probes?: number;\n };\n}\n\ninterface PgQueryVectorParams extends QueryVectorParams<PGVectorFilter> {\n minScore?: number;\n /**\n * HNSW search parameter. Controls the size of the dynamic candidate\n * list during search. Higher values improve accuracy at the cost of speed.\n */\n ef?: number;\n /**\n * IVFFlat probe parameter. Number of cells to visit during search.\n * Higher values improve accuracy at the cost of speed.\n */\n probes?: number;\n}\n\ninterface PgCreateIndexParams extends CreateIndexParams {\n indexConfig?: IndexConfig;\n buildIndex?: boolean;\n /**\n * The pgvector storage type for embeddings.\n * - 'vector': Full precision (4 bytes per dimension), max 2000 dimensions for indexes (default)\n * - 'halfvec': Half precision (2 bytes per dimension), max 4000 dimensions for indexes\n *\n * Use 'halfvec' for large dimension models like text-embedding-3-large (3072 dimensions)\n */\n vectorType?: VectorType;\n}\n\ninterface PgDefineIndexParams {\n indexName: string;\n metric: 'cosine' | 'euclidean' | 'dotproduct';\n indexConfig: IndexConfig;\n vectorType?: VectorType;\n}\n\nexport class PgVector extends MastraVector<PGVectorFilter> {\n public pool: pg.Pool;\n private describeIndexCache: Map<string, PGIndexStats> = new Map();\n private createdIndexes = new Map<string, number>();\n private indexVectorTypes = new Map<string, VectorType>();\n private mutexesByName = new Map<string, Mutex>();\n private schema?: string;\n private setupSchemaPromise: Promise<void> | null = null;\n private installVectorExtensionPromise: Promise<void> | null = null;\n private vectorExtensionInstalled: boolean | undefined = undefined;\n private vectorExtensionSchema: string | null = null;\n private vectorExtensionVersion: string | null = null;\n private schemaSetupComplete: boolean | undefined = undefined;\n private cacheWarmupPromise: Promise<void> | null = null;\n\n constructor(config: PgVectorConfig & { id: string }) {\n try {\n validateConfig('PgVector', config);\n super({ id: config.id });\n\n this.schema = config.schemaName;\n\n let poolConfig: pg.PoolConfig;\n\n if (isConnectionStringConfig(config)) {\n poolConfig = {\n connectionString: config.connectionString,\n ssl: config.ssl,\n max: config.max ?? 20,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: 2000,\n ...config.pgPoolOptions,\n };\n } else if (isCloudSqlConfig(config)) {\n poolConfig = {\n ...config,\n max: config.pgPoolOptions?.max ?? 20,\n idleTimeoutMillis: config.pgPoolOptions?.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: 2000,\n ...config.pgPoolOptions,\n } as pg.PoolConfig;\n } else if (isHostConfig(config)) {\n poolConfig = {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n max: config.max ?? 20,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: 2000,\n ...config.pgPoolOptions,\n };\n } else {\n throw new Error('PgVector: invalid configuration provided');\n }\n\n this.pool = new pg.Pool(poolConfig);\n\n // Warm the created indexes cache in background so we don't need to check if indexes exist every time\n // Store the promise so we can wait for it during disconnect to avoid \"pool already closed\" errors\n this.cacheWarmupPromise = (async () => {\n try {\n const existingIndexes = await this.listIndexes();\n await Promise.all(\n existingIndexes.map(async indexName => {\n const info = await this.getIndexInfo({ indexName });\n const key = await this.getIndexCacheKey({\n indexName,\n metric: info.metric,\n dimension: info.dimension,\n type: info.type,\n vectorType: info.vectorType,\n });\n this.createdIndexes.set(indexName, key);\n this.indexVectorTypes.set(indexName, info.vectorType);\n }),\n );\n } catch (error) {\n // Don't throw - cache warming is optional optimization\n // If it fails (e.g., pool closed early), just log and continue\n this.logger?.debug('Cache warming skipped or failed', { error });\n }\n })();\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('PG', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n schemaName: 'schemaName' in config ? (config.schemaName ?? '') : '',\n },\n },\n error,\n );\n }\n }\n\n private getMutexByName(indexName: string) {\n if (!this.mutexesByName.has(indexName)) this.mutexesByName.set(indexName, new Mutex());\n return this.mutexesByName.get(indexName)!;\n }\n\n /**\n * Detects which schema contains the vector extension and its version\n */\n private async detectVectorExtensionSchema(client: pg.PoolClient): Promise<string | null> {\n try {\n const result = await client.query(`\n SELECT n.nspname as schema_name, e.extversion as version\n FROM pg_extension e\n JOIN pg_namespace n ON e.extnamespace = n.oid\n WHERE e.extname = 'vector'\n LIMIT 1;\n `);\n\n if (result.rows.length > 0) {\n this.vectorExtensionSchema = result.rows[0].schema_name;\n this.vectorExtensionVersion = result.rows[0].version;\n this.logger.debug('Vector extension found', {\n schema: this.vectorExtensionSchema,\n version: this.vectorExtensionVersion,\n });\n return this.vectorExtensionSchema;\n }\n\n return null;\n } catch (error) {\n this.logger.debug('Could not detect vector extension schema', { error });\n return null;\n }\n }\n\n /**\n * Checks if the installed pgvector version supports halfvec type.\n * halfvec was introduced in pgvector 0.7.0.\n */\n private supportsHalfvec(): boolean {\n if (!this.vectorExtensionVersion) {\n return false;\n }\n // Parse version string, handling non-numeric suffixes (e.g., \"0.7.0-beta\", \"0.8.0+build\")\n const parts = this.vectorExtensionVersion.split('.');\n const major = parseInt(parts[0] ?? '', 10);\n const minor = parseInt(parts[1] ?? '', 10);\n // If parsing failed (NaN), assume version doesn't support halfvec\n if (isNaN(major) || isNaN(minor)) {\n return false;\n }\n // halfvec was introduced in pgvector 0.7.0\n return major > 0 || (major === 0 && minor >= 7);\n }\n\n /**\n * Gets the properly qualified vector type name\n * @param vectorType - The type of vector storage ('vector' or 'halfvec')\n */\n private getVectorTypeName(vectorType: VectorType = 'vector'): string {\n // If we know where the extension is, use that\n if (this.vectorExtensionSchema) {\n // If it's in pg_catalog, return the type directly\n if (this.vectorExtensionSchema === 'pg_catalog') {\n return vectorType;\n }\n // Issue #10061: Always qualify with schema where vector extension is installed\n // This ensures the type is found regardless of the session's search_path\n const validatedSchema = parseSqlIdentifier(this.vectorExtensionSchema, 'vector extension schema');\n return `${validatedSchema}.${vectorType}`;\n }\n\n // Fallback to unqualified (will use search_path)\n return vectorType;\n }\n\n /**\n * Gets the operator class for index creation based on metric and vector type.\n * pgvector uses different operator classes for vector vs halfvec types.\n */\n private getMetricOperatorClass(metric: 'cosine' | 'euclidean' | 'dotproduct', vectorType: VectorType): string {\n const prefix = vectorType === 'halfvec' ? 'halfvec' : 'vector';\n switch (metric) {\n case 'cosine':\n return `${prefix}_cosine_ops`;\n case 'euclidean':\n return `${prefix}_l2_ops`;\n case 'dotproduct':\n return `${prefix}_ip_ops`;\n default:\n return `${prefix}_cosine_ops`;\n }\n }\n\n private getTableName(indexName: string) {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const quotedIndexName = `\"${parsedIndexName}\"`;\n const quotedSchemaName = this.getSchemaName();\n const quotedVectorName = `\"${parsedIndexName}_vector_idx\"`;\n return {\n tableName: quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName,\n vectorIndexName: quotedVectorName,\n };\n }\n\n private getSchemaName() {\n return this.schema ? `\"${parseSqlIdentifier(this.schema, 'schema name')}\"` : undefined;\n }\n\n transformFilter(filter?: PGVectorFilter) {\n const translator = new PGFilterTranslator();\n return translator.translate(filter);\n }\n\n async getIndexInfo({ indexName }: DescribeIndexParams): Promise<PGIndexStats> {\n if (!this.describeIndexCache.has(indexName)) {\n this.describeIndexCache.set(indexName, await this.describeIndex({ indexName }));\n }\n return this.describeIndexCache.get(indexName)!;\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n minScore = -1,\n ef,\n probes,\n }: PgQueryVectorParams): Promise<QueryResult[]> {\n try {\n // Validate topK parameter\n validateTopK('PG', topK);\n if (!Array.isArray(queryVector) || !queryVector.every(x => typeof x === 'number' && Number.isFinite(x))) {\n throw new Error('queryVector must be an array of finite numbers');\n }\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'QUERY', 'INVALID_INPUT'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n\n const client = await this.pool.connect();\n try {\n await client.query('BEGIN');\n const vectorStr = `[${queryVector.join(',')}]`;\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildFilterQuery(translatedFilter, minScore, topK);\n\n // Get index type and configuration\n const indexInfo = await this.getIndexInfo({ indexName });\n\n // Set HNSW search parameter if applicable\n if (indexInfo.type === 'hnsw') {\n // Calculate ef and clamp between 1 and 1000\n const calculatedEf = ef ?? Math.max(topK, (indexInfo?.config?.m ?? 16) * topK);\n const searchEf = Math.min(1000, Math.max(1, calculatedEf));\n await client.query(`SET LOCAL hnsw.ef_search = ${searchEf}`);\n }\n\n if (indexInfo.type === 'ivfflat' && probes) {\n await client.query(`SET LOCAL ivfflat.probes = ${probes}`);\n }\n\n const { tableName } = this.getTableName(indexName);\n\n // Get the properly qualified vector type based on the index's vector type\n const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType);\n\n const query = `\n WITH vector_scores AS (\n SELECT\n vector_id as id,\n 1 - (embedding <=> '${vectorStr}'::${qualifiedVectorType}) as score,\n metadata\n ${includeVector ? ', embedding' : ''}\n FROM ${tableName}\n ${filterQuery}\n )\n SELECT *\n FROM vector_scores\n WHERE score > $1\n ORDER BY score DESC\n LIMIT $2`;\n const result = await client.query(query, filterValues);\n await client.query('COMMIT');\n\n return result.rows.map(({ id, score, metadata, embedding }) => ({\n id,\n score,\n metadata,\n ...(includeVector && embedding && { vector: JSON.parse(embedding) }),\n }));\n } catch (error) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'QUERY', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async upsert({\n indexName,\n vectors,\n metadata,\n ids,\n deleteFilter,\n }: UpsertVectorParams<PGVectorFilter>): Promise<string[]> {\n // Validate input parameters\n validateUpsertInput('PG', vectors, metadata, ids);\n\n const { tableName } = this.getTableName(indexName);\n\n // Start a transaction\n const client = await this.pool.connect();\n try {\n await client.query('BEGIN');\n\n // Step 1: If deleteFilter is provided, delete matching vectors first\n if (deleteFilter) {\n this.logger?.debug(`Deleting vectors matching filter before upsert`, { indexName, deleteFilter });\n\n // Reuse the filter translation logic\n const translatedFilter = this.transformFilter(deleteFilter);\n const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n\n const whereClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n if (whereClause) {\n const deleteQuery = `DELETE FROM ${tableName} WHERE ${whereClause}`;\n const result = await client.query(deleteQuery, filterValues);\n this.logger?.debug(`Deleted ${result.rowCount || 0} vectors before upsert`, {\n indexName,\n deletedCount: result.rowCount || 0,\n });\n }\n }\n\n // Step 2: Insert/update new vectors\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Get the properly qualified vector type for this index\n const indexInfo = await this.getIndexInfo({ indexName });\n const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType);\n\n for (let i = 0; i < vectors.length; i++) {\n const query = `\n INSERT INTO ${tableName} (vector_id, embedding, metadata)\n VALUES ($1, $2::${qualifiedVectorType}, $3::jsonb)\n ON CONFLICT (vector_id)\n DO UPDATE SET\n embedding = $2::${qualifiedVectorType},\n metadata = $3::jsonb\n RETURNING embedding::text\n `;\n\n await client.query(query, [vectorIds[i], `[${vectors[i]?.join(',')}]`, JSON.stringify(metadata?.[i] || {})]);\n }\n\n await client.query('COMMIT');\n\n this.logger?.debug(`Upserted ${vectors.length} vectors to ${indexName}`, {\n indexName,\n vectorCount: vectors.length,\n hadDeleteFilter: !!deleteFilter,\n });\n\n return vectorIds;\n } catch (error) {\n await client.query('ROLLBACK');\n if (error instanceof Error && error.message?.includes('expected') && error.message?.includes('dimensions')) {\n const match = error.message.match(/expected (\\d+) dimensions, not (\\d+)/);\n if (match) {\n const [, expected, actual] = match;\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'UPSERT', 'INVALID_INPUT'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n text:\n `Vector dimension mismatch: Index \"${indexName}\" expects ${expected} dimensions but got ${actual} dimensions. ` +\n `Either use a matching embedding model or delete and recreate the index with the new dimension.`,\n details: {\n indexName,\n expected: expected ?? '',\n actual: actual ?? '',\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n private hasher = xxhash();\n private async getIndexCacheKey({\n indexName,\n dimension,\n metric,\n type,\n vectorType = 'vector',\n }: CreateIndexParams & { type: IndexType | undefined; vectorType?: VectorType }) {\n const input = indexName + dimension + metric + (type || 'ivfflat') + vectorType; // ivfflat is default\n return (await this.hasher).h32(input);\n }\n private cachedIndexExists(indexName: string, newKey: number) {\n const existingIndexCacheKey = this.createdIndexes.get(indexName);\n return existingIndexCacheKey && existingIndexCacheKey === newKey;\n }\n private async setupSchema(client: pg.PoolClient) {\n if (!this.schema || this.schemaSetupComplete) {\n return;\n }\n\n if (!this.setupSchemaPromise) {\n this.setupSchemaPromise = (async () => {\n try {\n // First check if schema exists and we have usage permission\n const schemaCheck = await client.query(\n `\n SELECT EXISTS (\n SELECT 1 FROM information_schema.schemata\n WHERE schema_name = $1\n )\n `,\n [this.schema],\n );\n\n const schemaExists = schemaCheck.rows[0].exists;\n\n if (!schemaExists) {\n try {\n await client.query(`CREATE SCHEMA IF NOT EXISTS ${this.getSchemaName()}`);\n this.logger.info(`Schema \"${this.schema}\" created successfully`);\n } catch (error) {\n this.logger.error(`Failed to create schema \"${this.schema}\"`, { error });\n throw new Error(\n `Unable to create schema \"${this.schema}\". This requires CREATE privilege on the database. ` +\n `Either create the schema manually or grant CREATE privilege to the user.`,\n );\n }\n }\n\n // If we got here, schema exists and we can use it\n this.schemaSetupComplete = true;\n this.logger.debug(`Schema \"${this.schema}\" is ready for use`);\n } catch (error) {\n // Reset flags so we can retry\n this.schemaSetupComplete = undefined;\n this.setupSchemaPromise = null;\n throw error;\n } finally {\n this.setupSchemaPromise = null;\n }\n })();\n }\n\n await this.setupSchemaPromise;\n }\n\n async createIndex({\n indexName,\n dimension,\n metric = 'cosine',\n indexConfig = {},\n buildIndex = true,\n vectorType = 'vector',\n }: PgCreateIndexParams): Promise<void> {\n const { tableName } = this.getTableName(indexName);\n\n // Validate inputs\n try {\n if (!indexName.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) {\n throw new Error('Invalid index name format');\n }\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n if (vectorType !== 'vector' && vectorType !== 'halfvec') {\n throw new Error('vectorType must be \"vector\" or \"halfvec\"');\n }\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'CREATE_INDEX', 'INVALID_INPUT'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n\n const indexCacheKey = await this.getIndexCacheKey({\n indexName,\n dimension,\n type: indexConfig.type,\n metric,\n vectorType,\n });\n if (this.cachedIndexExists(indexName, indexCacheKey)) {\n // we already saw this index get created since the process started, no need to recreate it\n return;\n }\n\n const mutex = this.getMutexByName(`create-${indexName}`);\n // Use async-mutex instead of advisory lock for perf (over 2x as fast)\n await mutex\n .runExclusive(async () => {\n if (this.cachedIndexExists(indexName, indexCacheKey)) {\n // this may have been created while we were waiting to acquire a lock\n return;\n }\n\n const client = await this.pool.connect();\n\n try {\n // Setup schema if needed\n await this.setupSchema(client);\n\n // Install vector extension and detect where it is\n await this.installVectorExtension(client);\n\n // Check if halfvec is supported when requested\n if (vectorType === 'halfvec' && !this.supportsHalfvec()) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'CREATE_INDEX', 'HALFVEC_NOT_SUPPORTED'),\n text:\n `halfvec type requires pgvector >= 0.7.0, but version ${this.vectorExtensionVersion || 'unknown'} is installed. ` +\n `Either upgrade pgvector or use vectorType: 'vector' (which supports up to 2000 dimensions for indexes).`,\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n indexName,\n requestedVectorType: vectorType,\n pgvectorVersion: this.vectorExtensionVersion || 'unknown',\n requiredVersion: '0.7.0',\n },\n });\n }\n\n // Set search path to include both schemas if needed\n if (\n this.schema &&\n this.vectorExtensionSchema &&\n this.schema !== this.vectorExtensionSchema &&\n this.vectorExtensionSchema !== 'pg_catalog'\n ) {\n await client.query(`SET search_path TO ${this.getSchemaName()}, \"${this.vectorExtensionSchema}\"`);\n }\n\n // Use the properly qualified vector type (vector or halfvec)\n const qualifiedVectorType = this.getVectorTypeName(vectorType);\n\n await client.query(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id SERIAL PRIMARY KEY,\n vector_id TEXT UNIQUE NOT NULL,\n embedding ${qualifiedVectorType}(${dimension}),\n metadata JSONB DEFAULT '{}'::jsonb\n );\n `);\n this.createdIndexes.set(indexName, indexCacheKey);\n this.indexVectorTypes.set(indexName, vectorType);\n\n if (buildIndex) {\n await this.setupIndex({ indexName, metric, indexConfig, vectorType }, client);\n }\n } catch (error: any) {\n this.createdIndexes.delete(indexName);\n this.indexVectorTypes.delete(indexName);\n throw error;\n } finally {\n client.release();\n }\n })\n .catch(error => {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n });\n }\n\n async buildIndex({ indexName, metric = 'cosine', indexConfig }: PgDefineIndexParams): Promise<void> {\n const client = await this.pool.connect();\n try {\n await this.setupIndex({ indexName, metric, indexConfig }, client);\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'BUILD_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n private async setupIndex(\n { indexName, metric, indexConfig, vectorType = 'vector' }: PgDefineIndexParams,\n client: pg.PoolClient,\n ) {\n const mutex = this.getMutexByName(`build-${indexName}`);\n // Use async-mutex instead of advisory lock for perf (over 2x as fast)\n await mutex.runExclusive(async () => {\n // Check if the index config is empty\n const isConfigEmpty =\n !indexConfig ||\n Object.keys(indexConfig).length === 0 ||\n (!indexConfig.type && !indexConfig.ivf && !indexConfig.hnsw);\n // Determine index type - use defaults if no config provided\n const indexType = isConfigEmpty ? 'ivfflat' : indexConfig.type || 'ivfflat';\n\n const { tableName, vectorIndexName } = this.getTableName(indexName);\n\n // Try to get existing index info to check if configuration has changed\n let existingIndexInfo: PGIndexStats | null = null;\n let dimension = 0;\n try {\n existingIndexInfo = await this.getIndexInfo({ indexName });\n dimension = existingIndexInfo.dimension;\n\n if (isConfigEmpty && existingIndexInfo.metric === metric) {\n if (existingIndexInfo.type === 'flat') {\n // No index exists - create the default ivfflat\n this.logger?.debug(`No index exists for ${vectorIndexName}, will create default ivfflat index`);\n } else {\n // Preserve existing non-flat index\n this.logger?.debug(\n `Index ${vectorIndexName} already exists (type: ${existingIndexInfo.type}, metric: ${existingIndexInfo.metric}), preserving existing configuration`,\n );\n const cacheKey = await this.getIndexCacheKey({\n indexName,\n dimension,\n type: existingIndexInfo.type,\n metric: existingIndexInfo.metric,\n vectorType: existingIndexInfo.vectorType,\n });\n this.createdIndexes.set(indexName, cacheKey);\n this.indexVectorTypes.set(indexName, existingIndexInfo.vectorType);\n return;\n }\n }\n\n // If config was empty but metric didn't match, OR config was provided, check for changes\n let configMatches = existingIndexInfo.metric === metric && existingIndexInfo.type === indexType;\n if (indexType === 'hnsw') {\n configMatches =\n configMatches &&\n existingIndexInfo.config.m === (indexConfig.hnsw?.m ?? 8) &&\n existingIndexInfo.config.efConstruction === (indexConfig.hnsw?.efConstruction ?? 32);\n } else if (indexType === 'flat') {\n configMatches = configMatches && existingIndexInfo.type === 'flat';\n } else if (indexType === 'ivfflat' && indexConfig.ivf?.lists) {\n configMatches = configMatches && existingIndexInfo.config.lists === indexConfig.ivf?.lists;\n }\n\n if (configMatches) {\n this.logger?.debug(`Index ${vectorIndexName} already exists with same configuration, skipping recreation`);\n // Update cache with the existing configuration\n const cacheKey = await this.getIndexCacheKey({\n indexName,\n dimension,\n type: existingIndexInfo.type,\n metric: existingIndexInfo.metric,\n vectorType: existingIndexInfo.vectorType,\n });\n this.createdIndexes.set(indexName, cacheKey);\n this.indexVectorTypes.set(indexName, existingIndexInfo.vectorType);\n return;\n }\n\n // Configuration changed, need to rebuild\n this.logger?.info(`Index ${vectorIndexName} configuration changed, rebuilding index`);\n await client.query(`DROP INDEX IF EXISTS ${vectorIndexName}`);\n this.describeIndexCache.delete(indexName);\n } catch {\n this.logger?.debug(`Index ${indexName} doesn't exist yet, will create it`);\n }\n\n if (indexType === 'flat') {\n this.describeIndexCache.delete(indexName);\n return;\n }\n\n // Get the operator class based on vector type and metric\n // pgvector uses different operator classes for vector vs halfvec\n // Use the detected vectorType from existing table if available, otherwise use the parameter\n const effectiveVectorType = existingIndexInfo?.vectorType ?? vectorType;\n const metricOp = this.getMetricOperatorClass(metric, effectiveVectorType);\n\n let indexSQL: string;\n if (indexType === 'hnsw') {\n const m = indexConfig.hnsw?.m ?? 8;\n const efConstruction = indexConfig.hnsw?.efConstruction ?? 32;\n\n indexSQL = `\n CREATE INDEX IF NOT EXISTS ${vectorIndexName}\n ON ${tableName}\n USING hnsw (embedding ${metricOp})\n WITH (\n m = ${m},\n ef_construction = ${efConstruction}\n )\n `;\n } else {\n let lists: number;\n if (indexConfig.ivf?.lists) {\n lists = indexConfig.ivf.lists;\n } else {\n const size = (await client.query(`SELECT COUNT(*) FROM ${tableName}`)).rows[0].count;\n lists = Math.max(100, Math.min(4000, Math.floor(Math.sqrt(size) * 2)));\n }\n indexSQL = `\n CREATE INDEX IF NOT EXISTS ${vectorIndexName}\n ON ${tableName}\n USING ivfflat (embedding ${metricOp})\n WITH (lists = ${lists});\n `;\n }\n\n await client.query(indexSQL);\n });\n }\n\n private async installVectorExtension(client: pg.PoolClient) {\n // If we've already successfully installed, no need to do anything\n if (this.vectorExtensionInstalled) {\n return;\n }\n\n // If there's no existing installation attempt or the previous one failed\n if (!this.installVectorExtensionPromise) {\n this.installVectorExtensionPromise = (async () => {\n try {\n // First, detect if and where the extension is already installed\n const existingSchema = await this.detectVectorExtensionSchema(client);\n\n if (existingSchema) {\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = existingSchema;\n this.logger.info(`Vector extension already installed in schema: ${existingSchema}`);\n return;\n }\n\n // Try to install the extension\n try {\n // First try to install in the custom schema if provided\n if (this.schema && this.schema !== 'public') {\n try {\n await client.query(`CREATE EXTENSION IF NOT EXISTS vector SCHEMA ${this.getSchemaName()}`);\n // Re-detect to get the version info (needed for halfvec support check)\n const installedSchema = await this.detectVectorExtensionSchema(client);\n if (installedSchema) {\n this.vectorExtensionInstalled = true;\n this.logger.info(`Vector extension installed in schema: ${installedSchema}`);\n return;\n }\n // Fallback if detection failed but install succeeded\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = this.schema;\n this.logger.info(`Vector extension installed in schema: ${this.schema}`);\n return;\n } catch (schemaError) {\n this.logger.debug(`Could not install vector extension in schema ${this.schema}, trying public schema`, {\n error: schemaError,\n });\n }\n }\n\n // Fall back to installing in public schema (or default)\n await client.query('CREATE EXTENSION IF NOT EXISTS vector');\n\n // Detect where it was actually installed\n const installedSchema = await this.detectVectorExtensionSchema(client);\n if (installedSchema) {\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = installedSchema;\n this.logger.info(`Vector extension installed in schema: ${installedSchema}`);\n }\n } catch (error) {\n this.logger.warn(\n 'Could not install vector extension. This requires superuser privileges. ' +\n 'If the extension is already installed, you can ignore this warning.',\n { error },\n );\n\n // Even if installation failed, check if it exists somewhere\n const existingSchema = await this.detectVectorExtensionSchema(client);\n if (existingSchema) {\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = existingSchema;\n this.logger.info(`Vector extension found in schema: ${existingSchema}`);\n }\n }\n } catch (error) {\n this.logger.error('Error setting up vector extension', { error });\n this.vectorExtensionInstalled = undefined;\n this.installVectorExtensionPromise = null;\n throw error;\n } finally {\n this.installVectorExtensionPromise = null;\n }\n })();\n }\n\n await this.installVectorExtensionPromise;\n }\n\n async listIndexes(): Promise<string[]> {\n const client = await this.pool.connect();\n try {\n // Query for tables that match the exact Mastra PgVector table structure:\n // Must have: vector_id (TEXT), embedding (vector or halfvec), metadata (JSONB)\n const mastraTablesQuery = `\n SELECT DISTINCT t.table_name\n FROM information_schema.tables t\n WHERE t.table_schema = $1\n AND EXISTS (\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name = 'vector_id'\n AND c.data_type = 'text'\n )\n AND EXISTS (\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name = 'embedding'\n AND c.udt_name IN ('vector', 'halfvec')\n )\n AND EXISTS (\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name = 'metadata'\n AND c.data_type = 'jsonb'\n );\n `;\n const mastraTables = await client.query(mastraTablesQuery, [this.schema || 'public']);\n return mastraTables.rows.map(row => row.table_name);\n } catch (e) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n },\n e,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<PGIndexStats> {\n const client = await this.pool.connect();\n try {\n const { tableName } = this.getTableName(indexName);\n\n // Check if table exists with a vector or halfvec column\n const tableExistsQuery = `\n SELECT udt_name\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n AND udt_name IN ('vector', 'halfvec')\n LIMIT 1;\n `;\n const tableExists = await client.query(tableExistsQuery, [this.schema || 'public', indexName]);\n\n if (tableExists.rows.length === 0) {\n throw new Error(`Vector table ${tableName} does not exist`);\n }\n\n // Determine the vector type from the column\n const vectorType: VectorType = tableExists.rows[0].udt_name === 'halfvec' ? 'halfvec' : 'vector';\n\n // Get vector dimension\n const dimensionQuery = `\n SELECT atttypmod as dimension\n FROM pg_attribute\n WHERE attrelid = $1::regclass\n AND attname = 'embedding';\n `;\n\n // Get row count\n const countQuery = `\n SELECT COUNT(*) as count\n FROM ${tableName};\n `;\n\n // Get index metric type\n const indexQuery = `\n SELECT\n am.amname as index_method,\n pg_get_indexdef(i.indexrelid) as index_def,\n opclass.opcname as operator_class\n FROM pg_index i\n JOIN pg_class c ON i.indexrelid = c.oid\n JOIN pg_am am ON c.relam = am.oid\n JOIN pg_opclass opclass ON i.indclass[0] = opclass.oid\n JOIN pg_namespace n ON c.relnamespace = n.oid\n WHERE c.relname = $1\n AND n.nspname = $2;\n `;\n\n const [dimResult, countResult, indexResult] = await Promise.all([\n client.query(dimensionQuery, [tableName]),\n client.query(countQuery),\n client.query(indexQuery, [`${indexName}_vector_idx`, this.schema || 'public']),\n ]);\n\n const { index_method, index_def, operator_class } = indexResult.rows[0] || {\n index_method: 'flat',\n index_def: '',\n operator_class: 'cosine',\n };\n\n // Convert pg_vector index method to our metric type\n const metric = operator_class.includes('l2')\n ? 'euclidean'\n : operator_class.includes('ip')\n ? 'dotproduct'\n : 'cosine';\n\n // Parse index configuration\n const config: { m?: number; efConstruction?: number; lists?: number } = {};\n\n if (index_method === 'hnsw') {\n const m = index_def.match(/m\\s*=\\s*'?(\\d+)'?/)?.[1];\n const efConstruction = index_def.match(/ef_construction\\s*=\\s*'?(\\d+)'?/)?.[1];\n if (m) config.m = parseInt(m);\n if (efConstruction) config.efConstruction = parseInt(efConstruction);\n } else if (index_method === 'ivfflat') {\n const lists = index_def.match(/lists\\s*=\\s*'?(\\d+)'?/)?.[1];\n if (lists) config.lists = parseInt(lists);\n }\n\n return {\n dimension: dimResult.rows[0].dimension,\n count: parseInt(countResult.rows[0].count),\n metric,\n type: index_method as 'flat' | 'hnsw' | 'ivfflat',\n vectorType,\n config,\n };\n } catch (e: any) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n e,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const client = await this.pool.connect();\n try {\n const { tableName } = this.getTableName(indexName);\n // Drop the table\n await client.query(`DROP TABLE IF EXISTS ${tableName} CASCADE`);\n this.createdIndexes.delete(indexName);\n this.indexVectorTypes.delete(indexName);\n this.describeIndexCache.delete(indexName);\n } catch (error: any) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async truncateIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const client = await this.pool.connect();\n try {\n const { tableName } = this.getTableName(indexName);\n await client.query(`TRUNCATE ${tableName}`);\n } catch (e: any) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'TRUNCATE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n e,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async disconnect() {\n // Wait for cache warmup to complete before closing pool\n // This prevents \"Cannot use a pool after calling end on the pool\" errors\n if (this.cacheWarmupPromise) {\n try {\n await this.cacheWarmupPromise;\n } catch {\n // Ignore errors - we're shutting down anyway\n }\n }\n\n await this.pool.end();\n }\n\n /**\n * Updates a vector by its ID with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n async updateVector({ indexName, id, filter, update }: UpdateVectorParams<PGVectorFilter>): Promise<void> {\n let client;\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n // Validate that exactly one of id or filter is provided\n if (!id && !filter) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'NO_TARGET'),\n text: 'Either id or filter must be provided',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (id && filter) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot provide both id and filter - they are mutually exclusive',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n client = await this.pool.connect();\n const { tableName } = this.getTableName(indexName);\n\n // Get the properly qualified vector type for this index\n const indexInfo = await this.getIndexInfo({ indexName });\n const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType);\n\n let updateParts = [];\n let values: any[] = [];\n let valueIndex = 1;\n\n // Build SET clause\n if (update.vector) {\n updateParts.push(`embedding = $${valueIndex}::${qualifiedVectorType}`);\n values.push(`[${update.vector.join(',')}]`);\n valueIndex++;\n }\n\n if (update.metadata) {\n updateParts.push(`metadata = $${valueIndex}::jsonb`);\n values.push(JSON.stringify(update.metadata));\n valueIndex++;\n }\n\n if (updateParts.length === 0) {\n return;\n }\n\n let whereClause: string;\n let whereValues: any[];\n\n if (id) {\n // Update by ID\n whereClause = `vector_id = $${valueIndex}`;\n whereValues = [id];\n } else {\n // Update by filter\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n text: 'Cannot update with empty filter',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n\n // Extract WHERE clause (remove \"WHERE\" prefix if present)\n whereClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n\n if (!whereClause) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'INVALID_FILTER'),\n text: 'Filter produced empty WHERE clause',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName, filter: JSON.stringify(filter) },\n });\n }\n\n // Adjust parameter indices for filter values\n whereClause = whereClause.replace(/\\$(\\d+)/g, (match, num) => {\n const newIndex = parseInt(num) + valueIndex - 1;\n return `$${newIndex}`;\n });\n whereValues = filterValues;\n }\n\n const query = `\n UPDATE ${tableName}\n SET ${updateParts.join(', ')}\n WHERE ${whereClause}\n `;\n\n const result = await client.query(query, [...values, ...whereValues]);\n\n this.logger?.info(`Updated ${result.rowCount || 0} vectors in ${indexName}`, {\n indexName,\n id: id ? id : undefined,\n filter: filter ? filter : undefined,\n updatedCount: result.rowCount || 0,\n });\n } catch (error: any) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n ...(filter && { filter: JSON.stringify(filter) }),\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client?.release();\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n let client;\n try {\n client = await this.pool.connect();\n const { tableName } = this.getTableName(indexName);\n const query = `\n DELETE FROM ${tableName}\n WHERE vector_id = $1\n `;\n await client.query(query, [id]);\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n id,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client?.release();\n }\n }\n\n /**\n * Delete vectors matching a metadata filter.\n * @param indexName - The name of the index containing the vectors.\n * @param filter - The filter to match vectors for deletion.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams<PGVectorFilter>): Promise<void> {\n let client;\n try {\n client = await this.pool.connect();\n const { tableName } = this.getTableName(indexName);\n\n // Validate that exactly one of filter or ids is provided\n if (!filter && !ids) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'NO_TARGET'),\n text: 'Either filter or ids must be provided',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (filter && ids) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot provide both filter and ids - they are mutually exclusive',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n let query: string;\n let values: any[];\n\n if (ids) {\n // Delete by IDs\n if (ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'EMPTY_IDS'),\n text: 'Cannot delete with empty ids array',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n const placeholders = ids.map((_: string, i: number) => `$${i + 1}`).join(', ');\n query = `DELETE FROM ${tableName} WHERE vector_id IN (${placeholders})`;\n values = ids;\n } else {\n // Delete by filter\n // Safety check: Don't allow empty filters to prevent accidental deletion of all vectors\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n text: 'Cannot delete with empty filter. Use deleteIndex to delete all vectors.',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n // Translate filter using existing infrastructure\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n\n // Extract WHERE clause (remove \"WHERE\" prefix if present)\n const whereClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n\n if (!whereClause) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'INVALID_FILTER'),\n text: 'Filter produced empty WHERE clause',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName, filter: JSON.stringify(filter) },\n });\n }\n\n query = `DELETE FROM ${tableName} WHERE ${whereClause}`;\n values = filterValues;\n }\n\n // Execute the delete query\n const result = await client.query(query, values);\n\n this.logger?.info(`Deleted ${result.rowCount || 0} vectors from ${indexName}`, {\n indexName,\n filter: filter ? filter : undefined,\n ids: ids ? ids : undefined,\n deletedCount: result.rowCount || 0,\n });\n } catch (error: any) {\n // Re-throw MastraErrors as-is\n if (error instanceof MastraError) {\n throw error;\n }\n\n // Wrap other errors\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client?.release();\n }\n }\n}\n","import type { Pool, PoolClient, QueryResult } from 'pg';\n\n// Re-export pg types for consumers\nexport type { Pool, PoolClient, QueryResult } from 'pg';\n\n/**\n * Values array for parameterized queries.\n */\nexport type QueryValues = unknown[];\n\n/**\n * Common interface for database clients.\n * PoolAdapter implements this interface by wrapping a pg.Pool.\n */\nexport interface DbClient {\n /**\n * The underlying connection pool.\n */\n readonly $pool: Pool;\n\n /**\n * Acquire a client from the pool for manual query execution.\n * Remember to call client.release() when done.\n */\n connect(): Promise<PoolClient>;\n\n /**\n * Execute a query that returns no data.\n * Use for INSERT, UPDATE, DELETE without RETURNING.\n */\n none(query: string, values?: QueryValues): Promise<null>;\n\n /**\n * Execute a query that returns exactly one row.\n * @throws Error if zero or more than one row is returned\n */\n one<T = any>(query: string, values?: QueryValues): Promise<T>;\n\n /**\n * Execute a query that returns zero or one row.\n * @returns The row, or null if no rows returned\n * @throws Error if more than one row is returned\n */\n oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null>;\n\n /**\n * Execute a query that returns any number of rows (including zero).\n * Alias for manyOrNone.\n */\n any<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n\n /**\n * Execute a query that returns zero or more rows.\n */\n manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n\n /**\n * Execute a query that returns at least one row.\n * @throws Error if no rows are returned\n */\n many<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n\n /**\n * Execute a raw query, returning the full result object.\n */\n query(query: string, values?: QueryValues): Promise<QueryResult>;\n\n /**\n * Execute a function within a transaction.\n * Automatically handles BEGIN, COMMIT, and ROLLBACK.\n */\n tx<T>(callback: (t: TxClient) => Promise<T>): Promise<T>;\n}\n\n/**\n * Transaction client interface for executing queries within a transaction.\n */\nexport interface TxClient {\n none(query: string, values?: QueryValues): Promise<null>;\n one<T = any>(query: string, values?: QueryValues): Promise<T>;\n oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null>;\n any<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n many<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n query(query: string, values?: QueryValues): Promise<QueryResult>;\n /** Execute multiple promises in parallel */\n batch<T>(promises: Promise<T>[]): Promise<T[]>;\n}\n\n/**\n * Truncate a query string for error messages.\n */\nfunction truncateQuery(query: string, maxLength = 100): string {\n const normalized = query.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) {\n return normalized;\n }\n return normalized.slice(0, maxLength) + '...';\n}\n\n/**\n * Adapter that wraps a pg.Pool to implement DbClient.\n */\nexport class PoolAdapter implements DbClient {\n constructor(public readonly $pool: Pool) {}\n\n connect(): Promise<PoolClient> {\n return this.$pool.connect();\n }\n\n async none(query: string, values?: QueryValues): Promise<null> {\n await this.$pool.query(query, values);\n return null;\n }\n\n async one<T = any>(query: string, values?: QueryValues): Promise<T> {\n const result = await this.$pool.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n const result = await this.$pool.query(query, values);\n if (result.rows.length === 0) {\n return null;\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one or none was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.$pool.query(query, values);\n return result.rows as T[];\n }\n\n async manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n return this.any<T>(query, values);\n }\n\n async many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.$pool.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n return result.rows as T[];\n }\n\n async query(query: string, values?: QueryValues): Promise<QueryResult> {\n return this.$pool.query(query, values);\n }\n\n async tx<T>(callback: (t: TxClient) => Promise<T>): Promise<T> {\n const client = await this.$pool.connect();\n try {\n await client.query('BEGIN');\n const txClient = new TransactionClient(client);\n const result = await callback(txClient);\n await client.query('COMMIT');\n return result;\n } catch (error) {\n try {\n await client.query('ROLLBACK');\n } catch (rollbackError) {\n // Log rollback failure but throw original error\n console.error('Transaction rollback failed:', rollbackError);\n }\n throw error;\n } finally {\n client.release();\n }\n }\n}\n\n/**\n * Transaction client that wraps a PoolClient for executing queries within a transaction.\n */\nclass TransactionClient implements TxClient {\n constructor(private readonly client: PoolClient) {}\n\n async none(query: string, values?: QueryValues): Promise<null> {\n await this.client.query(query, values);\n return null;\n }\n\n async one<T = any>(query: string, values?: QueryValues): Promise<T> {\n const result = await this.client.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n const result = await this.client.query(query, values);\n if (result.rows.length === 0) {\n return null;\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one or none was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.client.query(query, values);\n return result.rows as T[];\n }\n\n async manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n return this.any<T>(query, values);\n }\n\n async many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.client.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n return result.rows as T[];\n }\n\n async query(query: string, values?: QueryValues): Promise<QueryResult> {\n return this.client.query(query, values);\n }\n\n async batch<T>(promises: Promise<T>[]): Promise<T[]> {\n return Promise.all(promises);\n }\n}\n","export const POSTGRES_IDENTIFIER_MAX_LENGTH = 63;\n\nexport function truncateIdentifier(value: string, maxLength = POSTGRES_IDENTIFIER_MAX_LENGTH): string {\n if (maxLength <= 0) return '';\n if (Buffer.byteLength(value, 'utf-8') <= maxLength) return value;\n\n let bytes = 0;\n let end = 0;\n for (const ch of value) {\n const chBytes = Buffer.byteLength(ch, 'utf-8');\n if (bytes + chBytes > maxLength) break;\n bytes += chBytes;\n end += ch.length; // surrogate pairs have .length === 2\n }\n return value.slice(0, end);\n}\n\n/**\n * Builds a constraint name with an optional schema prefix, truncated to fit\n * within Postgres' identifier length limit. The result is always lowercased\n * because PostgreSQL folds unquoted identifiers to lowercase when storing them\n * in system catalogs (pg_constraint.conname, pg_indexes.indexname, etc.).\n * Without this normalisation, runtime lookups that compare a mixed-case name\n * against the catalog would silently fail.\n */\nexport function buildConstraintName({\n baseName,\n schemaName,\n maxLength = POSTGRES_IDENTIFIER_MAX_LENGTH,\n}: {\n baseName: string;\n schemaName?: string;\n maxLength?: number;\n}): string {\n const prefix = schemaName ? `${schemaName}_` : '';\n return truncateIdentifier(`${prefix}${baseName}`.toLowerCase(), maxLength);\n}\n","import type { ConnectionOptions } from 'node:tls';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n getSqlType,\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 { parseSqlIdentifier } from '@mastra/core/utils';\nimport { Pool } from 'pg';\nimport type { DbClient } from '../client';\nimport { PoolAdapter } from '../client';\nimport { buildConstraintName } from './constraint-utils';\n\n// Re-export DbClient for external use\nexport type { DbClient } from '../client';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing database client (Pool or PoolAdapter)\n * 2. Config to create a new pool internally\n */\nexport type PgDomainConfig = PgDomainClientConfig | PgDomainPoolConfig | PgDomainRestConfig;\n\n/**\n * Pass an existing database client (DbClient)\n */\nexport interface PgDomainClientConfig {\n /** The database client */\n client: DbClient;\n /** Optional schema name (defaults to 'public') */\n schemaName?: string;\n /** When true, default indexes will not be created during initialization */\n skipDefaultIndexes?: boolean;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n}\n\n/**\n * Pass an existing pg.Pool\n */\nexport interface PgDomainPoolConfig {\n /** Pre-configured pg.Pool */\n pool: Pool;\n /** Optional schema name (defaults to 'public') */\n schemaName?: string;\n /** When true, default indexes will not be created during initialization */\n skipDefaultIndexes?: boolean;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n}\n\n/**\n * Pass config to create a new pg.Pool internally\n */\nexport type PgDomainRestConfig = {\n /** Optional schema name (defaults to 'public') */\n schemaName?: string;\n /** When true, default indexes will not be created during initialization */\n skipDefaultIndexes?: boolean;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n} & (\n | {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | ConnectionOptions;\n }\n | {\n connectionString: string;\n ssl?: boolean | ConnectionOptions;\n }\n);\n\n/**\n * Resolves PgDomainConfig to a database client and schema.\n * Handles creating a new pool if config is provided.\n */\nexport function resolvePgConfig(config: PgDomainConfig): {\n client: DbClient;\n schemaName?: string;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n} {\n // Existing client\n if ('client' in config) {\n return {\n client: config.client,\n schemaName: config.schemaName,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n }\n\n // Existing pool\n if ('pool' in config) {\n return {\n client: new PoolAdapter(config.pool),\n schemaName: config.schemaName,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n }\n\n // Config to create new pool\n let pool: Pool;\n if ('connectionString' in config) {\n pool = new Pool({\n connectionString: config.connectionString,\n ssl: config.ssl,\n });\n } else {\n pool = new Pool({\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n });\n }\n\n return {\n client: new PoolAdapter(pool),\n schemaName: config.schemaName,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n}\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${parseSqlIdentifier(schema, 'schema name')}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const quotedIndexName = `\"${parsedIndexName}\"`;\n const quotedSchemaName = schemaName;\n return quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\nfunction mapToSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'uuid':\n return 'UUID';\n case 'boolean':\n return 'BOOLEAN';\n default:\n return getSqlType(type);\n }\n}\n\nfunction generateTableSQL({\n tableName,\n schema,\n schemaName,\n includeAllConstraints = false,\n}: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n schemaName?: string;\n /** When true, includes all constraints in the SQL (for exports). When false, some constraints are added at runtime after data migration. */\n includeAllConstraints?: boolean;\n}): string {\n const timeZColumns = Object.entries(schema)\n .filter(([_, def]) => def.type === 'timestamp')\n .map(([name]) => {\n const parsedName = parseSqlIdentifier(name, 'column name');\n return `\"${parsedName}Z\" TIMESTAMPTZ DEFAULT NOW()`;\n });\n\n const columns = Object.entries(schema).map(([name, def]) => {\n const parsedName = parseSqlIdentifier(name, 'column name');\n const constraints = [];\n if (def.primaryKey) constraints.push('PRIMARY KEY');\n if (!def.nullable) constraints.push('NOT NULL');\n return `\"${parsedName}\" ${mapToSqlType(def.type)} ${constraints.join(' ')}`;\n });\n\n const finalColumns = [...columns, ...timeZColumns].join(',\\n');\n // Sanitize schema name before using it in constraint names to ensure valid SQL identifiers\n const parsedSchemaName = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n // Use the original (long) base name so existing databases that already have\n // the constraint under this name are detected by the IF NOT EXISTS check.\n // buildConstraintName will truncate only when a schema prefix pushes the\n // combined name past the 63-byte Postgres limit.\n const workflowSnapshotConstraint = buildConstraintName({\n baseName: 'mastra_workflow_snapshot_workflow_name_run_id_key',\n schemaName: parsedSchemaName || undefined,\n });\n const spansPrimaryKeyConstraint = buildConstraintName({\n baseName: 'mastra_ai_spans_traceid_spanid_pk',\n schemaName: parsedSchemaName || undefined,\n });\n const quotedSchemaName = getSchemaName(schemaName);\n const schemaFilter = parsedSchemaName || 'public';\n\n const sql = `\n CREATE TABLE IF NOT EXISTS ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })} (\n ${finalColumns}\n );\n ${\n tableName === TABLE_WORKFLOW_SNAPSHOT\n ? `\n DO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = lower('${workflowSnapshotConstraint}') AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${schemaFilter}')\n ) AND NOT EXISTS (\n SELECT 1 FROM pg_indexes WHERE indexname = lower('${workflowSnapshotConstraint}') AND schemaname = '${schemaFilter}'\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n ADD CONSTRAINT ${workflowSnapshotConstraint}\n UNIQUE (workflow_name, run_id);\n END IF;\n END $$;\n `\n : ''\n }\n ${\n // For spans table: Include PRIMARY KEY in exports, but not in runtime (handled after deduplication)\n tableName === TABLE_SPANS && includeAllConstraints\n ? `\n DO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = lower('${spansPrimaryKeyConstraint}') AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${schemaFilter}')\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n ADD CONSTRAINT ${spansPrimaryKeyConstraint}\n PRIMARY KEY (\"traceId\", \"spanId\");\n END IF;\n END $$;\n `\n : ''\n }\n `;\n // Note: At runtime, PRIMARY KEY for spans table is added separately after deduplication\n // See PgDB.addSpansPrimaryKey()\n\n return sql;\n}\n\n/**\n * Exports the Mastra database schema as SQL DDL statements.\n * Does not require a database connection.\n */\nexport function exportSchemas(schemaName?: string): string {\n const statements: string[] = [];\n\n // Add schema creation if needed\n if (schemaName) {\n const quotedSchemaName = getSchemaName(schemaName);\n statements.push(`-- Create schema if it doesn't exist`);\n statements.push(`CREATE SCHEMA IF NOT EXISTS ${quotedSchemaName};`);\n statements.push('');\n }\n\n // Generate SQL for all tables\n for (const [tableName, schema] of Object.entries(TABLE_SCHEMAS)) {\n statements.push(`-- Table: ${tableName}`);\n const sql = generateTableSQL({\n tableName: tableName as TABLE_NAMES,\n schema,\n schemaName,\n includeAllConstraints: true, // Include all constraints for exports/documentation\n });\n statements.push(sql.trim());\n statements.push('');\n }\n\n return statements.join('\\n');\n}\n\n/**\n * Internal config for PgDB - accepts already-resolved client\n */\nexport interface PgDBInternalConfig {\n client: DbClient;\n schemaName?: string;\n skipDefaultIndexes?: boolean;\n}\n\n// Static map to track schema setup across all PgDB instances\n// Key: schemaName, Value: { promise, complete }\n// This prevents race conditions when multiple domains try to create the same schema concurrently\nconst schemaSetupRegistry = new Map<string, { promise: Promise<void> | null; complete: boolean }>();\n\nexport class PgDB extends MastraBase {\n public client: DbClient;\n public schemaName?: string;\n public skipDefaultIndexes?: boolean;\n\n constructor(config: PgDBInternalConfig) {\n super({\n component: 'STORAGE',\n name: 'PG_DB_LAYER',\n });\n\n this.client = config.client;\n this.schemaName = config.schemaName;\n this.skipDefaultIndexes = config.skipDefaultIndexes;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const schema = this.schemaName || 'public';\n\n const result = await this.client.oneOrNone(\n `SELECT 1 FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND (column_name = $3 OR column_name = $4)`,\n [schema, table, column, column.toLowerCase()],\n );\n\n return !!result;\n }\n\n /**\n * Prepares values for insertion, handling JSONB columns by stringifying them\n */\n private prepareValuesForInsert(record: Record<string, any>, tableName: TABLE_NAMES): any[] {\n return Object.entries(record).map(([key, value]) => {\n const schema = TABLE_SCHEMAS[tableName];\n const columnSchema = schema?.[key];\n\n if (columnSchema?.type === 'jsonb' && value !== null && value !== undefined) {\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n /**\n * Adds timestamp Z columns to a record if timestamp columns exist\n */\n private addTimestampZColumns(record: Record<string, any>): void {\n if (record.createdAt) {\n record.createdAtZ = record.createdAt;\n }\n if (record.created_at) {\n record.created_atZ = record.created_at;\n }\n if (record.updatedAt) {\n record.updatedAtZ = record.updatedAt;\n }\n }\n\n /**\n * Prepares a value for database operations\n */\n private prepareValue(value: any, columnName: string, tableName: TABLE_NAMES): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n const schema = TABLE_SCHEMAS[tableName];\n const columnSchema = schema?.[columnName];\n\n if (columnSchema?.type === 'jsonb') {\n return JSON.stringify(value);\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return value;\n }\n\n private async setupSchema() {\n if (!this.schemaName) {\n return;\n }\n\n // Use static registry to coordinate schema setup across all PgDB instances\n let registryEntry = schemaSetupRegistry.get(this.schemaName);\n if (registryEntry?.complete) {\n return;\n }\n\n const quotedSchemaName = getSchemaName(this.schemaName);\n\n if (!registryEntry?.promise) {\n const schemaNameCapture = this.schemaName;\n const setupPromise = (async () => {\n try {\n const schemaExists = await this.client.oneOrNone(\n `\n SELECT EXISTS (\n SELECT 1 FROM information_schema.schemata\n WHERE schema_name = $1\n )\n `,\n [schemaNameCapture],\n );\n\n if (!schemaExists?.exists) {\n try {\n await this.client.none(`CREATE SCHEMA IF NOT EXISTS ${quotedSchemaName}`);\n this.logger.info(`Schema \"${schemaNameCapture}\" created successfully`);\n } catch (error) {\n this.logger.error(`Failed to create schema \"${schemaNameCapture}\"`, { error });\n throw new Error(\n `Unable to create schema \"${schemaNameCapture}\". This requires CREATE privilege on the database. ` +\n `Either create the schema manually or grant CREATE privilege to the user.`,\n );\n }\n }\n\n // Mark as complete in the registry\n const entry = schemaSetupRegistry.get(schemaNameCapture);\n if (entry) {\n entry.complete = true;\n }\n this.logger.debug(`Schema \"${quotedSchemaName}\" is ready for use`);\n } catch (error) {\n // On error, clear the registry entry so retry is possible\n schemaSetupRegistry.delete(schemaNameCapture);\n throw error;\n }\n })();\n\n // Register the promise immediately so concurrent callers can await it\n schemaSetupRegistry.set(this.schemaName, { promise: setupPromise, complete: false });\n registryEntry = schemaSetupRegistry.get(this.schemaName);\n }\n\n await registryEntry!.promise;\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'timestamp':\n return 'DEFAULT NOW()';\n case 'jsonb':\n return \"DEFAULT '{}'::jsonb\";\n default:\n return getDefaultValue(type);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n this.addTimestampZColumns(record);\n\n const schemaName = getSchemaName(this.schemaName);\n const columns = Object.keys(record).map(col => parseSqlIdentifier(col, 'column name'));\n const values = this.prepareValuesForInsert(record, tableName);\n const placeholders = values.map((_, i) => `$${i + 1}`).join(', ');\n const fullTableName = getTableName({ indexName: tableName, schemaName });\n const columnList = columns.map(c => `\"${c}\"`).join(', ');\n\n // For spans table, use ON CONFLICT to handle duplicate (traceId, spanId) gracefully\n if (tableName === TABLE_SPANS) {\n // Build update clause for all columns except the primary key columns\n const updateColumns = columns.filter(c => c !== 'traceId' && c !== 'spanId');\n\n if (updateColumns.length > 0) {\n const updateClause = updateColumns.map(c => `\"${c}\" = EXCLUDED.\"${c}\"`).join(', ');\n await this.client.none(\n `INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})\n ON CONFLICT (\"traceId\", \"spanId\") DO UPDATE SET ${updateClause}`,\n values,\n );\n } else {\n // Only PK columns provided - use DO NOTHING to avoid invalid SQL\n await this.client.none(\n `INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})\n ON CONFLICT (\"traceId\", \"spanId\") DO NOTHING`,\n values,\n );\n }\n } else {\n await this.client.none(`INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})`, values);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const schemaName = getSchemaName(this.schemaName);\n const tableNameWithSchema = getTableName({ indexName: tableName, schemaName });\n\n // Check if table exists before truncating (handles case where init failed)\n const tableExists = await this.client.oneOrNone<{ exists: boolean }>(\n `SELECT EXISTS (\n SELECT 1 FROM information_schema.tables\n WHERE table_schema = $1 AND table_name = $2\n )`,\n [this.schemaName || 'public', tableName],\n );\n\n if (tableExists?.exists) {\n await this.client.none(`TRUNCATE TABLE ${tableNameWithSchema} CASCADE`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async createTable({\n tableName,\n schema,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n }): Promise<void> {\n try {\n const timeZColumnNames = Object.entries(schema)\n .filter(([_, def]) => def.type === 'timestamp')\n .map(([name]) => name);\n\n if (this.schemaName) {\n await this.setupSchema();\n }\n\n const sql = generateTableSQL({ tableName, schema, schemaName: this.schemaName });\n\n await this.client.none(sql);\n\n await this.alterTable({\n tableName,\n schema,\n ifNotExists: timeZColumnNames,\n });\n\n // Set up timestamp triggers and run migrations for Spans table\n if (tableName === TABLE_SPANS) {\n await this.setupTimestampTriggers(tableName);\n await this.migrateSpansTable();\n\n // Check if PRIMARY KEY constraint already exists - if so, skip migration\n // This avoids running expensive queries on every init after migration is complete\n const pkExists = await this.spansPrimaryKeyExists();\n if (!pkExists) {\n // Check for duplicates before attempting to add PRIMARY KEY\n const duplicateInfo = await this.checkForDuplicateSpans();\n if (duplicateInfo.hasDuplicates) {\n // Duplicates exist - throw error requiring manual migration\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: Duplicate spans detected in ${duplicateInfo.tableName}\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations.\\n` +\n `\\n` +\n `The spans table requires a unique constraint on (traceId, spanId), but your\\n` +\n `database contains duplicate entries that must be resolved first.\\n` +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Remove duplicate spans (keeping the most complete/recent version)\\n` +\n ` 2. Add the required unique constraint\\n` +\n `\\n` +\n `Note: This migration may take some time for large tables.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('PG', 'MIGRATION_REQUIRED', 'DUPLICATE_SPANS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n } else {\n // No duplicates - safe to add PRIMARY KEY directly\n await this.addSpansPrimaryKey();\n }\n }\n }\n } catch (error) {\n // Rethrow MastraError directly to preserve structured error IDs (e.g., MIGRATION_REQUIRED::DUPLICATE_SPANS)\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n private async setupTimestampTriggers(tableName: TABLE_NAMES): Promise<void> {\n const schemaName = getSchemaName(this.schemaName);\n const fullTableName = getTableName({ indexName: tableName, schemaName });\n const functionName = `${schemaName}.trigger_set_timestamps`;\n\n try {\n const triggerSQL = `\n CREATE OR REPLACE FUNCTION ${functionName}()\n RETURNS TRIGGER AS $$\n BEGIN\n IF TG_OP = 'INSERT' THEN\n NEW.\"createdAt\" = NOW();\n NEW.\"updatedAt\" = NOW();\n NEW.\"createdAtZ\" = NOW();\n NEW.\"updatedAtZ\" = NOW();\n ELSIF TG_OP = 'UPDATE' THEN\n NEW.\"updatedAt\" = NOW();\n NEW.\"updatedAtZ\" = NOW();\n NEW.\"createdAt\" = OLD.\"createdAt\";\n NEW.\"createdAtZ\" = OLD.\"createdAtZ\";\n END IF;\n RETURN NEW;\n END;\n $$ LANGUAGE plpgsql;\n\n DROP TRIGGER IF EXISTS ${tableName}_timestamps ON ${fullTableName};\n\n CREATE TRIGGER ${tableName}_timestamps\n BEFORE INSERT OR UPDATE ON ${fullTableName}\n FOR EACH ROW\n EXECUTE FUNCTION ${functionName}();\n `;\n\n await this.client.none(triggerSQL);\n this.logger?.debug?.(`Set up timestamp triggers for table ${fullTableName}`);\n } catch (error) {\n this.logger?.warn?.(`Failed to set up timestamp triggers for ${fullTableName}:`, error);\n }\n }\n\n /**\n * Migrates the spans table schema from OLD_SPAN_SCHEMA to current SPAN_SCHEMA.\n * This adds new columns that don't exist in old schema.\n */\n private async migrateSpansTable(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n const schema = TABLE_SCHEMAS[TABLE_SPANS];\n\n try {\n // Add any columns from current schema that don't exist in the database\n for (const [columnName, columnDef] of Object.entries(schema)) {\n const columnExists = await this.hasColumn(TABLE_SPANS, columnName);\n if (!columnExists) {\n const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n const sqlType = mapToSqlType(columnDef.type);\n // Align with createTable: nullable columns omit NOT NULL, non-nullable columns include it\n const nullable = columnDef.nullable ? '' : 'NOT NULL';\n const defaultValue = !columnDef.nullable ? this.getDefaultValue(columnDef.type) : '';\n const alterSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n await this.client.none(alterSql);\n this.logger?.debug?.(`Added column '${columnName}' to ${fullTableName}`);\n\n // For timestamp columns, also add the timezone-aware version\n // This matches the behavior in alterTable()\n if (sqlType === 'TIMESTAMP') {\n const timestampZSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}Z\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n await this.client.none(timestampZSql);\n this.logger?.debug?.(`Added timezone column '${columnName}Z' to ${fullTableName}`);\n }\n }\n }\n\n // Also add timezone columns for any existing timestamp columns that don't have them yet\n // This handles the case where timestamp columns existed but their *Z counterparts don't\n for (const [columnName, columnDef] of Object.entries(schema)) {\n if (columnDef.type === 'timestamp') {\n const tzColumnName = `${columnName}Z`;\n const tzColumnExists = await this.hasColumn(TABLE_SPANS, tzColumnName);\n if (!tzColumnExists) {\n const parsedTzColumnName = parseSqlIdentifier(tzColumnName, 'column name');\n const timestampZSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedTzColumnName}\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n await this.client.none(timestampZSql);\n this.logger?.debug?.(`Added timezone column '${tzColumnName}' to ${fullTableName}`);\n }\n }\n }\n\n this.logger?.info?.(`Migration completed for ${fullTableName}`);\n } catch (error) {\n // Log warning but don't fail - migrations should be best-effort\n this.logger?.warn?.(`Failed to migrate spans table ${fullTableName}:`, error);\n }\n }\n\n /**\n * Deduplicates spans in the mastra_ai_spans table before adding the PRIMARY KEY constraint.\n * Keeps spans based on priority: completed (endedAt NOT NULL) > most recent updatedAt > most recent createdAt.\n *\n * Note: This prioritizes migration completion over perfect data preservation.\n * Old trace data may be lost, which is acceptable for this use case.\n */\n private async deduplicateSpans(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n try {\n // Quick check: are there any duplicates at all? Use LIMIT 1 for speed on large tables.\n const duplicateCheck = await this.client.oneOrNone<{ has_duplicates: boolean }>(`\n SELECT EXISTS (\n SELECT 1\n FROM ${fullTableName}\n GROUP BY \"traceId\", \"spanId\"\n HAVING COUNT(*) > 1\n LIMIT 1\n ) as has_duplicates\n `);\n\n if (!duplicateCheck?.has_duplicates) {\n this.logger?.debug?.(`No duplicate spans found in ${fullTableName}`);\n return;\n }\n\n this.logger?.info?.(`Duplicate spans detected in ${fullTableName}, starting deduplication...`);\n\n // Delete duplicates directly without fetching details into memory.\n // This avoids OOM issues on large tables with many duplicates.\n // Priority: completed spans (endedAt NOT NULL) > most recent updatedAt > most recent createdAt\n // Uses ctid (physical row id) as final tiebreaker for deterministic results.\n const result = await this.client.query(`\n DELETE FROM ${fullTableName} t1\n USING ${fullTableName} t2\n WHERE t1.\"traceId\" = t2.\"traceId\"\n AND t1.\"spanId\" = t2.\"spanId\"\n AND (\n -- Keep completed spans over incomplete\n (t1.\"endedAt\" IS NULL AND t2.\"endedAt\" IS NOT NULL)\n OR\n -- If both have same completion status, keep more recent updatedAt\n (\n (t1.\"endedAt\" IS NULL) = (t2.\"endedAt\" IS NULL)\n AND (\n (t1.\"updatedAt\" < t2.\"updatedAt\")\n OR (t1.\"updatedAt\" IS NULL AND t2.\"updatedAt\" IS NOT NULL)\n OR\n -- If updatedAt is the same, keep more recent createdAt\n (\n (t1.\"updatedAt\" = t2.\"updatedAt\" OR (t1.\"updatedAt\" IS NULL AND t2.\"updatedAt\" IS NULL))\n AND (\n (t1.\"createdAt\" < t2.\"createdAt\")\n OR (t1.\"createdAt\" IS NULL AND t2.\"createdAt\" IS NOT NULL)\n OR\n -- If all else equal, use ctid as tiebreaker\n (\n (t1.\"createdAt\" = t2.\"createdAt\" OR (t1.\"createdAt\" IS NULL AND t2.\"createdAt\" IS NULL))\n AND t1.ctid < t2.ctid\n )\n )\n )\n )\n )\n )\n `);\n\n this.logger?.info?.(\n `Deduplication complete: removed ${result.rowCount ?? 0} duplicate spans from ${fullTableName}`,\n );\n } catch (error) {\n // Re-throw deduplication errors so PRIMARY KEY addition will fail with a clear error\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DEDUPLICATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: TABLE_SPANS,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n private async checkForDuplicateSpans(): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n tableName: string;\n }> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n try {\n // Count duplicate (traceId, spanId) combinations\n const result = await this.client.oneOrNone<{ duplicate_count: string }>(`\n SELECT COUNT(*) as duplicate_count\n FROM (\n SELECT \"traceId\", \"spanId\"\n FROM ${fullTableName}\n GROUP BY \"traceId\", \"spanId\"\n HAVING COUNT(*) > 1\n ) duplicates\n `);\n\n const duplicateCount = parseInt(result?.duplicate_count ?? '0', 10);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n tableName: fullTableName,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger?.debug?.(`Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0, tableName: fullTableName };\n }\n }\n\n /**\n * Checks if the PRIMARY KEY constraint on (traceId, spanId) already exists on the spans table.\n * Used to skip deduplication when the constraint already exists (migration already complete).\n */\n private async spansPrimaryKeyExists(): Promise<boolean> {\n const parsedSchemaName = this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : '';\n const constraintName = buildConstraintName({\n baseName: 'mastra_ai_spans_traceid_spanid_pk',\n schemaName: parsedSchemaName || undefined,\n });\n const schemaFilter = this.schemaName || 'public';\n\n const result = await this.client.oneOrNone<{ exists: boolean }>(\n `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = lower($1) AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = $2)) as exists`,\n [constraintName, schemaFilter],\n );\n\n return result?.exists ?? false;\n }\n\n /**\n * Adds the PRIMARY KEY constraint on (traceId, spanId) to the spans table.\n * Should be called AFTER deduplication to ensure no duplicate key violations.\n */\n private async addSpansPrimaryKey(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n const parsedSchemaName = this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : '';\n const constraintName = buildConstraintName({\n baseName: 'mastra_ai_spans_traceid_spanid_pk',\n schemaName: parsedSchemaName || undefined,\n });\n const schemaFilter = this.schemaName || 'public';\n\n try {\n // Check if the constraint already exists\n const constraintExists = await this.client.oneOrNone<{ exists: boolean }>(\n `\n SELECT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = lower($1) AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = $2)\n ) as exists\n `,\n [constraintName, schemaFilter],\n );\n\n if (constraintExists?.exists) {\n this.logger?.debug?.(`PRIMARY KEY constraint ${constraintName} already exists on ${fullTableName}`);\n return;\n }\n\n // Add the PRIMARY KEY constraint\n await this.client.none(`\n ALTER TABLE ${fullTableName}\n ADD CONSTRAINT ${constraintName}\n PRIMARY KEY (\"traceId\", \"spanId\")\n `);\n\n this.logger?.info?.(`Added PRIMARY KEY constraint ${constraintName} to ${fullTableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'ADD_SPANS_PRIMARY_KEY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: TABLE_SPANS,\n constraintName,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n // Check if already migrated\n const pkExists = await this.spansPrimaryKeyExists();\n if (pkExists) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. PRIMARY KEY constraint exists on ${fullTableName}.`,\n };\n }\n\n // Check for duplicates\n const duplicateInfo = await this.checkForDuplicateSpans();\n\n if (duplicateInfo.hasDuplicates) {\n this.logger?.info?.(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting deduplication...`,\n );\n\n // Run deduplication\n await this.deduplicateSpans();\n } else {\n this.logger?.info?.(`No duplicate spans found.`);\n }\n\n // Add PRIMARY KEY constraint\n await this.addSpansPrimaryKey();\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and added PRIMARY KEY constraint to ${fullTableName}.`\n : `Migration complete. Added PRIMARY KEY constraint to ${fullTableName}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n const pkExists = await this.spansPrimaryKeyExists();\n\n if (pkExists) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: fullTableName,\n };\n }\n\n const duplicateInfo = await this.checkForDuplicateSpans();\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: fullTableName,\n };\n }\n\n /**\n * Alters table schema to add columns if they don't exist\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\n */\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n const fullTableName = getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) });\n\n try {\n for (const columnName of ifNotExists) {\n if (schema[columnName]) {\n const columnDef = schema[columnName];\n const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n const sqlType = mapToSqlType(columnDef.type);\n // Align with createTable: nullable columns omit NOT NULL, non-nullable columns include it\n const nullable = columnDef.nullable ? '' : 'NOT NULL';\n const defaultValue = !columnDef.nullable ? this.getDefaultValue(columnDef.type) : '';\n const alterSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n\n await this.client.none(alterSql);\n\n if (sqlType === 'TIMESTAMP') {\n const timestampZSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}Z\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n await this.client.none(timestampZSql);\n }\n\n this.logger?.debug?.(`Ensured column ${parsedColumnName} exists in table ${fullTableName}`);\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const keyEntries = Object.entries(keys).map(([key, value]) => [parseSqlIdentifier(key, 'column name'), value]);\n const conditions = keyEntries.map(([key], index) => `\"${key}\" = $${index + 1}`).join(' AND ');\n const values = keyEntries.map(([_, value]) => value);\n\n const result = await this.client.oneOrNone<R>(\n `SELECT * FROM ${getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) })} WHERE ${conditions} ORDER BY \"createdAt\" DESC LIMIT 1`,\n values,\n );\n\n if (!result) {\n return null;\n }\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = result as any;\n if (typeof snapshot.snapshot === 'string') {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n }\n return snapshot;\n }\n\n return result;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n try {\n await this.client.query('BEGIN');\n for (const record of records) {\n await this.insert({ tableName, record });\n }\n await this.client.query('COMMIT');\n } catch (error) {\n await this.client.query('ROLLBACK');\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n numberOfRecords: records.length,\n },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const schemaName = getSchemaName(this.schemaName);\n const tableNameWithSchema = getTableName({ indexName: tableName, schemaName });\n await this.client.none(`DROP TABLE IF EXISTS ${tableNameWithSchema}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async createIndex(options: CreateIndexOptions): Promise<void> {\n try {\n const {\n name,\n table,\n columns,\n unique = false,\n concurrent = true,\n where,\n method = 'btree',\n opclass,\n storage,\n tablespace,\n } = options;\n\n const schemaName = this.schemaName || 'public';\n const fullTableName = getTableName({\n indexName: table as TABLE_NAMES,\n schemaName: getSchemaName(this.schemaName),\n });\n\n const indexExists = await this.client.oneOrNone(\n `SELECT 1 FROM pg_indexes\n WHERE indexname = $1\n AND schemaname = $2`,\n [name, schemaName],\n );\n\n if (indexExists) {\n return;\n }\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const concurrentStr = concurrent ? 'CONCURRENTLY ' : '';\n const methodStr = method !== 'btree' ? `USING ${method} ` : '';\n\n const columnsStr = columns\n .map(col => {\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n if (!colName) {\n throw new Error(`Invalid column specification: ${col}`);\n }\n const quotedCol = `\"${parseSqlIdentifier(colName, 'column name')}\" ${modifiers.join(' ')}`;\n return opclass ? `${quotedCol} ${opclass}` : quotedCol;\n }\n const quotedCol = `\"${parseSqlIdentifier(col, 'column name')}\"`;\n return opclass ? `${quotedCol} ${opclass}` : quotedCol;\n })\n .join(', ');\n\n const whereStr = where ? ` WHERE ${where}` : '';\n const tablespaceStr = tablespace ? ` TABLESPACE ${tablespace}` : '';\n\n let withStr = '';\n if (storage && Object.keys(storage).length > 0) {\n const storageParams = Object.entries(storage)\n .map(([key, value]) => `${key} = ${value}`)\n .join(', ');\n withStr = ` WITH (${storageParams})`;\n }\n\n const quotedIndexName = `\"${parseSqlIdentifier(name, 'index name')}\"`;\n const sql = `CREATE ${uniqueStr}INDEX ${concurrentStr}${quotedIndexName} ON ${fullTableName} ${methodStr}(${columnsStr})${withStr}${tablespaceStr}${whereStr}`;\n\n await this.client.none(sql);\n } catch (error) {\n if (error instanceof Error && error.message.includes('CONCURRENTLY')) {\n const retryOptions = { ...options, concurrent: false };\n return this.createIndex(retryOptions);\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_CREATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName: options.name,\n tableName: options.table,\n },\n },\n error,\n );\n }\n }\n\n async dropIndex(indexName: string): Promise<void> {\n try {\n const schemaName = this.schemaName || 'public';\n const indexExists = await this.client.oneOrNone(\n `SELECT 1 FROM pg_indexes\n WHERE indexname = $1\n AND schemaname = $2`,\n [indexName, schemaName],\n );\n\n if (!indexExists) {\n return;\n }\n\n const quotedIndexName = `\"${parseSqlIdentifier(indexName, 'index name')}\"`;\n const sql = `DROP INDEX IF EXISTS ${getSchemaName(this.schemaName)}.${quotedIndexName}`;\n await this.client.none(sql);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_DROP', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async listIndexes(tableName?: string): Promise<IndexInfo[]> {\n try {\n const schemaName = this.schemaName || 'public';\n\n let query: string;\n let params: any[];\n\n if (tableName) {\n query = `\n SELECT\n i.indexname as name,\n i.tablename as table,\n i.indexdef as definition,\n ix.indisunique as is_unique,\n pg_size_pretty(pg_relation_size(c.oid)) as size,\n array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) as columns\n FROM pg_indexes i\n JOIN pg_class c ON c.relname = i.indexname AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = i.schemaname)\n JOIN pg_index ix ON ix.indexrelid = c.oid\n JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = ANY(ix.indkey)\n WHERE i.schemaname = $1\n AND i.tablename = $2\n GROUP BY i.indexname, i.tablename, i.indexdef, ix.indisunique, c.oid\n `;\n params = [schemaName, tableName];\n } else {\n query = `\n SELECT\n i.indexname as name,\n i.tablename as table,\n i.indexdef as definition,\n ix.indisunique as is_unique,\n pg_size_pretty(pg_relation_size(c.oid)) as size,\n array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) as columns\n FROM pg_indexes i\n JOIN pg_class c ON c.relname = i.indexname AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = i.schemaname)\n JOIN pg_index ix ON ix.indexrelid = c.oid\n JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = ANY(ix.indkey)\n WHERE i.schemaname = $1\n GROUP BY i.indexname, i.tablename, i.indexdef, ix.indisunique, c.oid\n `;\n params = [schemaName];\n }\n\n const results = await this.client.manyOrNone(query, params);\n\n return results.map(row => {\n let columns: string[] = [];\n if (typeof row.columns === 'string' && row.columns.startsWith('{') && row.columns.endsWith('}')) {\n const arrayContent = row.columns.slice(1, -1);\n columns = arrayContent ? arrayContent.split(',') : [];\n } else if (Array.isArray(row.columns)) {\n columns = row.columns;\n }\n\n return {\n name: row.name,\n table: row.table,\n columns,\n unique: row.is_unique || false,\n size: row.size || '0',\n definition: row.definition || '',\n };\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_LIST', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: tableName\n ? {\n tableName,\n }\n : {},\n },\n error,\n );\n }\n }\n\n async describeIndex(indexName: string): Promise<StorageIndexStats> {\n try {\n const schemaName = this.schemaName || 'public';\n\n const query = `\n SELECT\n i.indexname as name,\n i.tablename as table,\n i.indexdef as definition,\n ix.indisunique as is_unique,\n pg_size_pretty(pg_relation_size(c.oid)) as size,\n array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) as columns,\n am.amname as method,\n s.idx_scan as scans,\n s.idx_tup_read as tuples_read,\n s.idx_tup_fetch as tuples_fetched\n FROM pg_indexes i\n JOIN pg_class c ON c.relname = i.indexname AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = i.schemaname)\n JOIN pg_index ix ON ix.indexrelid = c.oid\n JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = ANY(ix.indkey)\n JOIN pg_am am ON c.relam = am.oid\n LEFT JOIN pg_stat_user_indexes s ON s.indexrelname = i.indexname AND s.schemaname = i.schemaname\n WHERE i.schemaname = $1\n AND i.indexname = $2\n GROUP BY i.indexname, i.tablename, i.indexdef, ix.indisunique, c.oid, am.amname, s.idx_scan, s.idx_tup_read, s.idx_tup_fetch\n `;\n\n const result = await this.client.oneOrNone(query, [schemaName, indexName]);\n\n if (!result) {\n throw new Error(`Index \"${indexName}\" not found in schema \"${schemaName}\"`);\n }\n\n let columns: string[] = [];\n if (typeof result.columns === 'string' && result.columns.startsWith('{') && result.columns.endsWith('}')) {\n const arrayContent = result.columns.slice(1, -1);\n columns = arrayContent ? arrayContent.split(',') : [];\n } else if (Array.isArray(result.columns)) {\n columns = result.columns;\n }\n\n return {\n name: result.name,\n table: result.table,\n columns,\n unique: result.is_unique || false,\n size: result.size || '0',\n definition: result.definition || '',\n method: result.method || 'btree',\n scans: parseInt(String(result.scans)) || 0,\n tuples_read: parseInt(String(result.tuples_read)) || 0,\n tuples_fetched: parseInt(String(result.tuples_fetched)) || 0,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_DESCRIBE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async update({\n tableName,\n keys,\n data,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n }): Promise<void> {\n try {\n const setColumns: string[] = [];\n const setValues: any[] = [];\n let paramIndex = 1;\n\n Object.entries(data).forEach(([key, value]) => {\n const parsedKey = parseSqlIdentifier(key, 'column name');\n setColumns.push(`\"${parsedKey}\" = $${paramIndex++}`);\n setValues.push(this.prepareValue(value, key, tableName));\n });\n\n const whereConditions: string[] = [];\n const whereValues: any[] = [];\n\n Object.entries(keys).forEach(([key, value]) => {\n const parsedKey = parseSqlIdentifier(key, 'column name');\n whereConditions.push(`\"${parsedKey}\" = $${paramIndex++}`);\n whereValues.push(this.prepareValue(value, key, tableName));\n });\n\n const tableName_ = getTableName({\n indexName: tableName,\n schemaName: getSchemaName(this.schemaName),\n });\n\n const sql = `UPDATE ${tableName_} SET ${setColumns.join(', ')} WHERE ${whereConditions.join(' AND ')}`;\n const values = [...setValues, ...whereValues];\n\n await this.client.none(sql, values);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n try {\n await this.client.query('BEGIN');\n for (const { keys, data } of updates) {\n await this.update({ tableName, keys, data });\n }\n await this.client.query('COMMIT');\n } catch (error) {\n await this.client.query('ROLLBACK');\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n numberOfRecords: updates.length,\n },\n },\n error,\n );\n }\n }\n\n async batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any>[] }): Promise<void> {\n try {\n if (keys.length === 0) {\n return;\n }\n\n const tableName_ = getTableName({\n indexName: tableName,\n schemaName: getSchemaName(this.schemaName),\n });\n\n await this.client.tx(async t => {\n for (const keySet of keys) {\n const conditions: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n Object.entries(keySet).forEach(([key, value]) => {\n const parsedKey = parseSqlIdentifier(key, 'column name');\n conditions.push(`\"${parsedKey}\" = $${paramIndex++}`);\n values.push(value);\n });\n\n const sql = `DELETE FROM ${tableName_} WHERE ${conditions.join(' AND ')}`;\n await t.none(sql, values);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n numberOfRecords: keys.length,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Delete all data from a table (alias for clearTable for consistency with other stores)\n */\n async deleteData({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.clearTable({ tableName });\n }\n}\n","import type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nexport function getSchemaName(schema?: string) {\n return schema ? `\"${parseSqlIdentifier(schema, 'schema name')}\"` : undefined;\n}\n\nexport function getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const quotedIndexName = `\"${parsedIndexName}\"`;\n const quotedSchemaName = schemaName;\n return quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * Prepare WHERE clause for PostgreSQL queries\n */\nexport function prepareWhereClause(\n filters: Record<string, any>,\n _schema?: Record<string, StorageColumn>,\n): { sql: string; args: any[] } {\n const conditions: string[] = [];\n const args: any[] = [];\n let paramIndex = 1;\n\n Object.entries(filters).forEach(([key, value]) => {\n if (value === undefined) return;\n\n // Handle special operators\n if (key.endsWith('_gte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`\"${parseSqlIdentifier(fieldName, 'field name')}\" >= $${paramIndex++}`);\n args.push(value instanceof Date ? value.toISOString() : value);\n } else if (key.endsWith('_lte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`\"${parseSqlIdentifier(fieldName, 'field name')}\" <= $${paramIndex++}`);\n args.push(value instanceof Date ? value.toISOString() : value);\n } else if (value === null) {\n conditions.push(`\"${parseSqlIdentifier(key, 'field name')}\" IS NULL`);\n } else {\n conditions.push(`\"${parseSqlIdentifier(key, 'field name')}\" = $${paramIndex++}`);\n args.push(value instanceof Date ? value.toISOString() : value);\n }\n });\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n}\n\n/**\n * Transform SQL row to record format, handling JSON columns\n */\nexport function transformFromSqlRow<T>({\n tableName,\n sqlRow,\n}: {\n tableName: TABLE_NAMES;\n sqlRow: Record<string, any>;\n}): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n\n Object.entries(sqlRow).forEach(([key, value]) => {\n const columnSchema = schema?.[key];\n\n // Handle JSON columns\n if (columnSchema?.type === 'jsonb' && typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n }\n // Handle Date columns\n // Handle Date columns - convert to Date objects for timestamp columns\n else if (columnSchema?.type === 'timestamp' && value && typeof value === 'string') {\n result[key] = new Date(value);\n } else if (columnSchema?.type === 'timestamp' && value instanceof Date) {\n result[key] = value;\n }\n // Handle boolean columns\n else if (columnSchema?.type === 'boolean') {\n result[key] = Boolean(value);\n } else {\n result[key] = value;\n }\n });\n\n return result as T;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageAgentType,\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n CreateIndexOptions,\n AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport type {\n AgentVersion,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n} from '@mastra/core/storage/domains/agents';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nexport class AgentsPG extends AgentsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (AgentsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the agents domain tables.\n * Currently no default indexes are defined for agents.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for agents.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n // No default indexes for agents domain\n }\n\n async init(): Promise<void> {\n // Migrate from legacy schemas before creating tables\n await this.#migrateFromLegacySchema();\n await this.#migrateVersionsSchema();\n\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] });\n // Add new columns for backwards compatibility with intermediate schema versions\n await this.#db.alterTable({\n tableName: TABLE_AGENTS,\n schema: TABLE_SCHEMAS[TABLE_AGENTS],\n ifNotExists: ['status', 'authorId'],\n });\n\n // Migrate tools field from string[] to JSONB format\n await this.#migrateToolsToJsonbFormat();\n\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n\n // Clean up any stale draft records from previously failed createAgent calls\n await this.#cleanupStaleDrafts();\n }\n\n /**\n * Migrates from the legacy flat agent schema (where config fields like name, instructions, model\n * were stored directly on mastra_agents) to the new versioned schema (thin agent record + versions table).\n */\n async #migrateFromLegacySchema(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n const fullVersionsTableName = getTableName({\n indexName: TABLE_AGENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const legacyTableName = getTableName({\n indexName: `${TABLE_AGENTS}_legacy`,\n schemaName: getSchemaName(this.#schema),\n });\n\n const hasLegacyColumns = await this.#db.hasColumn(TABLE_AGENTS, 'name');\n\n if (hasLegacyColumns) {\n // Current table has legacy schema — rename it and drop old versions table\n await this.#db.client.none(`ALTER TABLE ${fullTableName} RENAME TO \"${TABLE_AGENTS}_legacy\"`);\n await this.#db.client.none(`DROP TABLE IF EXISTS ${fullVersionsTableName}`);\n }\n\n // Check if legacy table exists (either just renamed, or left behind by a previous partial migration)\n const legacyExists = await this.#db.hasColumn(`${TABLE_AGENTS}_legacy`, 'name');\n if (!legacyExists) return;\n\n // Read all existing agents from the legacy table\n const oldAgents = await this.#db.client.manyOrNone(`SELECT * FROM ${legacyTableName}`);\n\n // Create new tables (IF NOT EXISTS handles idempotency on resume)\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] });\n\n // ON CONFLICT DO NOTHING makes inserts safe for resumed partial migrations\n for (const row of oldAgents) {\n const agentId = row.id as string;\n if (!agentId) continue;\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n\n await this.#db.client.none(\n `INSERT INTO ${fullTableName} (id, status, \"activeVersionId\", \"authorId\", metadata, \"createdAt\", \"updatedAt\")\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (id) DO NOTHING`,\n [\n agentId,\n 'published',\n versionId,\n row.ownerId ?? row.authorId ?? null,\n row.metadata ? JSON.stringify(row.metadata) : null,\n row.createdAt ?? now,\n row.updatedAt ?? now,\n ],\n );\n\n await this.#db.client.none(\n `INSERT INTO ${fullVersionsTableName}\n (id, \"agentId\", \"versionNumber\", name, description, instructions, model, tools,\n \"defaultOptions\", workflows, agents, \"integrationTools\", \"inputProcessors\",\n \"outputProcessors\", memory, scorers, \"changedFields\", \"changeMessage\", \"createdAt\")\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)\n ON CONFLICT (id) DO NOTHING`,\n [\n versionId,\n agentId,\n 1,\n row.name ?? agentId,\n row.description ?? null,\n this.serializeInstructions(row.instructions ?? ''),\n row.model ? JSON.stringify(row.model) : '{}',\n row.tools ? JSON.stringify(row.tools) : null,\n row.defaultOptions ? JSON.stringify(row.defaultOptions) : null,\n row.workflows ? JSON.stringify(row.workflows) : null,\n row.agents ? JSON.stringify(row.agents) : null,\n row.integrationTools ? JSON.stringify(row.integrationTools) : null,\n row.inputProcessors ? JSON.stringify(row.inputProcessors) : null,\n row.outputProcessors ? JSON.stringify(row.outputProcessors) : null,\n row.memory ? JSON.stringify(row.memory) : null,\n row.scorers ? JSON.stringify(row.scorers) : null,\n null,\n 'Migrated from legacy schema',\n row.createdAt ?? now,\n ],\n );\n }\n\n // Drop legacy table only after all inserts succeed\n await this.#db.client.none(`DROP TABLE IF EXISTS ${legacyTableName}`);\n }\n\n /**\n * Migrates the agent_versions table from the old snapshot-based schema (single `snapshot` JSON column)\n * to the new flat schema (individual config columns). This handles the case where the agents table\n * was already migrated but the versions table still has the old schema.\n */\n async #migrateVersionsSchema(): Promise<void> {\n const hasSnapshotColumn = await this.#db.hasColumn(TABLE_AGENT_VERSIONS, 'snapshot');\n if (!hasSnapshotColumn) return;\n\n const fullVersionsTableName = getTableName({\n indexName: TABLE_AGENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const legacyTableName = getTableName({\n indexName: `${TABLE_AGENTS}_legacy`,\n schemaName: getSchemaName(this.#schema),\n });\n\n // Drop the old versions table - the new schema will be created by init()\n await this.#db.client.none(`DROP TABLE IF EXISTS ${fullVersionsTableName}`);\n\n // Also clean up any lingering legacy table from a partial migration\n await this.#db.client.none(`DROP TABLE IF EXISTS ${legacyTableName}`);\n }\n\n /**\n * Migrates the tools field from string[] format to JSONB format { \"tool-key\": { \"description\": \"...\" } }.\n * This handles the transition from the old format where tools were stored as an array of string keys\n * to the new format where tools can have per-agent description overrides.\n */\n async #migrateToolsToJsonbFormat(): Promise<void> {\n const fullVersionsTableName = getTableName({\n indexName: TABLE_AGENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n try {\n // Check if any records have tools stored as a JSON array\n const recordsWithArrayTools = await this.#db.client.any(\n `SELECT id, tools FROM ${fullVersionsTableName} \n WHERE tools IS NOT NULL \n AND jsonb_typeof(tools) = 'array'`,\n );\n\n if (recordsWithArrayTools.length === 0) {\n return; // No migration needed\n }\n\n // Convert each record's tools from array to object format\n for (const record of recordsWithArrayTools) {\n const toolsArray = record.tools as string[];\n const toolsObject: Record<string, { description?: string }> = {};\n\n // Convert each tool string to an object key with empty config\n for (const toolKey of toolsArray) {\n toolsObject[toolKey] = {};\n }\n\n // Update the record with the new format\n await this.#db.client.none(\n `UPDATE ${fullVersionsTableName} \n SET tools = $1::jsonb \n WHERE id = $2`,\n [JSON.stringify(toolsObject), record.id],\n );\n }\n\n this.logger?.info?.(\n `Migrated ${recordsWithArrayTools.length} agent version(s) tools from array to object format`,\n );\n } catch (error) {\n // Log but don't fail - this is a non-breaking migration\n this.logger?.warn?.('Failed to migrate tools to JSONB format:', error);\n }\n }\n\n /**\n * Removes stale draft agent records that have no activeVersionId.\n * These are left behind when createAgent partially fails (inserts thin record\n * but fails to create the version due to schema mismatch).\n */\n async #cleanupStaleDrafts(): Promise<void> {\n try {\n const fullTableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${fullTableName} WHERE status = 'draft' AND \\\"activeVersionId\\\" IS NULL`);\n } catch {\n // Non-critical cleanup, ignore errors\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\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 parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseRow(row: any): StorageAgentType {\n return {\n id: row.id as string,\n status: row.status as 'draft' | 'published' | 'archived',\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: row.createdAtZ || row.createdAt,\n updatedAt: row.updatedAtZ || row.updatedAt,\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin agent record with status='draft' and activeVersionId=null\n await this.#db.client.none(\n `INSERT INTO ${agentsTable} (\n id, status, \"authorId\", metadata,\n \"activeVersionId\",\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n agent.id,\n 'draft',\n agent.authorId ?? null,\n agent.metadata ? JSON.stringify(agent.metadata) : null,\n null, // activeVersionId starts as null\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract config fields from the flat input\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n // Create version 1 from the config\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n agentId: agent.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n // 3. Return the thin agent record (activeVersionId remains null)\n return {\n id: agent.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: agent.authorId,\n metadata: agent.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n // Best-effort cleanup to prevent orphaned draft records\n try {\n const agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(\n `DELETE FROM ${agentsTable} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [agent.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n // First, get the existing agent\n const existingAgent = await this.getById(id);\n if (!existingAgent) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 // Separate metadata fields from config fields\n const { authorId, activeVersionId, metadata, ...configFields } = updates;\n\n // Extract just the config field names from StorageAgentSnapshotType\n const configFieldNames = [\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 ];\n\n // Check if any config fields are present in the update\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Handle config updates by creating a new version\n if (hasConfigUpdate) {\n // Get the latest version to use as base\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_AGENT', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for agent ${id}`,\n details: { agentId: id },\n });\n }\n\n // Extract config from latest version\n const {\n id: _versionId,\n agentId: _agentId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n // Merge updates into latest config\n // Convert null values to undefined (null means \"remove this field\")\n const sanitizedConfigFields = Object.fromEntries(\n Object.entries(configFields).map(([key, value]) => [key, value === null ? undefined : value]),\n );\n const newConfig = {\n ...latestConfig,\n ...sanitizedConfigFields,\n };\n\n // Identify which fields changed\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n // Create new version only if fields changed\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n const newVersionNumber = latestVersion.versionNumber + 1;\n\n await this.createVersion({\n id: newVersionId,\n agentId: id,\n versionNumber: newVersionNumber,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the agent record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Do NOT automatically set status='published' when activeVersionId is updated\n }\n\n if (metadata !== undefined) {\n // REPLACE metadata (not merge) - this is standard DB behavior\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(metadata));\n }\n\n // Always update the updatedAt timestamp\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n // Add the ID for the WHERE clause\n values.push(id);\n\n if (setClauses.length > 2) {\n // More than just updatedAt and updatedAtZ\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n // Return the updated agent\n const updatedAgent = await this.getById(id);\n if (!updatedAgent) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${id} not found after update`,\n details: { agentId: id },\n });\n }\n\n return updatedAgent;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n // Delete all versions for this agent first\n await this.deleteVersionsByParentId(id);\n\n // Then delete the agent\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n const { page = 0, perPage: perPageInput, orderBy } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n // Get total count\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName}`);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n agents: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ORDER BY \"${field}\" ${direction} LIMIT $1 OFFSET $2`,\n [limitValue, offset],\n );\n\n const agents = (dataResult || []).map(row => this.parseRow(row));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_AGENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Agent Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"agentId\", \"versionNumber\",\n name, description, instructions, model, tools,\n \"defaultOptions\", workflows, agents, \"integrationTools\",\n \"inputProcessors\", \"outputProcessors\", memory, scorers,\n \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20)`,\n [\n input.id,\n input.agentId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n this.serializeInstructions(input.instructions),\n JSON.stringify(input.model),\n input.tools ? JSON.stringify(input.tools) : null,\n input.defaultOptions ? JSON.stringify(input.defaultOptions) : null,\n input.workflows ? JSON.stringify(input.workflows) : null,\n input.agents ? JSON.stringify(input.agents) : null,\n input.integrationTools ? JSON.stringify(input.integrationTools) : null,\n input.inputProcessors ? JSON.stringify(input.inputProcessors) : null,\n input.outputProcessors ? JSON.stringify(input.outputProcessors) : null,\n input.memory ? JSON.stringify(input.memory) : null,\n input.scorers ? JSON.stringify(input.scorers) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 AND \"versionNumber\" = $2`,\n [agentId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [agentId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n\n // Get total count\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"agentId\" = $1`, [\n agentId,\n ]);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [agentId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"agentId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"agentId\" = $1`, [\n agentId,\n ]);\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'COUNT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private serializeInstructions(instructions: string | AgentInstructionBlock[] | undefined | null): string | undefined {\n if (instructions == null) return undefined;\n return Array.isArray(instructions) ? JSON.stringify(instructions) : instructions;\n }\n\n private deserializeInstructions(raw: string | null | undefined): string | AgentInstructionBlock[] {\n if (!raw) return '';\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n } catch {\n // Not JSON — plain string\n }\n return raw;\n }\n\n private parseVersionRow(row: any): AgentVersion {\n return {\n id: row.id as string,\n agentId: row.agentId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n instructions: this.deserializeInstructions(row.instructions as string),\n model: this.parseJson(row.model, 'model'),\n tools: this.parseJson(row.tools, 'tools'),\n defaultOptions: this.parseJson(row.defaultOptions, 'defaultOptions'),\n workflows: this.parseJson(row.workflows, 'workflows'),\n agents: this.parseJson(row.agents, 'agents'),\n integrationTools: this.parseJson(row.integrationTools, 'integrationTools'),\n inputProcessors: this.parseJson(row.inputProcessors, 'inputProcessors'),\n outputProcessors: this.parseJson(row.outputProcessors, 'outputProcessors'),\n memory: this.parseJson(row.memory, 'memory'),\n scorers: this.parseJson(row.scorers, 'scorers'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: row.createdAtZ || row.createdAt,\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\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 MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n createStorageErrorId,\n} from '@mastra/core/storage';\n\n/**\n * Local constant for the observational memory table name.\n * Defined locally to avoid a static import that crashes on older @mastra/core\n * versions that don't export TABLE_OBSERVATIONAL_MEMORY.\n */\nconst OM_TABLE = 'mastra_observational_memory' as const;\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n CreateIndexOptions,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n ObservationalMemoryRecord,\n BufferedObservationChunk,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n UpdateBufferedReflectionInput,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n} from '@mastra/core/storage';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\n\n// Database row type that includes timezone-aware columns\ntype MessageRowFromDB = {\n id: string;\n content: string | any;\n role: string;\n type?: string;\n createdAt: Date | string;\n createdAtZ?: Date | string;\n threadId: string;\n resourceId: string;\n};\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const quotedIndexName = `\"${indexName}\"`;\n return schemaName ? `${schemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * Generate SQL placeholder string for IN clauses.\n * @param count - Number of placeholders to generate\n * @param startIndex - Starting index for placeholders (default: 1)\n * @returns Comma-separated placeholder string, e.g. \"$1, $2, $3\"\n */\nfunction inPlaceholders(count: number, startIndex = 1): string {\n return Array.from({ length: count }, (_, i) => `$${i + startIndex}`).join(', ');\n}\n\nexport class MemoryPG extends MemoryStorage {\n readonly supportsObservationalMemory = true;\n\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, OM_TABLE] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (MemoryPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n\n // Dynamically import OM schema to avoid breaking older @mastra/core versions\n let omSchema: Record<string, any> | undefined;\n try {\n const { OBSERVATIONAL_MEMORY_TABLE_SCHEMA } = await import('@mastra/core/storage');\n omSchema = OBSERVATIONAL_MEMORY_TABLE_SCHEMA?.[OM_TABLE];\n } catch {\n // OM not available in this version of core\n }\n\n if (omSchema) {\n await this.#db.createTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n });\n // Add new OM columns for backwards compatibility with existing databases\n await this.#db.alterTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n ifNotExists: [\n 'observedMessageIds',\n 'observedTimezone',\n 'bufferedObservations',\n 'bufferedObservationTokens',\n 'bufferedMessageIds',\n 'bufferedReflection',\n 'bufferedReflectionTokens',\n 'bufferedReflectionInputTokens',\n 'bufferedObservationChunks',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n ],\n });\n }\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n if (omSchema) {\n // Create index on lookupKey for efficient OM queries\n const omTableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON ${omTableName} (\"lookupKey\")`);\n }\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Returns default index definitions for the memory domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return [\n {\n name: `${schemaPrefix}mastra_threads_resourceid_createdat_idx`,\n table: TABLE_THREADS,\n columns: ['resourceId', 'createdAt DESC'],\n },\n {\n name: `${schemaPrefix}mastra_messages_thread_id_createdat_idx`,\n table: TABLE_MESSAGES,\n columns: ['thread_id', 'createdAt DESC'],\n },\n ];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n }\n\n /**\n * Normalizes message row from database by applying createdAtZ fallback\n */\n private normalizeMessageRow(row: MessageRowFromDB): Omit<MessageRowFromDB, 'createdAtZ'> {\n return {\n id: row.id,\n content: row.content,\n role: row.role,\n type: row.type,\n createdAt: row.createdAtZ || row.createdAt,\n threadId: row.threadId,\n resourceId: row.resourceId,\n };\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n\n const thread = await this.#db.client.oneOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n `SELECT * FROM ${tableName} WHERE id = $1`,\n [threadId],\n );\n\n if (!thread) {\n return null;\n }\n\n return {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAtZ || thread.createdAt,\n updatedAt: thread.updatedAtZ || thread.updatedAt,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 { field, direction } = this.parseOrderBy(orderBy);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const whereClauses: string[] = [];\n const queryParams: any[] = [];\n let paramIndex = 1;\n\n // Add resourceId filter if provided\n if (filter?.resourceId) {\n whereClauses.push(`\"resourceId\" = $${paramIndex}`);\n queryParams.push(filter.resourceId);\n paramIndex++;\n }\n\n // Add metadata filters if provided (AND logic)\n // Uses JSONB containment (@>) to avoid SQL injection and correctly match all value types including null\n // metadata column is TEXT type storing JSON, so we need to cast to jsonb first\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n // Use JSONB containment operator - no key interpolation needed\n whereClauses.push(`metadata::jsonb @> $${paramIndex}::jsonb`);\n // Build a small JSON object for each key-value pair\n queryParams.push(JSON.stringify({ [key]: value }));\n paramIndex++;\n }\n }\n\n const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n const baseQuery = `FROM ${tableName} ${whereClause}`;\n\n const countQuery = `SELECT COUNT(*) ${baseQuery}`;\n const countResult = await this.#db.client.one(countQuery, queryParams);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n // Select both standard and timezone-aware columns (*Z) for proper UTC timestamp handling\n const dataQuery = `SELECT id, \"resourceId\", title, metadata, \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\" ${baseQuery} ORDER BY \"${field}\" ${direction} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`;\n const rows = await this.#db.client.manyOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n dataQuery,\n [...queryParams, limitValue, offset],\n );\n\n const threads = (rows || []).map(thread => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n // Use timezone-aware columns (*Z) for correct UTC timestamps, with fallback for legacy data\n createdAt: thread.createdAtZ || thread.createdAt,\n updatedAt: thread.updatedAtZ || thread.updatedAt,\n }));\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', '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 return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id,\n \"resourceId\",\n title,\n metadata,\n \"createdAt\",\n \"createdAtZ\",\n \"updatedAt\",\n \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (id) DO UPDATE SET\n \"resourceId\" = EXCLUDED.\"resourceId\",\n title = EXCLUDED.title,\n metadata = EXCLUDED.metadata,\n \"createdAt\" = EXCLUDED.\"createdAt\",\n \"createdAtZ\" = EXCLUDED.\"createdAtZ\",\n \"updatedAt\" = EXCLUDED.\"updatedAt\",\n \"updatedAtZ\" = EXCLUDED.\"updatedAtZ\"`,\n [\n thread.id,\n thread.resourceId,\n thread.title,\n thread.metadata ? JSON.stringify(thread.metadata) : null,\n thread.createdAt,\n thread.createdAt,\n thread.updatedAt,\n thread.updatedAt,\n ],\n );\n\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: thread.id,\n },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const existingThread = await this.getThreadById({ threadId: id });\n if (!existingThread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: {\n threadId: id,\n title,\n },\n });\n }\n\n const mergedMetadata = {\n ...existingThread.metadata,\n ...metadata,\n };\n\n try {\n const now = new Date().toISOString();\n const thread = await this.#db.client.one<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n `UPDATE ${threadTableName}\n SET\n title = $1,\n metadata = $2,\n \"updatedAt\" = $3,\n \"updatedAtZ\" = $4\n WHERE id = $5\n RETURNING *\n `,\n [title, mergedMetadata, now, now, id],\n );\n\n return {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAtZ || thread.createdAt,\n updatedAt: thread.updatedAtZ || thread.updatedAt,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: id,\n title,\n },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.tx(async t => {\n await t.none(`DELETE FROM ${tableName} WHERE thread_id = $1`, [threadId]);\n\n const schemaName = this.#schema || 'public';\n const vectorTables = await t.manyOrNone<{ tablename: string }>(\n `\n SELECT tablename\n FROM pg_tables\n WHERE schemaname = $1\n AND (tablename = 'memory_messages' OR tablename LIKE 'memory_messages_%')\n `,\n [schemaName],\n );\n\n for (const { tablename } of vectorTables) {\n const vectorTableName = getTableName({ indexName: tablename, schemaName: getSchemaName(this.#schema) });\n await t.none(`DELETE FROM ${vectorTableName} WHERE metadata->>'thread_id' = $1`, [threadId]);\n }\n\n await t.none(`DELETE FROM ${threadTableName} WHERE id = $1`, [threadId]);\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Fetches messages around target messages using cursor-based pagination.\n *\n * This replaces the previous ROW_NUMBER() approach which caused severe performance\n * issues on large tables (see GitHub issue #11150). The old approach required\n * scanning and sorting ALL messages in a thread to assign row numbers.\n *\n * The new approach uses the existing (thread_id, createdAt) index to efficiently\n * fetch only the messages needed by using createdAt as a cursor.\n */\n private async _getIncludedMessages({ include }: { include: StorageListMessagesInput['include'] }) {\n if (!include || include.length === 0) return null;\n\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const selectColumns = `id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n\n // Build a single efficient query that fetches context for all target messages\n // For each target message, we fetch:\n // 1. The target message itself plus any previous messages (createdAt <= target)\n // 2. Any next messages after the target (createdAt > target)\n // Each subquery is wrapped in parentheses to allow ORDER BY within UNION ALL\n const unionQueries: string[] = [];\n const params: any[] = [];\n let paramIdx = 1;\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n\n // Always fetch the target message, plus any requested previous messages\n // Uses createdAt <= target's createdAt, ordered DESC, limited to withPreviousMessages + 1\n // The +1 ensures we always get the target message itself\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = (SELECT thread_id FROM ${tableName} WHERE id = $${paramIdx})\n AND COALESCE(m.\"createdAtZ\", m.\"createdAt\") <= (SELECT COALESCE(\"createdAtZ\", \"createdAt\") FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY COALESCE(m.\"createdAtZ\", m.\"createdAt\") DESC\n LIMIT $${paramIdx + 1}\n )`);\n params.push(id, withPreviousMessages + 1); // +1 to include the target message itself\n paramIdx += 2;\n\n // Query for messages after the target (only if requested)\n // Uses createdAt > target's createdAt, ordered ASC, limited to withNextMessages\n if (withNextMessages > 0) {\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = (SELECT thread_id FROM ${tableName} WHERE id = $${paramIdx})\n AND COALESCE(m.\"createdAtZ\", m.\"createdAt\") > (SELECT COALESCE(\"createdAtZ\", \"createdAt\") FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY COALESCE(m.\"createdAtZ\", m.\"createdAt\") ASC\n LIMIT $${paramIdx + 1}\n )`);\n params.push(id, withNextMessages);\n paramIdx += 2;\n }\n }\n\n if (unionQueries.length === 0) return null;\n\n // When there's only one subquery, we don't need UNION ALL or an outer ORDER BY\n // (the subquery already has its own ORDER BY)\n // When there are multiple subqueries, we join them and sort the combined result\n let finalQuery: string;\n if (unionQueries.length === 1) {\n // Single query - just use it directly (remove outer parentheses for cleaner SQL)\n finalQuery = unionQueries[0]!.slice(1, -1); // Remove ( and )\n } else {\n // Multiple queries - UNION ALL and sort the result\n finalQuery = `SELECT * FROM (${unionQueries.join(' UNION ALL ')}) AS combined ORDER BY \"createdAt\" ASC`;\n }\n const includedRows = await this.#db.client.manyOrNone(finalQuery, params);\n\n // Deduplicate results (messages may appear in multiple context windows)\n const seen = new Set<string>();\n const dedupedRows = includedRows.filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n return dedupedRows;\n }\n\n private parseRow(row: MessageRowFromDB): MastraDBMessage {\n const normalized = this.normalizeMessageRow(row);\n let content = normalized.content;\n try {\n content = JSON.parse(normalized.content);\n } catch {\n // use content as is if it's not JSON\n }\n return {\n id: normalized.id,\n content,\n role: normalized.role as MastraDBMessage['role'],\n createdAt: new Date(normalized.createdAt as string),\n threadId: normalized.threadId,\n resourceId: normalized.resourceId,\n ...(normalized.type && normalized.type !== 'v2' ? { type: normalized.type } : {}),\n } satisfies MastraDBMessage;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n\n try {\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const query = `\n ${selectStatement} FROM ${tableName}\n WHERE id IN (${inPlaceholders(messageIds.length)})\n ORDER BY \"createdAt\" DESC\n `;\n const resultRows = await this.#db.client.manyOrNone(query, messageIds);\n\n const list = new MessageList().add(\n resultRows.map(row => this.parseRow(row)) as (MastraMessageV1 | MastraDBMessage)[],\n 'memory',\n );\n return { messages: list.get.all.db() };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: JSON.stringify(messageIds),\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException(mastraError);\n return { messages: [] };\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n const threadIds = (Array.isArray(threadId) ? threadId : [threadId]).filter(\n (id): id is string => typeof id === 'string',\n );\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? String(threadId) : String(threadId) },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n if (page < 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Page number must be non-negative',\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n page,\n },\n });\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n const conditions: string[] = [`thread_id IN (${inPlaceholders(threadIds.length)})`];\n const queryParams: any[] = [...threadIds];\n let paramIndex = threadIds.length + 1;\n\n if (resourceId) {\n conditions.push(`\"resourceId\" = $${paramIndex++}`);\n queryParams.push(resourceId);\n }\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${startOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.start);\n }\n\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${endOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.end);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const countQuery = `SELECT COUNT(*) FROM ${tableName} ${whereClause}`;\n const countResult = await this.#db.client.one(countQuery, queryParams);\n const total = parseInt(countResult.count, 10);\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataQuery = `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement} LIMIT $${paramIndex++} OFFSET $${paramIndex++}`;\n const rows = await this.#db.client.manyOrNone(dataQuery, [...queryParams, limitValue, offset]);\n const messages: MessageRowFromDB[] = [...(rows || [])];\n\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ include });\n if (includeMessages) {\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n const messagesWithParsedContent = messages.map(row => this.parseRow(row));\n\n const list = new MessageList().add(messagesWithParsedContent, 'memory');\n let finalMessages = list.get.all.db();\n\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n if (aValue == null && bValue == null) return a.id.localeCompare(b.id);\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n public async listMessagesByResourceId(\n args: StorageListMessagesByResourceIdInput,\n ): Promise<StorageListMessagesOutput> {\n const { resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Validate that resourceId is provided\n const hasResourceId = resourceId !== undefined && resourceId !== null && resourceId.trim() !== '';\n if (!hasResourceId) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'INVALID_QUERY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n resourceId: resourceId ?? '',\n },\n },\n new Error('resourceId is required'),\n );\n }\n\n // Validate page parameter\n if (page < 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Page number must be non-negative',\n details: {\n resourceId,\n page,\n },\n });\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIndex = 1;\n\n // Add resourceId filter\n conditions.push(`\"resourceId\" = $${paramIndex++}`);\n queryParams.push(resourceId);\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`\"createdAt\" ${startOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.start);\n }\n\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`\"createdAt\" ${endOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.end);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const countQuery = `SELECT COUNT(*) FROM ${tableName} ${whereClause}`;\n const countResult = await this.#db.client.one(countQuery, queryParams);\n const total = parseInt(countResult.count, 10);\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataQuery = `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement} LIMIT $${paramIndex++} OFFSET $${paramIndex++}`;\n const rows = await this.#db.client.manyOrNone(dataQuery, [...queryParams, limitValue, offset]);\n const messages: MessageRowFromDB[] = [...(rows || [])];\n\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ include });\n if (includeMessages) {\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n const messagesWithParsedContent = messages.map(row => this.parseRow(row));\n\n const list = new MessageList().add(messagesWithParsedContent, 'memory');\n let finalMessages = list.get.all.db();\n\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n if (aValue == null && bValue == null) return a.id.localeCompare(b.id);\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const hasMore = perPageInput !== false && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n const threadId = messages[0]?.threadId;\n if (!threadId) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Thread ID is required`,\n });\n }\n\n const thread = await this.getThreadById({ threadId });\n if (!thread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Thread ${threadId} not found`,\n details: {\n threadId,\n },\n });\n }\n\n try {\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.tx(async t => {\n const messageInserts = messages.map(message => {\n if (!message.threadId) {\n throw new Error(\n `Expected to find a threadId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n if (!message.resourceId) {\n throw new Error(\n `Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n return t.none(\n `INSERT INTO ${tableName} (id, thread_id, content, \"createdAt\", \"createdAtZ\", role, type, \"resourceId\")\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (id) DO UPDATE SET\n thread_id = EXCLUDED.thread_id,\n content = EXCLUDED.content,\n role = EXCLUDED.role,\n type = EXCLUDED.type,\n \"resourceId\" = EXCLUDED.\"resourceId\"`,\n [\n message.id,\n message.threadId,\n typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n message.createdAt || new Date().toISOString(),\n message.createdAt || new Date().toISOString(),\n message.role,\n message.type || 'v2',\n message.resourceId,\n ],\n );\n });\n\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const nowStr = new Date().toISOString();\n const threadUpdate = t.none(\n `UPDATE ${threadTableName}\n SET\n \"updatedAt\" = $1,\n \"updatedAtZ\" = $2\n WHERE id = $3\n `,\n [nowStr, nowStr, threadId],\n );\n\n await Promise.all([...messageInserts, threadUpdate]);\n });\n\n const messagesWithParsedContent = 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\n const list = new MessageList().add(messagesWithParsedContent as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\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.length === 0) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n\n const selectQuery = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\" FROM ${getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) })} WHERE id IN (${inPlaceholders(messageIds.length)})`;\n\n const existingMessagesDb = await this.#db.client.manyOrNone(selectQuery, messageIds);\n\n if (existingMessagesDb.length === 0) {\n return [];\n }\n\n const existingMessages: MastraDBMessage[] = existingMessagesDb.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg as MastraDBMessage;\n });\n\n const threadIdsToUpdate = new Set<string>();\n\n await this.#db.client.tx(async t => {\n const queries = [];\n const columnMapping: Record<string, string> = {\n threadId: 'thread_id',\n };\n\n for (const existingMessage of existingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n const updatableFields = { ...fieldsToUpdate };\n\n if (updatableFields.content) {\n const newContent = {\n ...existingMessage.content,\n ...updatableFields.content,\n ...(existingMessage.content?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingMessage.content.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n setClauses.push(`content = $${paramIndex++}`);\n values.push(newContent);\n delete updatableFields.content;\n }\n\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = columnMapping[key] || key;\n setClauses.push(`\"${dbColumn}\" = $${paramIndex++}`);\n values.push(updatableFields[key as keyof typeof updatableFields]);\n }\n }\n\n if (setClauses.length > 0) {\n values.push(id);\n const sql = `UPDATE ${getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) })} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`;\n queries.push(t.none(sql, values));\n }\n }\n\n if (threadIdsToUpdate.size > 0) {\n const threadIds = Array.from(threadIdsToUpdate);\n queries.push(\n t.none(\n `UPDATE ${getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) })} SET \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id IN (${inPlaceholders(threadIds.length)})`,\n threadIds,\n ),\n );\n }\n\n if (queries.length > 0) {\n await t.batch(queries);\n }\n });\n\n const updatedMessages = await this.#db.client.manyOrNone<MessageRowFromDB>(selectQuery, messageIds);\n\n return (updatedMessages || []).map((row: MessageRowFromDB) => {\n const message = this.normalizeMessageRow(row);\n if (typeof message.content === 'string') {\n try {\n return { ...message, content: JSON.parse(message.content) } as MastraDBMessage;\n } catch {\n /* ignore */\n }\n }\n return message as MastraDBMessage;\n });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n try {\n const messageTableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n\n await this.#db.client.tx(async t => {\n const placeholders = messageIds.map((_, idx) => `$${idx + 1}`).join(',');\n const messages = await t.manyOrNone(\n `SELECT DISTINCT thread_id FROM ${messageTableName} WHERE id IN (${placeholders})`,\n messageIds,\n );\n\n const threadIds = messages?.map(msg => msg.thread_id).filter(Boolean) || [];\n\n await t.none(`DELETE FROM ${messageTableName} WHERE id IN (${placeholders})`, messageIds);\n\n if (threadIds.length > 0) {\n const updatePromises = threadIds.map(threadId =>\n t.none(`UPDATE ${threadTableName} SET \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id = $1`, [threadId]),\n );\n await Promise.all(updatePromises);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const tableName = getTableName({ indexName: TABLE_RESOURCES, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone<StorageResourceType & { createdAtZ: Date; updatedAtZ: Date }>(\n `SELECT * FROM ${tableName} WHERE id = $1`,\n [resourceId],\n );\n\n if (!result) {\n return null;\n }\n\n return {\n id: result.id,\n createdAt: result.createdAtZ || result.createdAt,\n updatedAt: result.updatedAtZ || result.updatedAt,\n workingMemory: result.workingMemory,\n metadata: typeof result.metadata === 'string' ? JSON.parse(result.metadata) : result.metadata,\n };\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n await this.#db.insert({\n tableName: TABLE_RESOURCES,\n record: {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n },\n });\n\n return resource;\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n const tableName = getTableName({ indexName: TABLE_RESOURCES, schemaName: getSchemaName(this.#schema) });\n\n const updates: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (workingMemory !== undefined) {\n updates.push(`\"workingMemory\" = $${paramIndex}`);\n values.push(workingMemory);\n paramIndex++;\n }\n\n if (metadata) {\n updates.push(`metadata = $${paramIndex}`);\n values.push(JSON.stringify(updatedResource.metadata));\n paramIndex++;\n }\n\n const updatedAtStr = updatedResource.updatedAt.toISOString();\n updates.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(updatedAtStr);\n updates.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(updatedAtStr);\n\n values.push(resourceId);\n\n await this.#db.client.none(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = $${paramIndex}`, values);\n\n return updatedResource;\n }\n\n async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n // Get the source thread\n const sourceThread = await this.getThreadById({ threadId: sourceThreadId });\n if (!sourceThread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Source thread with id ${sourceThreadId} not found`,\n details: { sourceThreadId },\n });\n }\n\n // Use provided ID or generate a new one\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n // Check if the new thread ID already exists\n const existingThread = await this.getThreadById({ threadId: newThreadId });\n if (existingThread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'CLONE_THREAD', 'THREAD_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread with id ${newThreadId} already exists`,\n details: { newThreadId },\n });\n }\n\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const messageTableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n try {\n return await this.#db.client.tx(async t => {\n // Build message query with filters\n let messageQuery = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"\n FROM ${messageTableName} WHERE thread_id = $1`;\n const messageParams: any[] = [sourceThreadId];\n let paramIndex = 2;\n\n // Apply date filters\n if (options?.messageFilter?.startDate) {\n messageQuery += ` AND COALESCE(\"createdAtZ\", \"createdAt\") >= $${paramIndex++}`;\n messageParams.push(options.messageFilter.startDate);\n }\n if (options?.messageFilter?.endDate) {\n messageQuery += ` AND COALESCE(\"createdAtZ\", \"createdAt\") <= $${paramIndex++}`;\n messageParams.push(options.messageFilter.endDate);\n }\n\n // Apply message ID filter\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n messageQuery += ` AND id IN (${options.messageFilter.messageIds.map(() => `$${paramIndex++}`).join(', ')})`;\n messageParams.push(...options.messageFilter.messageIds);\n }\n\n messageQuery += ` ORDER BY \"createdAt\" ASC`;\n\n // Apply message limit (from most recent, so we need to reverse order for limit then sort back)\n if (options?.messageLimit && options.messageLimit > 0) {\n // Get messages ordered DESC to get most recent, limited, then we'll reverse\n const limitQuery = `SELECT * FROM (${messageQuery.replace('ORDER BY \"createdAt\" ASC', 'ORDER BY \"createdAt\" DESC')} LIMIT $${paramIndex}) AS limited ORDER BY \"createdAt\" ASC`;\n messageParams.push(options.messageLimit);\n messageQuery = limitQuery;\n }\n\n const sourceMessages = await t.manyOrNone<MessageRowFromDB>(messageQuery, messageParams);\n\n const now = new Date();\n\n // Determine the last message ID for clone metadata\n const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n // Create clone metadata\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n // Create the new thread\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n metadata: {\n ...metadata,\n clone: cloneMetadata,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n // Insert the new thread\n await t.none(\n `INSERT INTO ${threadTableName} (\n id,\n \"resourceId\",\n title,\n metadata,\n \"createdAt\",\n \"createdAtZ\",\n \"updatedAt\",\n \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,\n [\n newThread.id,\n newThread.resourceId,\n newThread.title,\n newThread.metadata ? JSON.stringify(newThread.metadata) : null,\n now,\n now,\n now,\n now,\n ],\n );\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const targetResourceId = resourceId || sourceThread.resourceId;\n\n for (const sourceMsg of sourceMessages) {\n const newMessageId = crypto.randomUUID();\n const normalizedMsg = this.normalizeMessageRow(sourceMsg);\n let parsedContent = normalizedMsg.content;\n try {\n parsedContent = JSON.parse(normalizedMsg.content);\n } catch {\n // use content as is\n }\n\n await t.none(\n `INSERT INTO ${messageTableName} (id, thread_id, content, \"createdAt\", \"createdAtZ\", role, type, \"resourceId\")\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,\n [\n newMessageId,\n newThreadId,\n typeof normalizedMsg.content === 'string' ? normalizedMsg.content : JSON.stringify(normalizedMsg.content),\n normalizedMsg.createdAt,\n normalizedMsg.createdAt,\n normalizedMsg.role,\n normalizedMsg.type || 'v2',\n targetResourceId,\n ],\n );\n\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: parsedContent,\n role: normalizedMsg.role as MastraDBMessage['role'],\n type: normalizedMsg.type,\n createdAt: new Date(normalizedMsg.createdAt as string),\n resourceId: targetResourceId,\n });\n }\n\n return {\n thread: newThread,\n clonedMessages,\n };\n });\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n private getOMKey(threadId: string | null, resourceId: string): string {\n return threadId ? `thread:${threadId}` : `resource:${resourceId}`;\n }\n\n private parseOMRow(row: any): ObservationalMemoryRecord {\n // OM is a new table - use timezone-aware columns (*Z) directly (no legacy fallback needed)\n return {\n id: row.id,\n scope: row.scope,\n threadId: row.threadId || null,\n resourceId: row.resourceId,\n createdAt: new Date(row.createdAtZ),\n updatedAt: new Date(row.updatedAtZ),\n lastObservedAt: row.lastObservedAtZ ? new Date(row.lastObservedAtZ) : undefined,\n originType: row.originType || 'initial',\n generationCount: Number(row.generationCount || 0),\n activeObservations: row.activeObservations || '',\n // Handle new chunk-based structure\n bufferedObservationChunks: row.bufferedObservationChunks\n ? typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks\n : undefined,\n // Deprecated fields (for backward compatibility)\n bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n bufferedMessageIds: undefined, // Use bufferedObservationChunks instead\n bufferedReflection: row.bufferedReflection || undefined,\n bufferedReflectionTokens: row.bufferedReflectionTokens ? Number(row.bufferedReflectionTokens) : undefined,\n bufferedReflectionInputTokens: row.bufferedReflectionInputTokens\n ? Number(row.bufferedReflectionInputTokens)\n : undefined,\n reflectedObservationLineCount: row.reflectedObservationLineCount\n ? Number(row.reflectedObservationLineCount)\n : undefined,\n totalTokensObserved: Number(row.totalTokensObserved || 0),\n observationTokenCount: Number(row.observationTokenCount || 0),\n pendingMessageTokens: Number(row.pendingMessageTokens || 0),\n isReflecting: Boolean(row.isReflecting),\n isObserving: Boolean(row.isObserving),\n isBufferingObservation: row.isBufferingObservation === true || row.isBufferingObservation === 'true',\n isBufferingReflection: row.isBufferingReflection === true || row.isBufferingReflection === 'true',\n lastBufferedAtTokens:\n typeof row.lastBufferedAtTokens === 'number'\n ? row.lastBufferedAtTokens\n : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n lastBufferedAtTime: row.lastBufferedAtTime ? new Date(String(row.lastBufferedAtTime)) : null,\n config: row.config ? (typeof row.config === 'string' ? JSON.parse(row.config) : row.config) : {},\n metadata: row.metadata ? (typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata) : undefined,\n observedMessageIds: row.observedMessageIds\n ? typeof row.observedMessageIds === 'string'\n ? JSON.parse(row.observedMessageIds)\n : row.observedMessageIds\n : undefined,\n observedTimezone: row.observedTimezone || undefined,\n };\n }\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"lookupKey\" = $1 ORDER BY \"generationCount\" DESC LIMIT 1`,\n [lookupKey],\n );\n if (!result) return null;\n return this.parseOMRow(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit: number = 10,\n ): Promise<ObservationalMemoryRecord[]> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"lookupKey\" = $1 ORDER BY \"generationCount\" DESC LIMIT $2`,\n [lookupKey, limit],\n );\n if (!result) return [];\n return result.map(row => this.parseOMRow(row));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_OBSERVATIONAL_MEMORY_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId, limit },\n },\n error,\n );\n }\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.scope,\n threadId: input.threadId,\n resourceId: input.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: undefined,\n originType: 'initial',\n generationCount: 0,\n activeObservations: '',\n totalTokensObserved: 0,\n observationTokenCount: 0,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.config,\n observedTimezone: input.observedTimezone,\n };\n\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = now.toISOString();\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`,\n [\n id,\n lookupKey,\n input.scope,\n input.resourceId,\n input.threadId || null,\n '',\n null,\n 'initial',\n JSON.stringify(input.config),\n 0,\n null, // lastObservedAt\n null, // lastObservedAtZ\n null, // lastReflectionAt\n null, // lastReflectionAtZ\n 0,\n 0,\n 0,\n false,\n false,\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n input.observedTimezone || null,\n nowStr, // createdAt\n nowStr, // createdAtZ\n nowStr, // updatedAt\n nowStr, // updatedAtZ\n ],\n );\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INITIALIZE_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: input.threadId, resourceId: input.resourceId },\n },\n error,\n );\n }\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n try {\n const now = new Date();\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n\n const lastObservedAtStr = input.lastObservedAt.toISOString();\n const nowStr = now.toISOString();\n const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"activeObservations\" = $1,\n \"lastObservedAt\" = $2,\n \"lastObservedAtZ\" = $3,\n \"pendingMessageTokens\" = 0,\n \"observationTokenCount\" = $4,\n \"totalTokensObserved\" = \"totalTokensObserved\" + $5,\n \"observedMessageIds\" = $6,\n \"updatedAt\" = $7,\n \"updatedAtZ\" = $8\n WHERE id = $9`,\n [\n input.observations,\n lastObservedAtStr,\n lastObservedAtStr,\n input.tokenCount,\n input.tokenCount,\n observedMessageIdsJson,\n nowStr,\n nowStr,\n input.id,\n ],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_ACTIVE_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_ACTIVE_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.currentRecord.threadId, input.currentRecord.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.currentRecord.scope,\n threadId: input.currentRecord.threadId,\n resourceId: input.currentRecord.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: input.currentRecord.lastObservedAt,\n originType: 'reflection',\n generationCount: input.currentRecord.generationCount + 1,\n activeObservations: input.reflection,\n totalTokensObserved: input.currentRecord.totalTokensObserved,\n observationTokenCount: input.tokenCount,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.currentRecord.config,\n metadata: input.currentRecord.metadata,\n observedTimezone: input.currentRecord.observedTimezone,\n };\n\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = now.toISOString();\n const lastObservedAtStr = record.lastObservedAt?.toISOString() || null;\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`,\n [\n id,\n lookupKey,\n record.scope,\n record.resourceId,\n record.threadId || null,\n input.reflection,\n null,\n 'reflection',\n JSON.stringify(record.config),\n input.currentRecord.generationCount + 1,\n lastObservedAtStr, // lastObservedAt\n lastObservedAtStr, // lastObservedAtZ\n nowStr, // lastReflectionAt\n nowStr, // lastReflectionAtZ\n record.pendingMessageTokens,\n record.totalTokensObserved,\n record.observationTokenCount,\n false, // isObserving\n false, // isReflecting\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n record.observedTimezone || null,\n nowStr, // createdAt\n nowStr, // createdAtZ\n nowStr, // updatedAt\n nowStr, // updatedAtZ\n ],\n );\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_REFLECTION_GENERATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { currentRecordId: input.currentRecord.id },\n },\n error,\n );\n }\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \"isReflecting\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n [isReflecting, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_REFLECTING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_REFLECTING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n },\n error,\n );\n }\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \"isObserving\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n [isObserving, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_OBSERVING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_OBSERVING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n },\n error,\n );\n }\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n let query: string;\n let values: any[];\n\n if (lastBufferedAtTokens !== undefined) {\n query = `UPDATE ${tableName} SET \"isBufferingObservation\" = $1, \"lastBufferedAtTokens\" = $2, \"updatedAt\" = $3, \"updatedAtZ\" = $4 WHERE id = $5`;\n values = [isBuffering, lastBufferedAtTokens, nowStr, nowStr, id];\n } else {\n query = `UPDATE ${tableName} SET \"isBufferingObservation\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`;\n values = [isBuffering, nowStr, nowStr, id];\n }\n\n const result = await this.#db.client.query(query, values);\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_BUFFERING_OBSERVATION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_BUFFERING_OBSERVATION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n },\n error,\n );\n }\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \"isBufferingReflection\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n [isBuffering, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_BUFFERING_REFLECTION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_BUFFERING_REFLECTION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n },\n error,\n );\n }\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"lookupKey\" = $1`, [lookupKey]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CLEAR_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \n \"pendingMessageTokens\" = $1, \n \"updatedAt\" = $2,\n \"updatedAtZ\" = $3\n WHERE id = $4`,\n [tokenCount, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_PENDING_MESSAGE_TOKENS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_PENDING_MESSAGE_TOKENS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Async Buffering Methods\n // ============================================\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n // Create new chunk with ID and timestamp\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${randomUUID()}`,\n cycleId: input.chunk.cycleId,\n observations: input.chunk.observations,\n tokenCount: input.chunk.tokenCount,\n messageIds: input.chunk.messageIds,\n messageTokens: input.chunk.messageTokens,\n lastObservedAt: input.chunk.lastObservedAt,\n createdAt: new Date(),\n suggestedContinuation: input.chunk.suggestedContinuation,\n currentTask: input.chunk.currentTask,\n };\n\n // Append chunk to existing array using JSONB concatenation\n const lastBufferedAtTime = input.lastBufferedAtTime ? input.lastBufferedAtTime.toISOString() : null;\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"bufferedObservationChunks\" = COALESCE(\"bufferedObservationChunks\", '[]'::jsonb) || $1::jsonb,\n \"lastBufferedAtTime\" = COALESCE($2, \"lastBufferedAtTime\"),\n \"updatedAt\" = $3,\n \"updatedAtZ\" = $4\n WHERE id = $5`,\n [JSON.stringify([newChunk]), lastBufferedAtTime, nowStr, nowStr, input.id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n // Get current record\n const record = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [input.id]);\n if (!record) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n\n // Parse buffered chunks\n let chunks: BufferedObservationChunk[] = [];\n if (record.bufferedObservationChunks) {\n try {\n const parsed =\n typeof record.bufferedObservationChunks === 'string'\n ? JSON.parse(record.bufferedObservationChunks)\n : record.bufferedObservationChunks;\n chunks = Array.isArray(parsed) ? parsed : [];\n } catch {\n chunks = [];\n }\n }\n\n if (chunks.length === 0) {\n return {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n }\n\n // Calculate target message tokens to activate based on new formula:\n // retentionFloor = threshold * (1 - ratio) represents tokens to keep as raw messages\n // targetMessageTokens = max(0, currentPending - retentionFloor) represents tokens to activate\n const retentionFloor = input.messageTokensThreshold * (1 - input.activationRatio);\n const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n // Find the closest chunk boundary to the target, biased under\n let cumulativeMessageTokens = 0;\n let chunksToActivate = 0;\n let bestBoundary = 0;\n let bestBoundaryMessageTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n // Prefer boundaries that are under the target (leaves more raw messages in context)\n // Only go over if there's no under option\n const isUnder = cumulativeMessageTokens <= targetMessageTokens;\n const bestIsUnder = bestBoundaryMessageTokens <= targetMessageTokens;\n\n if (bestBoundary === 0) {\n // First boundary, take it\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n } else if (isUnder && !bestIsUnder) {\n // Current is under, best is over - prefer under\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n } else if (isUnder && bestIsUnder) {\n // Both under - prefer the one closer to target (higher)\n if (cumulativeMessageTokens > bestBoundaryMessageTokens) {\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n }\n } else if (!isUnder && !bestIsUnder) {\n // Both over - prefer the one closer to target (lower)\n if (cumulativeMessageTokens < bestBoundaryMessageTokens) {\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n }\n }\n // If current is over and best is under, keep best (do nothing)\n }\n\n // If bestBoundary is 0 (no boundary under target), activate at least 1 chunk\n // since we've reached threshold and need to clear some context\n chunksToActivate = bestBoundary === 0 ? 1 : bestBoundary;\n\n // Split chunks\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = chunks.slice(chunksToActivate);\n\n // Combine activated observations\n const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n const activatedTokens = activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0);\n const activatedMessageTokens = activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0);\n const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n // Derive lastObservedAt from the latest activated chunk, or use provided value\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const lastObservedAt =\n input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n const lastObservedAtStr = lastObservedAt.toISOString();\n\n // NOTE: We intentionally do NOT add message IDs to observedMessageIds during buffered activation.\n // Buffered chunks represent observations of messages as they were at buffering time.\n // With streaming, messages grow after buffering, so we rely on lastObservedAt for filtering.\n // New content after lastObservedAt will be picked up in subsequent observations.\n\n // Atomic update\n await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"activeObservations\" = CASE \n WHEN \"activeObservations\" IS NOT NULL AND \"activeObservations\" != '' \n THEN \"activeObservations\" || E'\\\\n\\\\n' || $1\n ELSE $1\n END,\n \"observationTokenCount\" = COALESCE(\"observationTokenCount\", 0) + $2,\n \"pendingMessageTokens\" = GREATEST(0, COALESCE(\"pendingMessageTokens\", 0) - $3),\n \"bufferedObservationChunks\" = $4,\n \"lastObservedAt\" = $5,\n \"lastObservedAtZ\" = $6,\n \"updatedAt\" = $7,\n \"updatedAtZ\" = $8\n WHERE id = $9`,\n [\n activatedContent,\n activatedTokens,\n activatedMessageTokens,\n remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n lastObservedAtStr,\n lastObservedAtStr,\n nowStr,\n nowStr,\n input.id,\n ],\n );\n\n return {\n chunksActivated: activatedChunks.length,\n messageTokensActivated: activatedMessageTokens,\n observationTokensActivated: activatedTokens,\n messagesActivated: activatedMessageCount,\n activatedCycleIds,\n activatedMessageIds,\n observations: activatedContent,\n perChunk: activatedChunks.map(c => ({\n cycleId: c.cycleId ?? '',\n messageTokens: c.messageTokens ?? 0,\n observationTokens: c.tokenCount,\n messageCount: c.messageIds.length,\n observations: c.observations,\n })),\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n // Append reflection to existing buffered content\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"bufferedReflection\" = CASE \n WHEN \"bufferedReflection\" IS NOT NULL AND \"bufferedReflection\" != '' \n THEN \"bufferedReflection\" || E'\\\\n\\\\n' || $1\n ELSE $1\n END,\n \"bufferedReflectionTokens\" = COALESCE(\"bufferedReflectionTokens\", 0) + $2,\n \"bufferedReflectionInputTokens\" = COALESCE(\"bufferedReflectionInputTokens\", 0) + $3,\n \"reflectedObservationLineCount\" = $4,\n \"updatedAt\" = $5,\n \"updatedAtZ\" = $6\n WHERE id = $7`,\n [\n input.reflection,\n input.tokenCount,\n input.inputTokenCount,\n input.reflectedObservationLineCount,\n nowStr,\n nowStr,\n input.id,\n ],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_REFLECTION', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_REFLECTION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n\n // Get current record to calculate split\n const record = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [\n input.currentRecord.id,\n ]);\n if (!record) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.currentRecord.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n });\n }\n\n const bufferedReflection = record.bufferedReflection || '';\n const reflectedLineCount = Number(record.reflectedObservationLineCount || 0);\n\n if (!bufferedReflection) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NO_CONTENT'),\n text: 'No buffered reflection to swap',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { id: input.currentRecord.id },\n });\n }\n\n // Split current activeObservations by the recorded boundary.\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const currentObservations = (record.activeObservations as string) || '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n // New activeObservations = bufferedReflection + unreflected observations\n const newObservations = unreflectedContent\n ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n : bufferedReflection;\n\n // Create new generation with the merged content.\n // tokenCount is computed by the processor using its token counter on the combined content.\n const newRecord = await this.createReflectionGeneration({\n currentRecord: input.currentRecord,\n reflection: newObservations,\n tokenCount: input.tokenCount,\n });\n\n // Clear buffered state on old record\n const nowStr = new Date().toISOString();\n await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"bufferedReflection\" = NULL,\n \"bufferedReflectionTokens\" = NULL,\n \"bufferedReflectionInputTokens\" = NULL,\n \"reflectedObservationLineCount\" = NULL,\n \"updatedAt\" = $1,\n \"updatedAtZ\" = $2\n WHERE id = $3`,\n [nowStr, nowStr, input.currentRecord.id],\n );\n\n return newRecord;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n TABLE_SCHEMAS,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n TracingStorageStrategy,\n ListTracesArgs,\n ListTracesResponse,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { transformFromSqlRow, getTableName, getSchemaName } from '../utils';\n\nexport class ObservabilityPG extends ObservabilityStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SPANS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (ObservabilityPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: TABLE_SCHEMAS[TABLE_SPANS] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Returns default index definitions for the observability domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return [\n {\n name: `${schemaPrefix}mastra_ai_spans_traceid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['traceId', 'startedAt DESC'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_parentspanid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['parentSpanId', 'startedAt DESC'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_name_idx`,\n table: TABLE_SPANS,\n columns: ['name'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_spantype_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['spanType', 'startedAt DESC'],\n },\n // Root spans partial index - every listTraces query filters parentSpanId IS NULL\n {\n name: `${schemaPrefix}mastra_ai_spans_root_spans_idx`,\n table: TABLE_SPANS,\n columns: ['startedAt DESC'],\n where: '\"parentSpanId\" IS NULL',\n },\n // Entity identification indexes - common filtering patterns\n {\n name: `${schemaPrefix}mastra_ai_spans_entitytype_entityid_idx`,\n table: TABLE_SPANS,\n columns: ['entityType', 'entityId'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_entitytype_entityname_idx`,\n table: TABLE_SPANS,\n columns: ['entityType', 'entityName'],\n },\n // Multi-tenant filtering - organizationId + userId\n {\n name: `${schemaPrefix}mastra_ai_spans_orgid_userid_idx`,\n table: TABLE_SPANS,\n columns: ['organizationId', 'userId'],\n },\n // Metadata JSONB GIN index - for custom filtering with @> containment\n {\n name: `${schemaPrefix}mastra_ai_spans_metadata_gin_idx`,\n table: TABLE_SPANS,\n columns: ['metadata'],\n method: 'gin',\n },\n // Tags array GIN index - for array containment queries\n {\n name: `${schemaPrefix}mastra_ai_spans_tags_gin_idx`,\n table: TABLE_SPANS,\n columns: ['tags'],\n method: 'gin',\n },\n ];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n return this.#db.migrateSpans();\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n return this.#db.checkSpansMigrationStatus();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SPANS });\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const startedAt = span.startedAt instanceof Date ? span.startedAt.toISOString() : span.startedAt;\n const endedAt = span.endedAt instanceof Date ? span.endedAt.toISOString() : span.endedAt;\n\n const record = {\n ...span,\n startedAt,\n endedAt,\n startedAtZ: startedAt,\n endedAtZ: endedAt,\n };\n\n return this.#db.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n name: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const tableName = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const row = await this.#db.client.oneOrNone<SpanRecord>(\n `SELECT\n \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n \"entityType\", \"entityId\", \"entityName\",\n \"userId\", \"organizationId\", \"resourceId\",\n \"runId\", \"sessionId\", \"threadId\", \"requestId\",\n \"environment\", \"source\", \"serviceName\", \"scope\",\n \"spanType\", \"attributes\", \"metadata\", \"tags\", \"links\",\n \"input\", \"output\", \"error\", \"isEvent\",\n \"startedAtZ\" as \"startedAt\", \"endedAtZ\" as \"endedAt\",\n \"createdAtZ\" as \"createdAt\", \"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName}\n WHERE \"traceId\" = $1 AND \"spanId\" = $2`,\n [traceId, spanId],\n );\n\n if (!row) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: row,\n }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const row = await this.#db.client.oneOrNone<SpanRecord>(\n `SELECT\n \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n \"entityType\", \"entityId\", \"entityName\",\n \"userId\", \"organizationId\", \"resourceId\",\n \"runId\", \"sessionId\", \"threadId\", \"requestId\",\n \"environment\", \"source\", \"serviceName\", \"scope\",\n \"spanType\", \"attributes\", \"metadata\", \"tags\", \"links\",\n \"input\", \"output\", \"error\", \"isEvent\",\n \"startedAtZ\" as \"startedAt\", \"endedAtZ\" as \"endedAt\",\n \"createdAtZ\" as \"createdAt\", \"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName}\n WHERE \"traceId\" = $1 AND \"parentSpanId\" IS NULL`,\n [traceId],\n );\n\n if (!row) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: row,\n }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const spans = await this.#db.client.manyOrNone<SpanRecord>(\n `SELECT\n \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n \"entityType\", \"entityId\", \"entityName\",\n \"userId\", \"organizationId\", \"resourceId\",\n \"runId\", \"sessionId\", \"threadId\", \"requestId\",\n \"environment\", \"source\", \"serviceName\", \"scope\",\n \"spanType\", \"attributes\", \"metadata\", \"tags\", \"links\",\n \"input\", \"output\", \"error\", \"isEvent\",\n \"startedAtZ\" as \"startedAt\", \"endedAtZ\" as \"endedAt\",\n \"createdAtZ\" as \"createdAt\", \"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName}\n WHERE \"traceId\" = $1\n ORDER BY \"startedAtZ\" ASC`,\n [traceId],\n );\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: spans.map(span =>\n transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: span,\n }),\n ),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n const endedAt = data.endedAt.toISOString();\n data.endedAt = endedAt;\n data.endedAtZ = endedAt;\n }\n if (data.startedAt instanceof Date) {\n const startedAt = data.startedAt.toISOString();\n data.startedAt = startedAt;\n data.startedAtZ = startedAt;\n }\n\n await this.#db.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId,\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n const tableName = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n try {\n // Build WHERE clause for filters\n const conditions: string[] = ['r.\"parentSpanId\" IS NULL']; // Only root spans\n const params: any[] = [];\n let paramIndex = 1;\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`r.\"startedAtZ\" >= $${paramIndex++}`);\n params.push(filters.startedAt.start.toISOString());\n }\n if (filters.startedAt?.end) {\n conditions.push(`r.\"startedAtZ\" <= $${paramIndex++}`);\n params.push(filters.startedAt.end.toISOString());\n }\n if (filters.endedAt?.start) {\n conditions.push(`r.\"endedAtZ\" >= $${paramIndex++}`);\n params.push(filters.endedAt.start.toISOString());\n }\n if (filters.endedAt?.end) {\n conditions.push(`r.\"endedAtZ\" <= $${paramIndex++}`);\n params.push(filters.endedAt.end.toISOString());\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`r.\"spanType\" = $${paramIndex++}`);\n params.push(filters.spanType);\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`r.\"entityType\" = $${paramIndex++}`);\n params.push(filters.entityType);\n }\n if (filters.entityId !== undefined) {\n conditions.push(`r.\"entityId\" = $${paramIndex++}`);\n params.push(filters.entityId);\n }\n if (filters.entityName !== undefined) {\n conditions.push(`r.\"entityName\" = $${paramIndex++}`);\n params.push(filters.entityName);\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`r.\"userId\" = $${paramIndex++}`);\n params.push(filters.userId);\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`r.\"organizationId\" = $${paramIndex++}`);\n params.push(filters.organizationId);\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`r.\"resourceId\" = $${paramIndex++}`);\n params.push(filters.resourceId);\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`r.\"runId\" = $${paramIndex++}`);\n params.push(filters.runId);\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`r.\"sessionId\" = $${paramIndex++}`);\n params.push(filters.sessionId);\n }\n if (filters.threadId !== undefined) {\n conditions.push(`r.\"threadId\" = $${paramIndex++}`);\n params.push(filters.threadId);\n }\n if (filters.requestId !== undefined) {\n conditions.push(`r.\"requestId\" = $${paramIndex++}`);\n params.push(filters.requestId);\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`r.\"environment\" = $${paramIndex++}`);\n params.push(filters.environment);\n }\n if (filters.source !== undefined) {\n conditions.push(`r.\"source\" = $${paramIndex++}`);\n params.push(filters.source);\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`r.\"serviceName\" = $${paramIndex++}`);\n params.push(filters.serviceName);\n }\n\n // Scope filter (JSONB containment)\n if (filters.scope != null) {\n conditions.push(`r.\"scope\" @> $${paramIndex++}`);\n params.push(JSON.stringify(filters.scope));\n }\n\n // Metadata filter (JSONB containment)\n if (filters.metadata != null) {\n conditions.push(`r.\"metadata\" @> $${paramIndex++}`);\n params.push(JSON.stringify(filters.metadata));\n }\n\n // Tags filter (all tags must be present)\n if (filters.tags != null && filters.tags.length > 0) {\n conditions.push(`r.\"tags\" @> $${paramIndex++}`);\n params.push(JSON.stringify(filters.tags));\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n conditions.push(`r.\"error\" IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(`r.\"endedAtZ\" IS NULL AND r.\"error\" IS NULL`);\n break;\n case TraceStatus.SUCCESS:\n conditions.push(`r.\"endedAtZ\" IS NOT NULL AND r.\"error\" IS NULL`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.\"traceId\" = r.\"traceId\" AND c.\"error\" IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.\"traceId\" = r.\"traceId\" AND c.\"error\" IS NOT NULL\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Build ORDER BY clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n const sortField = `${orderBy.field}Z`;\n const sortDirection = orderBy.direction;\n let orderClause: string;\n if (orderBy.field === 'endedAt') {\n const nullsOrder = sortDirection === 'DESC' ? 'NULLS FIRST' : 'NULLS LAST';\n orderClause = `ORDER BY r.\"${sortField}\" ${sortDirection} ${nullsOrder}`;\n } else {\n orderClause = `ORDER BY r.\"${sortField}\" ${sortDirection}`;\n }\n\n // Get total count\n const countResult = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${tableName} r ${whereClause}`,\n params,\n );\n const count = Number(countResult?.count ?? 0);\n\n if (count === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage,\n hasMore: false,\n },\n spans: [],\n };\n }\n\n // Get paginated spans\n const spans = await this.#db.client.manyOrNone<SpanRecord>(\n `SELECT\n r.\"traceId\", r.\"spanId\", r.\"parentSpanId\", r.\"name\",\n r.\"entityType\", r.\"entityId\", r.\"entityName\",\n r.\"userId\", r.\"organizationId\", r.\"resourceId\",\n r.\"runId\", r.\"sessionId\", r.\"threadId\", r.\"requestId\",\n r.\"environment\", r.\"source\", r.\"serviceName\", r.\"scope\",\n r.\"spanType\", r.\"attributes\", r.\"metadata\", r.\"tags\", r.\"links\",\n r.\"input\", r.\"output\", r.\"error\", r.\"isEvent\",\n r.\"startedAtZ\" as \"startedAt\", r.\"endedAtZ\" as \"endedAt\",\n r.\"createdAtZ\" as \"createdAt\", r.\"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName} r\n ${whereClause}\n ${orderClause}\n LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n [...params, perPage, page * perPage],\n );\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: (page + 1) * perPage < count,\n },\n spans: toTraceSpans(\n spans.map(span =>\n transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: span,\n }),\n ),\n ),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const records = args.records.map(record => {\n const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n return {\n ...record,\n startedAt,\n endedAt,\n startedAtZ: startedAt,\n endedAtZ: endedAt,\n };\n });\n\n return this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n return this.#db.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => {\n const data: Record<string, any> = { ...record.updates };\n if (data.endedAt instanceof Date) {\n const endedAt = data.endedAt.toISOString();\n data.endedAt = endedAt;\n data.endedAtZ = endedAt;\n }\n if (data.startedAt instanceof Date) {\n const startedAt = data.startedAt.toISOString();\n data.startedAt = startedAt;\n data.startedAtZ = startedAt;\n }\n\n return {\n keys: { spanId: record.spanId, traceId: record.traceId },\n data,\n };\n }),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const placeholders = args.traceIds.map((_, i) => `$${i + 1}`).join(', ');\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"traceId\" IN (${placeholders})`, args.traceIds);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n PromptBlocksStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n} from '@mastra/core/storage/domains/prompt-blocks';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nconst SNAPSHOT_FIELDS = ['name', 'description', 'content', 'rules'] as const;\n\nexport class PromptBlocksPG extends PromptBlocksStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (PromptBlocksPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'idx_prompt_block_versions_block_version',\n table: TABLE_PROMPT_BLOCK_VERSIONS,\n columns: ['blockId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch {\n // Indexes are performance optimizations, continue on failure\n }\n }\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCKS] });\n await this.#db.createTable({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCK_VERSIONS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\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 // ==========================================================================\n // Prompt Block CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseBlockRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin block record\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, status, \"activeVersionId\", \"authorId\", metadata,\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n promptBlock.id,\n 'draft',\n null,\n promptBlock.authorId ?? null,\n promptBlock.metadata ? JSON.stringify(promptBlock.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract snapshot fields and create version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: [...SNAPSHOT_FIELDS],\n changeMessage: 'Initial version',\n });\n\n return {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: promptBlock.authorId,\n metadata: promptBlock.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n // Best-effort cleanup\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(\n `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [promptBlock.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n\n const existingBlock = await this.getById(id);\n if (!existingBlock) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n let versionCreated = false;\n\n // Check if any snapshot config fields are present\n const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_PROMPT_BLOCK', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for prompt block ${id}`,\n details: { blockId: id },\n });\n }\n\n const {\n id: _versionId,\n blockId: _blockId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = SNAPSHOT_FIELDS.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n versionCreated = true;\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n blockId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields: [...changedFields],\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the block record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n if (status === undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push('published');\n }\n }\n\n if (status !== undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push(status);\n }\n\n if (metadata !== undefined) {\n const mergedMetadata = { ...(existingBlock.metadata || {}), ...metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\n }\n\n // Always update timestamps\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n values.push(id);\n\n if (setClauses.length > 2 || versionCreated) {\n // More than just updatedAt and updatedAtZ, or a new version was created\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n const updatedBlock = await this.getById(id);\n if (!updatedBlock) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 updatedBlock;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n await this.deleteVersionsByParentId(id);\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\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('PG', '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 = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 1;\n\n if (authorId !== undefined) {\n conditions.push(`\"authorId\" = $${paramIdx++}`);\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n queryParams.push(JSON.stringify(metadata));\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n promptBlocks: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n [...queryParams, limitValue, offset],\n );\n\n const promptBlocks = (dataResult || []).map(row => this.parseBlockRow(row));\n\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('PG', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Prompt Block Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"blockId\", \"versionNumber\",\n name, description, content, rules,\n \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,\n [\n input.id,\n input.blockId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.content,\n input.rules ? JSON.stringify(input.rules) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersion(id: string): Promise<PromptBlockVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 AND \"versionNumber\" = $2`,\n [blockId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [blockId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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\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 tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"blockId\" = $1`, [\n blockId,\n ]);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [blockId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersion(id: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"blockId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_BLOCK_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(blockId: string): Promise<number> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"blockId\" = $1`, [\n blockId,\n ]);\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseBlockRow(row: any): StoragePromptBlockType {\n return {\n id: row.id as string,\n status: row.status as StoragePromptBlockType['status'],\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAtZ || row.createdAt),\n updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n };\n }\n\n private parseVersionRow(row: any): PromptBlockVersion {\n return {\n id: row.id as string,\n blockId: row.blockId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n content: row.content as string,\n rules: this.parseJson(row.rules, 'rules'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAtZ || row.createdAt),\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ScorerDefinitionsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n ScorerDefinitionVersion,\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'type',\n 'model',\n 'instructions',\n 'scoreRange',\n 'presetConfig',\n 'defaultSampling',\n] as const;\n\nexport class ScorerDefinitionsPG extends ScorerDefinitionsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ScorerDefinitionsPG.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'idx_scorer_definition_versions_def_version',\n table: TABLE_SCORER_DEFINITION_VERSIONS,\n columns: ['scorerDefinitionId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch {\n // Indexes are performance optimizations, continue on failure\n }\n }\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({\n tableName: TABLE_SCORER_DEFINITIONS,\n schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITIONS],\n });\n await this.#db.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITION_VERSIONS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\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 // ==========================================================================\n // Scorer Definition CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseScorerRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n const { scorerDefinition } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin scorer definition record\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, status, \"activeVersionId\", \"authorId\", metadata,\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n scorerDefinition.id,\n 'draft',\n null,\n scorerDefinition.authorId ?? null,\n scorerDefinition.metadata ? JSON.stringify(scorerDefinition.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract snapshot fields and create version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n scorerDefinitionId: scorerDefinition.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: [...SNAPSHOT_FIELDS],\n changeMessage: 'Initial version',\n });\n\n return {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: scorerDefinition.authorId,\n metadata: scorerDefinition.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n // Best-effort cleanup\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(\n `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [scorerDefinition.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n const { id, ...updates } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n\n const existingScorer = await this.getById(id);\n if (!existingScorer) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n let versionCreated = false;\n\n // Check if any snapshot config fields are present\n const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_SCORER_DEFINITION', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for scorer definition ${id}`,\n details: { scorerDefinitionId: id },\n });\n }\n\n const {\n id: _versionId,\n scorerDefinitionId: _scorerDefinitionId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = SNAPSHOT_FIELDS.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n versionCreated = true;\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n scorerDefinitionId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields: [...changedFields],\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the scorer definition record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n if (status === undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push('published');\n }\n }\n\n if (status !== undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push(status);\n }\n\n if (metadata !== undefined) {\n const mergedMetadata = { ...(existingScorer.metadata || {}), ...metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\n }\n\n // Always update timestamps\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n values.push(id);\n\n if (setClauses.length > 2 || versionCreated) {\n // More than just updatedAt and updatedAtZ, or a new version was created\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n const updatedScorer = await this.getById(id);\n if (!updatedScorer) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 updatedScorer;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n await this.deleteVersionsByParentId(id);\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\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('PG', '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 = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 1;\n\n if (authorId !== undefined) {\n conditions.push(`\"authorId\" = $${paramIdx++}`);\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n queryParams.push(JSON.stringify(metadata));\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n scorerDefinitions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n [...queryParams, limitValue, offset],\n );\n\n const scorerDefinitions = (dataResult || []).map(row => this.parseScorerRow(row));\n\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('PG', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Scorer Definition Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"scorerDefinitionId\", \"versionNumber\",\n name, description, type, model, instructions, \"scoreRange\", \"presetConfig\", \"defaultSampling\",\n \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)`,\n [\n input.id,\n input.scorerDefinitionId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.type,\n input.model ? JSON.stringify(input.model) : null,\n input.instructions ?? null,\n input.scoreRange ? JSON.stringify(input.scoreRange) : null,\n input.presetConfig ? JSON.stringify(input.presetConfig) : null,\n input.defaultSampling ? JSON.stringify(input.defaultSampling) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 AND \"versionNumber\" = $2`,\n [scorerDefinitionId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [scorerDefinitionId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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\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 tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`,\n [scorerDefinitionId],\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [scorerDefinitionId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersion(id: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_SCORER_DEFINITION_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(scorerDefinitionId: string): Promise<number> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`,\n [scorerDefinitionId],\n );\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseScorerRow(row: any): StorageScorerDefinitionType {\n return {\n id: row.id as string,\n status: row.status as StorageScorerDefinitionType['status'],\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAtZ || row.createdAt),\n updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n };\n }\n\n private parseVersionRow(row: any): ScorerDefinitionVersion {\n return {\n id: row.id as string,\n scorerDefinitionId: row.scorerDefinitionId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n type: row.type as ScorerDefinitionVersion['type'],\n model: this.parseJson(row.model, 'model'),\n instructions: row.instructions as string | undefined,\n scoreRange: this.parseJson(row.scoreRange, 'scoreRange'),\n presetConfig: this.parseJson(row.presetConfig, 'presetConfig'),\n defaultSampling: this.parseJson(row.defaultSampling, 'defaultSampling'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAtZ || row.createdAt),\n };\n }\n}\n","import { 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 calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n ScoresStorage,\n TABLE_SCORERS,\n TABLE_SCHEMAS,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const quotedIndexName = `\"${indexName}\"`;\n return schemaName ? `${schemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * PostgreSQL-specific score row transformation.\n * Uses Z-suffix timestamps (createdAtZ, updatedAtZ) when available.\n */\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row, {\n preferredTimestampFields: {\n createdAt: 'createdAtZ',\n updatedAt: 'updatedAtZ',\n },\n });\n}\n\nexport class ScoresPG extends ScoresStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SCORERS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (ScoresPG.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 // Add columns for backwards compatibility (v0.x to v1 migration)\n await this.#db.alterTable({\n tableName: TABLE_SCORERS,\n schema: TABLE_SCHEMAS[TABLE_SCORERS],\n ifNotExists: ['spanId', 'requestContext'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Returns default index definitions for the scores domain tables.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return [\n {\n name: `${schemaPrefix}mastra_scores_trace_id_span_id_created_at_idx`,\n table: TABLE_SCORERS,\n columns: ['traceId', 'spanId', 'createdAt DESC'],\n },\n ];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\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 result = await this.#db.client.oneOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE id = $1`,\n [id],\n );\n\n return result ? transformScoreRow(result) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\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: string[] = [`\"scorerId\" = $1`];\n const queryParams: any[] = [scorerId];\n let paramIndex = 2;\n\n if (entityId) {\n conditions.push(`\"entityId\" = $${paramIndex++}`);\n queryParams.push(entityId);\n }\n\n if (entityType) {\n conditions.push(`\"entityType\" = $${paramIndex++}`);\n queryParams.push(entityType);\n }\n\n if (source) {\n conditions.push(`\"source\" = $${paramIndex++}`);\n queryParams.push(source);\n }\n\n const whereClause = conditions.join(' AND ');\n\n const total = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE ${whereClause}`,\n queryParams,\n );\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n if (total?.count === '0' || !total?.count) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n const limitValue = perPageInput === false ? Number(total?.count) : perPage;\n const end = perPageInput === false ? Number(total?.count) : start + perPage;\n const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE ${whereClause} ORDER BY \"createdAt\" DESC LIMIT $${paramIndex++} OFFSET $${paramIndex++}`,\n [...queryParams, limitValue, start],\n );\n\n return {\n pagination: {\n total: Number(total?.count) || 0,\n page,\n perPage: perPageForResponse,\n hasMore: end < Number(total?.count),\n },\n scores: result.map(transformScoreRow),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n\n const {\n scorer,\n preprocessStepResult,\n analyzeStepResult,\n metadata,\n input,\n output,\n additionalContext,\n requestContext,\n entity,\n ...rest\n } = parsedScore;\n\n await this.#db.insert({\n tableName: TABLE_SCORERS,\n record: {\n id,\n ...rest,\n input: JSON.stringify(input) || '',\n output: JSON.stringify(output) || '',\n scorer: scorer ? JSON.stringify(scorer) : null,\n preprocessStepResult: preprocessStepResult ? JSON.stringify(preprocessStepResult) : null,\n analyzeStepResult: analyzeStepResult ? JSON.stringify(analyzeStepResult) : null,\n metadata: metadata ? JSON.stringify(metadata) : null,\n additionalContext: additionalContext ? JSON.stringify(additionalContext) : null,\n requestContext: requestContext ? JSON.stringify(requestContext) : null,\n entity: entity ? JSON.stringify(entity) : null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const total = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"runId\" = $1`,\n [runId],\n );\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n if (total?.count === '0' || !total?.count) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const limitValue = perPageInput === false ? Number(total?.count) : perPage;\n const end = perPageInput === false ? Number(total?.count) : start + perPage;\n\n const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"runId\" = $1 LIMIT $2 OFFSET $3`,\n [runId, limitValue, start],\n );\n return {\n pagination: {\n total: Number(total?.count) || 0,\n page,\n perPage: perPageForResponse,\n hasMore: end < Number(total?.count),\n },\n scores: result.map(transformScoreRow),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n const total = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"entityId\" = $1 AND \"entityType\" = $2`,\n [entityId, entityType],\n );\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n if (total?.count === '0' || !total?.count) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const limitValue = perPageInput === false ? Number(total?.count) : perPage;\n const end = perPageInput === false ? Number(total?.count) : start + perPage;\n\n const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"entityId\" = $1 AND \"entityType\" = $2 LIMIT $3 OFFSET $4`,\n [entityId, entityType, limitValue, start],\n );\n return {\n pagination: {\n total: Number(total?.count) || 0,\n page,\n perPage: perPageForResponse,\n hasMore: end < Number(total?.count),\n },\n scores: result.map(transformScoreRow),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const tableName = getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) });\n const countSQLResult = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"traceId\" = $1 AND \"spanId\" = $2`,\n [traceId, spanId],\n );\n\n const total = Number(countSQLResult?.count ?? 0);\n const { page, perPage: perPageInput } = pagination;\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 const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${tableName} WHERE \"traceId\" = $1 AND \"spanId\" = $2 ORDER BY \"createdAt\" DESC LIMIT $3 OFFSET $4`,\n [traceId, spanId, limitValue, start],\n );\n\n const hasMore = end < total;\n const scores = result.map(row => transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n createStorageErrorId,\n} from '@mastra/core/storage';\nimport type {\n UpdateWorkflowStateOptions,\n StorageListWorkflowRunsInput,\n WorkflowRun,\n WorkflowRuns,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const quotedIndexName = `\"${indexName}\"`;\n return schemaName ? `${schemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * Sanitizes JSON string by removing problematic Unicode sequences that PostgreSQL jsonb rejects.\n * Removes:\n * - \\u0000 (null character) - causes error 22P05 \"unsupported Unicode escape sequence\"\n * - \\uD800-\\uDFFF (unpaired surrogates) - causes \"Unicode low surrogate must follow a high surrogate\"\n */\nfunction sanitizeJsonForPg(jsonString: string): string {\n return jsonString.replace(/\\\\u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})/g, '');\n}\n\nexport class WorkflowsPG extends WorkflowsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_SNAPSHOT] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (WorkflowsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n private parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n resourceId: row.resourceId as string,\n createdAt: new Date(row.createdAtZ || (row.createdAt as string)),\n updatedAt: new Date(row.updatedAtZ || (row.updatedAt as string)),\n };\n }\n\n /**\n * Returns default index definitions for the workflows domain tables.\n * Currently no default indexes are defined for workflows.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for workflows.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n // No default indexes for workflows domain\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT] });\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n ifNotExists: ['resourceId'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n updateWorkflowResults(\n {\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 },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n try {\n const now = new Date();\n const createdAtValue = createdAt ? createdAt : now;\n const updatedAtValue = updatedAt ? updatedAt : now;\n // Sanitize the snapshot JSON to remove problematic Unicode sequences\n const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(snapshot));\n await this.#db.client.none(\n `INSERT INTO ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} (workflow_name, run_id, \"resourceId\", snapshot, \"createdAt\", \"updatedAt\")\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (workflow_name, run_id) DO UPDATE\n SET \"resourceId\" = $3, snapshot = $4, \"updatedAt\" = $6`,\n [workflowName, runId, resourceId, sanitizedSnapshot, createdAtValue, updatedAtValue],\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.#db.load<{ snapshot: WorkflowRunState }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n return result ? result.snapshot : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const conditions: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (runId) {\n conditions.push(`run_id = $${paramIndex}`);\n values.push(runId);\n paramIndex++;\n }\n\n if (workflowName) {\n conditions.push(`workflow_name = $${paramIndex}`);\n values.push(workflowName);\n paramIndex++;\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const query = `\n SELECT * FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })}\n ${whereClause}\n ORDER BY \"createdAt\" DESC LIMIT 1\n `;\n\n const queryValues = values;\n\n const result = await this.#db.client.oneOrNone(query, queryValues);\n\n if (!result) {\n return null;\n }\n\n return this.parseWorkflowRun(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n runId,\n workflowName: workflowName || '',\n },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n try {\n await this.#db.client.none(\n `DELETE FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} WHERE run_id = $1 AND workflow_name = $2`,\n [runId, workflowName],\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n runId,\n workflowName,\n },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (workflowName) {\n conditions.push(`workflow_name = $${paramIndex}`);\n values.push(workflowName);\n paramIndex++;\n }\n\n if (status) {\n // Use regexp_replace to strip problematic Unicode escape sequences before casting to jsonb.\n // PostgreSQL's jsonb cast fails on:\n // - \\u0000 (null character) with error 22P05 \"unsupported Unicode escape sequence\"\n // - \\uD800-\\uDFFF (unpaired surrogates) with \"Unicode low surrogate must follow a high surrogate\"\n // The regex pattern matches \\u0000 and all surrogate code points (D800-DFFF).\n // See: https://github.com/mastra-ai/mastra/issues/11563\n conditions.push(\n `regexp_replace(snapshot::text, '\\\\\\\\u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})', '', 'g')::jsonb ->> 'status' = $${paramIndex}`,\n );\n values.push(status);\n paramIndex++;\n }\n\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push(`\"resourceId\" = $${paramIndex}`);\n values.push(resourceId);\n paramIndex++;\n } else {\n this.logger?.warn?.(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n if (fromDate) {\n conditions.push(`\"createdAt\" >= $${paramIndex}`);\n values.push(fromDate);\n paramIndex++;\n }\n\n if (toDate) {\n conditions.push(`\"createdAt\" <= $${paramIndex}`);\n values.push(toDate);\n paramIndex++;\n }\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n let total = 0;\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n if (usePagination) {\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} ${whereClause}`,\n values,\n );\n total = Number(countResult.count);\n }\n\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page! * normalizedPerPage : undefined;\n\n const query = `\n SELECT * FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })}\n ${whereClause}\n ORDER BY \"createdAt\" DESC\n ${usePagination ? ` LIMIT $${paramIndex} OFFSET $${paramIndex + 1}` : ''}\n `;\n\n const queryValues = usePagination ? [...values, normalizedPerPage, offset] : values;\n\n const result = await this.#db.client.manyOrNone(query, queryValues);\n\n const runs = (result || []).map(row => {\n return this.parseWorkflowRun(row);\n });\n\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n workflowName: workflowName || 'all',\n },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { Pool } from 'pg';\nimport {\n validateConfig,\n isCloudSqlConfig,\n isConnectionStringConfig,\n isHostConfig,\n isPoolConfig,\n} from '../shared/config';\nimport type { PostgresStoreConfig } from '../shared/config';\nimport { PoolAdapter } from './client';\nimport type { DbClient } from './client';\nimport type { PgDomainClientConfig } from './db';\nimport { AgentsPG } from './domains/agents';\nimport { MemoryPG } from './domains/memory';\nimport { ObservabilityPG } from './domains/observability';\nimport { PromptBlocksPG } from './domains/prompt-blocks';\nimport { ScorerDefinitionsPG } from './domains/scorer-definitions';\nimport { ScoresPG } from './domains/scores';\nimport { WorkflowsPG } from './domains/workflows';\n\n/** Default maximum number of connections in the pool */\nconst DEFAULT_MAX_CONNECTIONS = 20;\n/** Default idle timeout in milliseconds */\nconst DEFAULT_IDLE_TIMEOUT_MS = 30000;\n\nexport { exportSchemas } from './db';\n// Export domain classes for direct use with MastraStorage composition\nexport { AgentsPG, MemoryPG, ObservabilityPG, PromptBlocksPG, ScorerDefinitionsPG, ScoresPG, WorkflowsPG };\nexport { PoolAdapter } from './client';\nexport type { DbClient, TxClient, QueryValues, Pool, PoolClient, QueryResult } from './client';\nexport type { PgDomainConfig, PgDomainClientConfig, PgDomainPoolConfig, PgDomainRestConfig } from './db';\n\n/**\n * PostgreSQL storage adapter for Mastra.\n *\n * @example\n * ```typescript\n * // Option 1: Connection string\n * const store = new PostgresStore({\n * id: 'my-store',\n * connectionString: 'postgresql://...',\n * });\n *\n * // Option 2: Pre-configured pool\n * const pool = new Pool({ connectionString: 'postgresql://...' });\n * const store = new PostgresStore({ id: 'my-store', pool });\n *\n * // Access domain storage\n * const memory = await store.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Execute custom queries\n * const rows = await store.db.any('SELECT * FROM my_table');\n * ```\n */\nexport class PostgresStore extends MastraCompositeStore {\n #pool: Pool;\n #db: DbClient;\n #ownsPool: boolean;\n private schema: string;\n private isInitialized: boolean = false;\n\n stores: StorageDomains;\n\n constructor(config: PostgresStoreConfig) {\n try {\n validateConfig('PostgresStore', config);\n super({ id: config.id, name: 'PostgresStore', disableInit: config.disableInit });\n // Validate schema name to prevent SQL injection\n this.schema = parseSqlIdentifier(config.schemaName || 'public', 'schema name');\n\n if (isPoolConfig(config)) {\n this.#pool = config.pool;\n this.#ownsPool = false;\n } else {\n this.#pool = this.createPool(config);\n this.#ownsPool = true;\n }\n\n this.#db = new PoolAdapter(this.#pool);\n\n const domainConfig: PgDomainClientConfig = {\n client: this.#db,\n schemaName: this.schema,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n\n this.stores = {\n scores: new ScoresPG(domainConfig),\n workflows: new WorkflowsPG(domainConfig),\n memory: new MemoryPG(domainConfig),\n observability: new ObservabilityPG(domainConfig),\n agents: new AgentsPG(domainConfig),\n promptBlocks: new PromptBlocksPG(domainConfig),\n scorerDefinitions: new ScorerDefinitionsPG(domainConfig),\n };\n } catch (e) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n e,\n );\n }\n }\n\n private createPool(config: PostgresStoreConfig): Pool {\n if (isConnectionStringConfig(config)) {\n return new Pool({\n connectionString: config.connectionString,\n ssl: config.ssl,\n max: config.max ?? DEFAULT_MAX_CONNECTIONS,\n idleTimeoutMillis: config.idleTimeoutMillis ?? DEFAULT_IDLE_TIMEOUT_MS,\n });\n }\n\n if (isHostConfig(config)) {\n return new Pool({\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n max: config.max ?? DEFAULT_MAX_CONNECTIONS,\n idleTimeoutMillis: config.idleTimeoutMillis ?? DEFAULT_IDLE_TIMEOUT_MS,\n });\n }\n\n if (isCloudSqlConfig(config)) {\n return new Pool(config as any);\n }\n\n throw new Error('PostgresStore: invalid config');\n }\n\n async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n this.isInitialized = true;\n await super.init();\n } catch (error) {\n this.isInitialized = false;\n // Rethrow MastraError directly to preserve structured error IDs (e.g., MIGRATION_REQUIRED::DUPLICATE_SPANS)\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INIT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Database client for executing queries.\n *\n * @example\n * ```typescript\n * const rows = await store.db.any('SELECT * FROM users WHERE active = $1', [true]);\n * const user = await store.db.one('SELECT * FROM users WHERE id = $1', [userId]);\n * ```\n */\n public get db(): DbClient {\n return this.#db;\n }\n\n /**\n * The underlying pg.Pool for direct database access or ORM integration.\n */\n public get pool(): Pool {\n return this.#pool;\n }\n\n /**\n * Closes the connection pool if it was created by this store.\n * If a pool was passed in via config, it will not be closed.\n */\n async close(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.end();\n }\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for PG Vector.\n */\nexport const PGVECTOR_PROMPT = `When querying PG Vector, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n- $all: Match all values in array\n Example: { \"tags\": { \"$all\": [\"premium\", \"sale\"] } }\n- $elemMatch: Match array elements that meet all specified conditions\n Example: { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 100 } } } }\n- $contains: Check if array contains value\n Example: { \"tags\": { \"$contains\": \"premium\" } }\n\nLogical Operators:\n- $and: Logical AND (implicit when using multiple conditions)\n Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n- $nor: Logical NOR\n Example: { \"$nor\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nSpecial Operators:\n- $size: Array length check\n Example: { \"tags\": { \"$size\": 2 } }\n\nRestrictions:\n- Regex patterns are not supported\n- Direct RegExp patterns will throw an error\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- Array operations work on array fields only\n- Basic operators handle array values as JSON strings\n- Empty arrays in conditions are handled gracefully\n- Only logical operators ($and, $or, $not, $nor) can be used at the top level\n- All other operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n Invalid: { \"$contains\": \"value\" }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- $not operator:\n - Must be an object\n - Cannot be empty\n - Can be used at field level or top level\n - Valid: { \"$not\": { \"field\": \"value\" } }\n - Valid: { \"field\": { \"$not\": { \"$eq\": \"value\" } } }\n- Other logical operators ($and, $or, $nor):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- $elemMatch requires an object with conditions\n Valid: { \"array\": { \"$elemMatch\": { \"field\": \"value\" } } }\n Invalid: { \"array\": { \"$elemMatch\": \"value\" } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"tags\": { \"$all\": [\"premium\"] } },\n { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]}\n ]\n}`;\n"]}
1
+ {"version":3,"sources":["../src/shared/config.ts","../src/vector/filter.ts","../src/vector/sql-builder.ts","../src/vector/index.ts","../src/storage/client.ts","../src/storage/db/constraint-utils.ts","../src/storage/db/index.ts","../src/storage/domains/utils.ts","../src/storage/domains/agents/index.ts","../src/storage/domains/datasets/index.ts","../src/storage/domains/experiments/index.ts","../src/storage/domains/mcp-clients/index.ts","../src/storage/domains/memory/index.ts","../src/storage/domains/observability/index.ts","../src/storage/domains/prompt-blocks/index.ts","../src/storage/domains/scorer-definitions/index.ts","../src/storage/domains/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","result","parseFieldKey","conditions","operator","operatorValue","operatorFn","operatorResult","MastraVector","pg","error","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory","Mutex","parseSqlIdentifier","validateTopK","validateUpsertInput","mastraError","xxhash","installedSchema","existingSchema","Pool","getSqlType","TABLE_WORKFLOW_SNAPSHOT","TABLE_SPANS","MastraBase","TABLE_SCHEMAS","getDefaultValue","createStorageErrorId","quotedCol","getSchemaName","getTableName","AgentsStorage","TABLE_AGENTS","TABLE_AGENT_VERSIONS","normalizePerPage","calculatePagination","DatasetsStorage","TABLE_DATASETS","TABLE_DATASET_ITEMS","TABLE_DATASET_VERSIONS","TABLE_CONFIGS","DATASETS_SCHEMA","DATASET_ITEMS_SCHEMA","DATASET_VERSIONS_SCHEMA","safelyParseJSON","ensureDate","TABLE_EXPERIMENTS","TABLE_EXPERIMENT_RESULTS","ExperimentsStorage","EXPERIMENTS_SCHEMA","EXPERIMENT_RESULTS_SCHEMA","MCPClientsStorage","TABLE_MCP_CLIENTS","TABLE_MCP_CLIENT_VERSIONS","MemoryStorage","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","MessageList","randomUUID","ObservabilityStorage","listTracesArgsSchema","TraceStatus","toTraceSpans","SNAPSHOT_FIELDS","PromptBlocksStorage","TABLE_PROMPT_BLOCKS","TABLE_PROMPT_BLOCK_VERSIONS","ScorerDefinitionsStorage","TABLE_SCORER_DEFINITIONS","TABLE_SCORER_DEFINITION_VERSIONS","coreTransformScoreRow","ScoresStorage","TABLE_SCORERS","saveScorePayloadSchema","WorkflowsStorage","MastraCompositeStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ConnectionOptions } from 'node:tls';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport type { ClientConfig, Pool, PoolConfig } from 'pg';\n\n/**\n * Base configuration options shared across PostgreSQL configs.\n */\nexport interface PostgresBaseConfig {\n id: string;\n schemaName?: string;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new PostgresStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new PostgresStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n /**\n * When true, default indexes will not be created during initialization.\n * This is useful when:\n * 1. You want to manage indexes separately or use custom indexes only\n * 2. Default indexes don't match your query patterns\n * 3. You want to reduce initialization time in development\n *\n * @default false\n */\n skipDefaultIndexes?: boolean;\n /**\n * Custom indexes to create during initialization.\n * These indexes are created in addition to default indexes (unless skipDefaultIndexes is true).\n *\n * Each index must specify which table it belongs to. The store will route each index\n * to the appropriate domain based on the table name.\n *\n * @example\n * ```typescript\n * const store = new PostgresStore({\n * connectionString: '...',\n * indexes: [\n * { name: 'my_threads_type_idx', table: 'mastra_threads', columns: ['metadata->>\\'type\\''] },\n * { name: 'my_messages_status_idx', table: 'mastra_messages', columns: ['metadata->>\\'status\\''] },\n * ],\n * });\n * ```\n */\n indexes?: CreateIndexOptions[];\n}\n\n/**\n * Connection string configuration.\n */\nexport interface ConnectionStringConfig extends PostgresBaseConfig {\n connectionString: string;\n ssl?: boolean | ConnectionOptions;\n max?: number;\n idleTimeoutMillis?: number;\n}\n\n/**\n * Host-based configuration.\n */\nexport interface HostConfig extends PostgresBaseConfig {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | ConnectionOptions;\n max?: number;\n idleTimeoutMillis?: number;\n}\n\n/**\n * Pre-configured pg.Pool configuration.\n */\nexport interface PoolInstanceConfig extends PostgresBaseConfig {\n /**\n * Pre-configured pg.Pool instance.\n * Use this for direct control over the connection pool, or for\n * integration with libraries that expect a pg.Pool.\n *\n * @example\n * ```typescript\n * import { Pool } from 'pg';\n *\n * const pool = new Pool({ connectionString: '...' });\n * const store = new PostgresStore({ id: 'my-store', pool });\n *\n * // Use store.pool for other libraries that need a pg.Pool\n * ```\n */\n pool: Pool;\n}\n\n/**\n * PostgreSQL configuration for PostgresStore.\n *\n * Accepts either:\n * - A pre-configured pg.Pool: `{ id, pool, schemaName? }`\n * - Connection string: `{ id, connectionString, ... }`\n * - Host/port config: `{ id, host, port, database, user, password, ... }`\n * - Cloud SQL connector config: `{ id, stream, ... }` (via pg.ClientConfig)\n */\nexport type PostgresStoreConfig =\n | PoolInstanceConfig\n | ConnectionStringConfig\n | HostConfig\n | (PostgresBaseConfig & ClientConfig);\n\n/**\n * PostgreSQL configuration for PgVector (uses pg with ConnectionOptions)\n */\nexport type PgVectorConfig = (ConnectionStringConfig | HostConfig | (PostgresBaseConfig & ClientConfig)) & {\n pgPoolOptions?: Omit<PoolConfig, 'connectionString'>;\n};\n\n/**\n * Type guard for pre-configured pg.Pool config\n */\nexport const isPoolConfig = (cfg: PostgresStoreConfig): cfg is PoolInstanceConfig => {\n return 'pool' in cfg;\n};\n\n/**\n * Type guard for connection string config\n */\nexport const isConnectionStringConfig = (cfg: PostgresStoreConfig): cfg is ConnectionStringConfig => {\n return 'connectionString' in cfg && typeof cfg.connectionString === 'string';\n};\n\n/**\n * Type guard for host-based config\n */\nexport const isHostConfig = (cfg: PostgresStoreConfig): cfg is HostConfig => {\n return 'host' in cfg && 'database' in cfg && 'user' in cfg && 'password' in cfg;\n};\n\n/**\n * Type guard for Cloud SQL connector config\n */\nexport const isCloudSqlConfig = (cfg: PostgresStoreConfig): cfg is PostgresBaseConfig & ClientConfig => {\n return 'stream' in cfg || ('password' in cfg && typeof cfg.password === 'function');\n};\n\n/**\n * Validate PostgresStore configuration.\n */\nexport const validateConfig = (name: string, config: PostgresStoreConfig) => {\n if (!config.id || typeof config.id !== 'string' || config.id.trim() === '') {\n throw new Error(`${name}: id must be provided and cannot be empty.`);\n }\n\n // Pool config: user provides pre-configured pg.Pool\n if (isPoolConfig(config)) {\n if (!config.pool) {\n throw new Error(`${name}: pool must be provided when using pool config.`);\n }\n return; // Valid pool config\n }\n\n if (isConnectionStringConfig(config)) {\n if (\n !config.connectionString ||\n typeof config.connectionString !== 'string' ||\n config.connectionString.trim() === ''\n ) {\n throw new Error(\n `${name}: connectionString must be provided and cannot be empty. Passing an empty string may cause fallback to local Postgres defaults.`,\n );\n }\n } else if (isCloudSqlConfig(config)) {\n // valid connector config; no-op\n } else if (isHostConfig(config)) {\n const required = ['host', 'database', 'user', 'password'] as const;\n for (const key of required) {\n if (!config[key] || typeof config[key] !== 'string' || config[key].trim() === '') {\n throw new Error(\n `${name}: ${key} must be provided and cannot be empty. Passing an empty string may cause fallback to local Postgres defaults.`,\n );\n }\n }\n } else {\n throw new Error(\n `${name}: invalid config. Provide either {pool}, {connectionString}, {host,port,database,user,password}, or a pg ClientConfig (e.g., Cloud SQL connector with \\`stream\\`).`,\n );\n }\n};\n","import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n OperatorSupport,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n VectorFieldValue,\n} from '@mastra/core/vector/filter';\n\ntype PGOperatorValueMap = Omit<OperatorValueMap, '$in' | '$all' | '$nin' | '$eq' | '$ne'> & {\n $size: number;\n $contains: VectorFieldValue | Record<string, unknown>;\n $all: VectorFieldValue;\n $in: VectorFieldValue;\n $nin: VectorFieldValue;\n $eq: VectorFieldValue;\n $ne: VectorFieldValue;\n};\n\ntype PGBlacklisted = BlacklistedRootOperators | '$contains' | '$size';\n\ntype PGFilterValue = VectorFieldValue | RegExp;\n\nexport type PGVectorFilter = VectorFilter<\n keyof PGOperatorValueMap,\n PGOperatorValueMap,\n LogicalOperatorValueMap,\n PGBlacklisted,\n PGFilterValue\n>;\n\n/**\n * Translates MongoDB-style filters to PG compatible filters.\n *\n * Key differences from MongoDB:\n *\n * Logical Operators ($and, $or, $nor):\n * - Can be used at the top level or nested within fields\n * - Can take either a single condition or an array of conditions\n *\n */\nexport class PGFilterTranslator extends BaseFilterTranslator<PGVectorFilter> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n custom: ['$contains', '$size'],\n };\n }\n\n translate(filter?: PGVectorFilter): PGVectorFilter {\n if (this.isEmpty(filter)) {\n return filter;\n }\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private translateNode(node: PGVectorFilter, currentPath: string = ''): any {\n // Helper to wrap result with path if needed\n const withPath = (result: any) => (currentPath ? { [currentPath]: result } : result);\n\n // Handle primitives\n if (this.isPrimitive(node)) {\n return withPath({ $eq: this.normalizeComparisonValue(node) });\n }\n\n // Handle arrays\n if (Array.isArray(node)) {\n return withPath({ $in: this.normalizeArrayValues(node) });\n }\n\n // Handle regex\n if (node instanceof RegExp) {\n return withPath(this.translateRegexPattern(node.source, node.flags));\n }\n\n const entries = Object.entries(node as Record<string, any>);\n const result: Record<string, any> = {};\n\n if (node && '$options' in node && !('$regex' in node)) {\n throw new Error('$options is not valid without $regex');\n }\n\n // Handle special regex object format\n if (node && '$regex' in node) {\n const options = (node as any).$options || '';\n return withPath(this.translateRegexPattern((node as any).$regex, options));\n }\n\n // Process remaining entries\n for (const [key, value] of entries) {\n // Skip options as they're handled with $regex\n if (key === '$options') continue;\n\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n\n if (this.isLogicalOperator(key)) {\n result[key] = Array.isArray(value)\n ? value.map((filter: VectorFilter) => this.translateNode(filter))\n : this.translateNode(value);\n } else if (this.isOperator(key)) {\n if (this.isArrayOperator(key) && !Array.isArray(value) && key !== '$elemMatch') {\n result[key] = [value];\n } else if (this.isBasicOperator(key) && Array.isArray(value)) {\n result[key] = JSON.stringify(value);\n } else {\n result[key] = value;\n }\n } else if (typeof value === 'object' && value !== null) {\n // Handle nested objects\n const hasOperators = Object.keys(value).some(k => this.isOperator(k));\n if (hasOperators) {\n result[newPath] = this.translateNode(value);\n } else {\n Object.assign(result, this.translateNode(value, newPath));\n }\n } else {\n result[newPath] = this.translateNode(value);\n }\n }\n\n return result;\n }\n\n private translateRegexPattern(pattern: string, options: string = ''): any {\n if (!options) return { $regex: pattern };\n\n const flags = options\n .split('')\n .filter(f => 'imsux'.includes(f))\n .join('');\n\n return { $regex: flags ? `(?${flags})${pattern}` : pattern };\n }\n}\n","import { parseFieldKey } from '@mastra/core/utils';\nimport type {\n BasicOperator,\n NumericOperator,\n ArrayOperator,\n ElementOperator,\n LogicalOperator,\n RegexOperator,\n VectorFilter,\n} from '@mastra/core/vector/filter';\nimport type { PGVectorFilter } from './filter';\n\ntype OperatorType =\n | BasicOperator\n | NumericOperator\n | ArrayOperator\n | ElementOperator\n | LogicalOperator\n | '$contains'\n | Exclude<RegexOperator, '$options'>\n | '$size';\n\ntype FilterOperator = {\n sql: string;\n needsValue: boolean;\n transformValue?: () => any;\n};\n\ntype OperatorFn = (key: string, paramIndex: number, value?: any) => FilterOperator;\n\nconst createBasicOperator = (symbol: string) => {\n return (key: string, paramIndex: number) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `CASE \n WHEN $${paramIndex}::text IS NULL THEN metadata#>>'{${jsonPathKey}}' IS ${symbol === '=' ? '' : 'NOT'} NULL\n ELSE metadata#>>'{${jsonPathKey}}' ${symbol} $${paramIndex}::text\n END`,\n needsValue: true,\n };\n };\n};\n\nconst createNumericOperator = (symbol: string) => {\n return (key: string, paramIndex: number, value?: any) => {\n const jsonPathKey = parseJsonPathKey(key);\n\n // Check if the value is a number or can be parsed as a number\n const isNumeric =\n typeof value === 'number' || (typeof value === 'string' && !isNaN(Number(value)) && value.trim() !== '');\n\n // Use numeric comparison for numbers, text comparison for strings/dates\n if (isNumeric) {\n return {\n sql: `(metadata#>>'{${jsonPathKey}}')::numeric ${symbol} $${paramIndex}::numeric`,\n needsValue: true,\n };\n } else {\n // Use text comparison for strings (including ISO 8601 dates which sort correctly)\n return {\n sql: `metadata#>>'{${jsonPathKey}}' ${symbol} $${paramIndex}::text`,\n needsValue: true,\n };\n }\n };\n};\n\nfunction buildElemMatchConditions(value: any, paramIndex: number): { sql: string; values: any[] } {\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('$elemMatch requires an object with conditions');\n }\n\n const conditions: string[] = [];\n const values: any[] = [];\n\n Object.entries(value).forEach(([field, val]) => {\n const nextParamIndex = paramIndex + values.length;\n\n let paramOperator;\n let paramKey;\n let paramValue;\n\n if (field.startsWith('$')) {\n paramOperator = field;\n paramKey = '';\n paramValue = val;\n } else if (typeof val === 'object' && !Array.isArray(val)) {\n const [op, opValue] = Object.entries(val || {})[0] || [];\n paramOperator = op;\n paramKey = field;\n paramValue = opValue;\n } else {\n paramOperator = '$eq';\n paramKey = field;\n paramValue = val;\n }\n\n const operatorFn = FILTER_OPERATORS[paramOperator as OperatorType];\n if (!operatorFn) {\n throw new Error(`Invalid operator: ${paramOperator}`);\n }\n const result = operatorFn(paramKey, nextParamIndex, paramValue);\n\n const sql = result.sql.replaceAll('metadata#>>', 'elem#>>');\n conditions.push(sql);\n if (result.needsValue) {\n values.push(paramValue);\n }\n });\n\n return {\n sql: conditions.join(' AND '),\n values,\n };\n}\n\n// Define all filter operators\nconst FILTER_OPERATORS: Record<OperatorType, OperatorFn> = {\n $eq: createBasicOperator('='),\n $ne: createBasicOperator('!='),\n $gt: createNumericOperator('>'),\n $gte: createNumericOperator('>='),\n $lt: createNumericOperator('<'),\n $lte: createNumericOperator('<='),\n\n // Array Operators\n $in: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata->'${jsonPathKey}') = 'array' THEN\n EXISTS (\n SELECT 1 FROM jsonb_array_elements_text(metadata->'${jsonPathKey}') as elem\n WHERE elem = ANY($${paramIndex}::text[])\n )\n ELSE metadata#>>'{${jsonPathKey}}' = ANY($${paramIndex}::text[])\n END\n )`,\n needsValue: true,\n };\n },\n $nin: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata->'${jsonPathKey}') = 'array' THEN\n NOT EXISTS (\n SELECT 1 FROM jsonb_array_elements_text(metadata->'${jsonPathKey}') as elem\n WHERE elem = ANY($${paramIndex}::text[])\n )\n ELSE metadata#>>'{${jsonPathKey}}' != ALL($${paramIndex}::text[])\n END\n )`,\n needsValue: true,\n };\n },\n $all: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `CASE WHEN array_length($${paramIndex}::text[], 1) IS NULL THEN false \n ELSE (metadata#>'{${jsonPathKey}}')::jsonb ?& $${paramIndex}::text[] END`,\n needsValue: true,\n };\n },\n $elemMatch: (key: string, paramIndex: number, value: any): FilterOperator => {\n const { sql, values } = buildElemMatchConditions(value, paramIndex);\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata->'${jsonPathKey}') = 'array' THEN\n EXISTS (\n SELECT 1 \n FROM jsonb_array_elements(metadata->'${jsonPathKey}') as elem\n WHERE ${sql}\n )\n ELSE FALSE\n END\n )`,\n needsValue: true,\n transformValue: () => values,\n };\n },\n // Element Operators\n $exists: (key, paramIndex, value) => {\n const jsonPathKey = parseJsonPathKey(key);\n // If value is false, check that the key does NOT exist\n if (value === false) {\n return {\n sql: `NOT (metadata ? '${jsonPathKey}')`,\n needsValue: false,\n };\n }\n // Otherwise (true or truthy), check that the key exists\n return {\n sql: `metadata ? '${jsonPathKey}'`,\n needsValue: false,\n };\n },\n\n // Logical Operators\n $and: key => ({ sql: `(${key})`, needsValue: false }),\n $or: key => ({ sql: `(${key})`, needsValue: false }),\n $not: key => ({ sql: `NOT (${key})`, needsValue: false }),\n $nor: key => ({ sql: `NOT (${key})`, needsValue: false }),\n\n // Regex Operators\n $regex: (key, paramIndex) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `metadata#>>'{${jsonPathKey}}' ~ $${paramIndex}`,\n needsValue: true,\n };\n },\n\n $contains: (key, paramIndex, value: any) => {\n const jsonPathKey = parseJsonPathKey(key);\n let sql;\n if (Array.isArray(value)) {\n sql = `(metadata->'${jsonPathKey}') ?& $${paramIndex}`;\n } else if (typeof value === 'string') {\n sql = `metadata->>'${jsonPathKey}' ILIKE '%' || $${paramIndex} || '%' ESCAPE '\\\\'`;\n } else {\n sql = `metadata->>'${jsonPathKey}' = $${paramIndex}`;\n }\n return {\n sql,\n needsValue: true,\n transformValue: () =>\n Array.isArray(value) ? value.map(String) : typeof value === 'string' ? escapeLikePattern(value) : value,\n };\n },\n /**\n * $objectContains: Postgres-only operator for true JSONB object containment.\n * Usage: { field: { $objectContains: { ...subobject } } }\n */\n // $objectContains: (key, paramIndex) => ({\n // sql: `metadata @> $${paramIndex}::jsonb`,\n // needsValue: true,\n // transformValue: value => {\n // const parts = key.split('.');\n // return JSON.stringify(parts.reduceRight((value, key) => ({ [key]: value }), value));\n // },\n // }),\n $size: (key: string, paramIndex: number) => {\n const jsonPathKey = parseJsonPathKey(key);\n return {\n sql: `(\n CASE\n WHEN jsonb_typeof(metadata#>'{${jsonPathKey}}') = 'array' THEN \n jsonb_array_length(metadata#>'{${jsonPathKey}}') = $${paramIndex}\n ELSE FALSE\n END\n )`,\n needsValue: true,\n };\n },\n};\n\ninterface FilterResult {\n sql: string;\n values: any[];\n}\n\nconst parseJsonPathKey = (key: string) => {\n const parsedKey = key !== '' ? parseFieldKey(key) : '';\n return parsedKey.replace(/\\./g, ',');\n};\n\nfunction escapeLikePattern(str: string): string {\n return str.replace(/([%_\\\\])/g, '\\\\$1');\n}\n\n/**\n * Build a filter query for DELETE operations (no minScore/topK parameters)\n */\nexport function buildDeleteFilterQuery(filter: PGVectorFilter): FilterResult {\n const values: any[] = [];\n\n function buildCondition(key: string, value: any, parentPath: string): string {\n // Handle logical operators ($and/$or)\n if (['$and', '$or', '$not', '$nor'].includes(key)) {\n return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n }\n\n // If condition is not a FilterCondition object, assume it's an equality check\n if (!value || typeof value !== 'object') {\n values.push(value);\n return `metadata#>>'{${parseJsonPathKey(key)}}' = $${values.length}`;\n }\n\n // Handle operator conditions\n const entries = Object.entries(value);\n\n // If multiple operators on same field (e.g., { $gte: 20, $lte: 80 }), combine with AND\n if (entries.length > 1) {\n const conditions = entries.map(([operator, operatorValue]) => {\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const nestedConditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n return `NOT (${nestedConditions})`;\n }\n\n if (!FILTER_OPERATORS[operator as OperatorType]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n });\n return conditions.join(' AND ');\n }\n\n // Single operator case\n const [[operator, operatorValue] = []] = entries;\n\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n\n return `NOT (${conditions})`;\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n }\n\n function handleLogicalOperator(\n key: '$and' | '$or' | '$not' | '$nor',\n value: VectorFilter[],\n parentPath: string,\n ): string {\n if (key === '$not') {\n // For top-level $not\n const entries = Object.entries(value);\n const conditions = entries\n .map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key))\n .join(' AND ');\n return `NOT (${conditions})`;\n }\n\n // Handle empty conditions\n if (!value || value.length === 0) {\n switch (key) {\n case '$and':\n case '$nor':\n return 'true'; // Empty $and/$nor match everything\n case '$or':\n return 'false'; // Empty $or matches nothing\n default:\n return 'true';\n }\n }\n\n const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n const conditions = value.map((f: VectorFilter) => {\n const entries = Object.entries(f || {});\n if (entries.length === 0) return '';\n\n const [firstKey, firstValue] = entries[0] || [];\n if (['$and', '$or', '$not', '$nor'].includes(firstKey as string)) {\n return buildCondition(firstKey as string, firstValue, parentPath);\n }\n return entries.map(([k, v]) => buildCondition(k, v, parentPath)).join(` ${joinOperator} `);\n });\n\n const joined = conditions.join(` ${joinOperator} `);\n const operatorFn = FILTER_OPERATORS[key]!;\n return operatorFn(joined, 0, value).sql;\n }\n\n if (!filter) {\n return { sql: '', values };\n }\n\n const conditions = Object.entries(filter)\n .map(([key, value]) => buildCondition(key, value, ''))\n .filter(Boolean)\n .join(' AND ');\n\n return { sql: conditions ? `WHERE ${conditions}` : '', values };\n}\n\nexport function buildFilterQuery(filter: PGVectorFilter, minScore: number, topK: number): FilterResult {\n const values = [minScore, topK];\n\n function buildCondition(key: string, value: any, parentPath: string): string {\n // Handle logical operators ($and/$or)\n if (['$and', '$or', '$not', '$nor'].includes(key)) {\n return handleLogicalOperator(key as '$and' | '$or' | '$not' | '$nor', value, parentPath);\n }\n\n // If condition is not a FilterCondition object, assume it's an equality check\n if (!value || typeof value !== 'object') {\n values.push(value);\n return `metadata#>>'{${parseJsonPathKey(key)}}' = $${values.length}`;\n }\n\n // Handle operator conditions\n const entries = Object.entries(value);\n\n // If multiple operators on same field (e.g., { $gte: 20, $lte: 80 }), combine with AND\n if (entries.length > 1) {\n const conditions = entries.map(([operator, operatorValue]) => {\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const nestedConditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n return `NOT (${nestedConditions})`;\n }\n\n if (!FILTER_OPERATORS[operator as OperatorType]) {\n throw new Error(`Invalid operator: ${operator}`);\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n });\n return conditions.join(' AND ');\n }\n\n // Single operator case\n const [[operator, operatorValue] = []] = entries;\n\n // Special handling for nested $not\n if (operator === '$not') {\n const nestedEntries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = nestedEntries\n .map(([nestedOp, nestedValue]) => {\n if (!FILTER_OPERATORS[nestedOp as OperatorType]) {\n throw new Error(`Invalid operator in $not condition: ${nestedOp}`);\n }\n const operatorFn = FILTER_OPERATORS[nestedOp as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, nestedValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : nestedValue;\n if (Array.isArray(transformedValue) && nestedOp === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n })\n .join(' AND ');\n\n return `NOT (${conditions})`;\n }\n const operatorFn = FILTER_OPERATORS[operator as OperatorType]!;\n const operatorResult = operatorFn(key, values.length + 1, operatorValue);\n if (operatorResult.needsValue) {\n const transformedValue = operatorResult.transformValue ? operatorResult.transformValue() : operatorValue;\n if (Array.isArray(transformedValue) && operator === '$elemMatch') {\n values.push(...transformedValue);\n } else {\n values.push(transformedValue);\n }\n }\n return operatorResult.sql;\n }\n\n function handleLogicalOperator(\n key: '$and' | '$or' | '$not' | '$nor',\n value: VectorFilter[],\n parentPath: string,\n ): string {\n if (key === '$not') {\n // For top-level $not\n const entries = Object.entries(value);\n const conditions = entries\n .map(([fieldKey, fieldValue]) => buildCondition(fieldKey, fieldValue, key))\n .join(' AND ');\n return `NOT (${conditions})`;\n }\n\n // Handle empty conditions\n if (!value || value.length === 0) {\n switch (key) {\n case '$and':\n case '$nor':\n return 'true'; // Empty $and/$nor match everything\n case '$or':\n return 'false'; // Empty $or matches nothing\n default:\n return 'true';\n }\n }\n\n const joinOperator = key === '$or' || key === '$nor' ? 'OR' : 'AND';\n const conditions = value.map((f: VectorFilter) => {\n const entries = Object.entries(f || {});\n if (entries.length === 0) return '';\n\n const [firstKey, firstValue] = entries[0] || [];\n if (['$and', '$or', '$not', '$nor'].includes(firstKey as string)) {\n return buildCondition(firstKey as string, firstValue, parentPath);\n }\n return entries.map(([k, v]) => buildCondition(k, v, parentPath)).join(` ${joinOperator} `);\n });\n\n const joined = conditions.join(` ${joinOperator} `);\n const operatorFn = FILTER_OPERATORS[key]!;\n return operatorFn(joined, 0, value).sql;\n }\n\n if (!filter) {\n return { sql: '', values };\n }\n\n const conditions = Object.entries(filter)\n .map(([key, value]) => buildCondition(key, value, ''))\n .filter(Boolean)\n .join(' AND ');\n\n return { sql: conditions ? `WHERE ${conditions}` : '', values };\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { MastraVector, validateUpsertInput, validateTopK } from '@mastra/core/vector';\nimport type {\n IndexStats,\n QueryResult,\n QueryVectorParams,\n CreateIndexParams,\n UpsertVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DeleteVectorsParams,\n UpdateVectorParams,\n} from '@mastra/core/vector';\nimport { Mutex } from 'async-mutex';\nimport * as pg from 'pg';\nimport xxhash from 'xxhash-wasm';\n\nimport { validateConfig, isCloudSqlConfig, isConnectionStringConfig, isHostConfig } from '../shared/config';\nimport type { PgVectorConfig } from '../shared/config';\nimport { PGFilterTranslator } from './filter';\nimport type { PGVectorFilter } from './filter';\nimport { buildFilterQuery, buildDeleteFilterQuery } from './sql-builder';\nimport type { IndexConfig, IndexType, VectorType } from './types';\n\nexport interface PGIndexStats extends IndexStats {\n type: IndexType;\n /**\n * The pgvector storage type used for this index.\n * - 'vector': Full precision (4 bytes per dimension)\n * - 'halfvec': Half precision (2 bytes per dimension)\n */\n vectorType: VectorType;\n config: {\n m?: number;\n efConstruction?: number;\n lists?: number;\n probes?: number;\n };\n}\n\ninterface PgQueryVectorParams extends QueryVectorParams<PGVectorFilter> {\n minScore?: number;\n /**\n * HNSW search parameter. Controls the size of the dynamic candidate\n * list during search. Higher values improve accuracy at the cost of speed.\n */\n ef?: number;\n /**\n * IVFFlat probe parameter. Number of cells to visit during search.\n * Higher values improve accuracy at the cost of speed.\n */\n probes?: number;\n}\n\ninterface PgCreateIndexParams extends CreateIndexParams {\n indexConfig?: IndexConfig;\n buildIndex?: boolean;\n /**\n * The pgvector storage type for embeddings.\n * - 'vector': Full precision (4 bytes per dimension), max 2000 dimensions for indexes (default)\n * - 'halfvec': Half precision (2 bytes per dimension), max 4000 dimensions for indexes\n *\n * Use 'halfvec' for large dimension models like text-embedding-3-large (3072 dimensions)\n */\n vectorType?: VectorType;\n}\n\ninterface PgDefineIndexParams {\n indexName: string;\n metric: 'cosine' | 'euclidean' | 'dotproduct';\n indexConfig: IndexConfig;\n vectorType?: VectorType;\n}\n\nexport class PgVector extends MastraVector<PGVectorFilter> {\n public pool: pg.Pool;\n private describeIndexCache: Map<string, PGIndexStats> = new Map();\n private createdIndexes = new Map<string, number>();\n private indexVectorTypes = new Map<string, VectorType>();\n private mutexesByName = new Map<string, Mutex>();\n private schema?: string;\n private setupSchemaPromise: Promise<void> | null = null;\n private installVectorExtensionPromise: Promise<void> | null = null;\n private vectorExtensionInstalled: boolean | undefined = undefined;\n private vectorExtensionSchema: string | null = null;\n private vectorExtensionVersion: string | null = null;\n private schemaSetupComplete: boolean | undefined = undefined;\n private cacheWarmupPromise: Promise<void> | null = null;\n\n constructor(config: PgVectorConfig & { id: string }) {\n try {\n validateConfig('PgVector', config);\n super({ id: config.id });\n\n this.schema = config.schemaName;\n\n let poolConfig: pg.PoolConfig;\n\n if (isConnectionStringConfig(config)) {\n poolConfig = {\n connectionString: config.connectionString,\n ssl: config.ssl,\n max: config.max ?? 20,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: 2000,\n ...config.pgPoolOptions,\n };\n } else if (isCloudSqlConfig(config)) {\n poolConfig = {\n ...config,\n max: config.pgPoolOptions?.max ?? 20,\n idleTimeoutMillis: config.pgPoolOptions?.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: 2000,\n ...config.pgPoolOptions,\n } as pg.PoolConfig;\n } else if (isHostConfig(config)) {\n poolConfig = {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n max: config.max ?? 20,\n idleTimeoutMillis: config.idleTimeoutMillis ?? 30000,\n connectionTimeoutMillis: 2000,\n ...config.pgPoolOptions,\n };\n } else {\n throw new Error('PgVector: invalid configuration provided');\n }\n\n this.pool = new pg.Pool(poolConfig);\n\n // Warm the created indexes cache in background so we don't need to check if indexes exist every time\n // Store the promise so we can wait for it during disconnect to avoid \"pool already closed\" errors\n this.cacheWarmupPromise = (async () => {\n try {\n const existingIndexes = await this.listIndexes();\n await Promise.all(\n existingIndexes.map(async indexName => {\n const info = await this.getIndexInfo({ indexName });\n const key = await this.getIndexCacheKey({\n indexName,\n metric: info.metric,\n dimension: info.dimension,\n type: info.type,\n vectorType: info.vectorType,\n });\n this.createdIndexes.set(indexName, key);\n this.indexVectorTypes.set(indexName, info.vectorType);\n }),\n );\n } catch (error) {\n // Don't throw - cache warming is optional optimization\n // If it fails (e.g., pool closed early), just log and continue\n this.logger?.debug('Cache warming skipped or failed', { error });\n }\n })();\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('PG', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n schemaName: 'schemaName' in config ? (config.schemaName ?? '') : '',\n },\n },\n error,\n );\n }\n }\n\n private getMutexByName(indexName: string) {\n if (!this.mutexesByName.has(indexName)) this.mutexesByName.set(indexName, new Mutex());\n return this.mutexesByName.get(indexName)!;\n }\n\n /**\n * Detects which schema contains the vector extension and its version\n */\n private async detectVectorExtensionSchema(client: pg.PoolClient): Promise<string | null> {\n try {\n const result = await client.query(`\n SELECT n.nspname as schema_name, e.extversion as version\n FROM pg_extension e\n JOIN pg_namespace n ON e.extnamespace = n.oid\n WHERE e.extname = 'vector'\n LIMIT 1;\n `);\n\n if (result.rows.length > 0) {\n this.vectorExtensionSchema = result.rows[0].schema_name;\n this.vectorExtensionVersion = result.rows[0].version;\n this.logger.debug('Vector extension found', {\n schema: this.vectorExtensionSchema,\n version: this.vectorExtensionVersion,\n });\n return this.vectorExtensionSchema;\n }\n\n return null;\n } catch (error) {\n this.logger.debug('Could not detect vector extension schema', { error });\n return null;\n }\n }\n\n /**\n * Checks if the installed pgvector version supports halfvec type.\n * halfvec was introduced in pgvector 0.7.0.\n */\n private supportsHalfvec(): boolean {\n if (!this.vectorExtensionVersion) {\n return false;\n }\n // Parse version string, handling non-numeric suffixes (e.g., \"0.7.0-beta\", \"0.8.0+build\")\n const parts = this.vectorExtensionVersion.split('.');\n const major = parseInt(parts[0] ?? '', 10);\n const minor = parseInt(parts[1] ?? '', 10);\n // If parsing failed (NaN), assume version doesn't support halfvec\n if (isNaN(major) || isNaN(minor)) {\n return false;\n }\n // halfvec was introduced in pgvector 0.7.0\n return major > 0 || (major === 0 && minor >= 7);\n }\n\n /**\n * Gets the properly qualified vector type name\n * @param vectorType - The type of vector storage ('vector' or 'halfvec')\n */\n private getVectorTypeName(vectorType: VectorType = 'vector'): string {\n // If we know where the extension is, use that\n if (this.vectorExtensionSchema) {\n // If it's in pg_catalog, return the type directly\n if (this.vectorExtensionSchema === 'pg_catalog') {\n return vectorType;\n }\n // Issue #10061: Always qualify with schema where vector extension is installed\n // This ensures the type is found regardless of the session's search_path\n const validatedSchema = parseSqlIdentifier(this.vectorExtensionSchema, 'vector extension schema');\n return `${validatedSchema}.${vectorType}`;\n }\n\n // Fallback to unqualified (will use search_path)\n return vectorType;\n }\n\n /**\n * Gets the operator class for index creation based on metric and vector type.\n * pgvector uses different operator classes for vector vs halfvec types.\n */\n private getMetricOperatorClass(metric: 'cosine' | 'euclidean' | 'dotproduct', vectorType: VectorType): string {\n const prefix = vectorType === 'halfvec' ? 'halfvec' : 'vector';\n switch (metric) {\n case 'cosine':\n return `${prefix}_cosine_ops`;\n case 'euclidean':\n return `${prefix}_l2_ops`;\n case 'dotproduct':\n return `${prefix}_ip_ops`;\n default:\n return `${prefix}_cosine_ops`;\n }\n }\n\n private getTableName(indexName: string) {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const quotedIndexName = `\"${parsedIndexName}\"`;\n const quotedSchemaName = this.getSchemaName();\n const quotedVectorName = `\"${parsedIndexName}_vector_idx\"`;\n return {\n tableName: quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName,\n vectorIndexName: quotedVectorName,\n };\n }\n\n private getSchemaName() {\n return this.schema ? `\"${parseSqlIdentifier(this.schema, 'schema name')}\"` : undefined;\n }\n\n transformFilter(filter?: PGVectorFilter) {\n const translator = new PGFilterTranslator();\n return translator.translate(filter);\n }\n\n async getIndexInfo({ indexName }: DescribeIndexParams): Promise<PGIndexStats> {\n if (!this.describeIndexCache.has(indexName)) {\n this.describeIndexCache.set(indexName, await this.describeIndex({ indexName }));\n }\n return this.describeIndexCache.get(indexName)!;\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n minScore = -1,\n ef,\n probes,\n }: PgQueryVectorParams): Promise<QueryResult[]> {\n try {\n // Validate topK parameter\n validateTopK('PG', topK);\n if (!Array.isArray(queryVector) || !queryVector.every(x => typeof x === 'number' && Number.isFinite(x))) {\n throw new Error('queryVector must be an array of finite numbers');\n }\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'QUERY', 'INVALID_INPUT'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n\n const client = await this.pool.connect();\n try {\n await client.query('BEGIN');\n const vectorStr = `[${queryVector.join(',')}]`;\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildFilterQuery(translatedFilter, minScore, topK);\n\n // Get index type and configuration\n const indexInfo = await this.getIndexInfo({ indexName });\n\n // Set HNSW search parameter if applicable\n if (indexInfo.type === 'hnsw') {\n // Calculate ef and clamp between 1 and 1000\n const calculatedEf = ef ?? Math.max(topK, (indexInfo?.config?.m ?? 16) * topK);\n const searchEf = Math.min(1000, Math.max(1, calculatedEf));\n await client.query(`SET LOCAL hnsw.ef_search = ${searchEf}`);\n }\n\n if (indexInfo.type === 'ivfflat' && probes) {\n await client.query(`SET LOCAL ivfflat.probes = ${probes}`);\n }\n\n const { tableName } = this.getTableName(indexName);\n\n // Get the properly qualified vector type based on the index's vector type\n const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType);\n\n const query = `\n WITH vector_scores AS (\n SELECT\n vector_id as id,\n 1 - (embedding <=> '${vectorStr}'::${qualifiedVectorType}) as score,\n metadata\n ${includeVector ? ', embedding' : ''}\n FROM ${tableName}\n ${filterQuery}\n )\n SELECT *\n FROM vector_scores\n WHERE score > $1\n ORDER BY score DESC\n LIMIT $2`;\n const result = await client.query(query, filterValues);\n await client.query('COMMIT');\n\n return result.rows.map(({ id, score, metadata, embedding }) => ({\n id,\n score,\n metadata,\n ...(includeVector && embedding && { vector: JSON.parse(embedding) }),\n }));\n } catch (error) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'QUERY', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async upsert({\n indexName,\n vectors,\n metadata,\n ids,\n deleteFilter,\n }: UpsertVectorParams<PGVectorFilter>): Promise<string[]> {\n // Validate input parameters\n validateUpsertInput('PG', vectors, metadata, ids);\n\n const { tableName } = this.getTableName(indexName);\n\n // Start a transaction\n const client = await this.pool.connect();\n try {\n await client.query('BEGIN');\n\n // Step 1: If deleteFilter is provided, delete matching vectors first\n if (deleteFilter) {\n this.logger?.debug(`Deleting vectors matching filter before upsert`, { indexName, deleteFilter });\n\n // Reuse the filter translation logic\n const translatedFilter = this.transformFilter(deleteFilter);\n const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n\n const whereClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n if (whereClause) {\n const deleteQuery = `DELETE FROM ${tableName} WHERE ${whereClause}`;\n const result = await client.query(deleteQuery, filterValues);\n this.logger?.debug(`Deleted ${result.rowCount || 0} vectors before upsert`, {\n indexName,\n deletedCount: result.rowCount || 0,\n });\n }\n }\n\n // Step 2: Insert/update new vectors\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Get the properly qualified vector type for this index\n const indexInfo = await this.getIndexInfo({ indexName });\n const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType);\n\n for (let i = 0; i < vectors.length; i++) {\n const query = `\n INSERT INTO ${tableName} (vector_id, embedding, metadata)\n VALUES ($1, $2::${qualifiedVectorType}, $3::jsonb)\n ON CONFLICT (vector_id)\n DO UPDATE SET\n embedding = $2::${qualifiedVectorType},\n metadata = $3::jsonb\n RETURNING embedding::text\n `;\n\n await client.query(query, [vectorIds[i], `[${vectors[i]?.join(',')}]`, JSON.stringify(metadata?.[i] || {})]);\n }\n\n await client.query('COMMIT');\n\n this.logger?.debug(`Upserted ${vectors.length} vectors to ${indexName}`, {\n indexName,\n vectorCount: vectors.length,\n hadDeleteFilter: !!deleteFilter,\n });\n\n return vectorIds;\n } catch (error) {\n await client.query('ROLLBACK');\n if (error instanceof Error && error.message?.includes('expected') && error.message?.includes('dimensions')) {\n const match = error.message.match(/expected (\\d+) dimensions, not (\\d+)/);\n if (match) {\n const [, expected, actual] = match;\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'UPSERT', 'INVALID_INPUT'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n text:\n `Vector dimension mismatch: Index \"${indexName}\" expects ${expected} dimensions but got ${actual} dimensions. ` +\n `Either use a matching embedding model or delete and recreate the index with the new dimension.`,\n details: {\n indexName,\n expected: expected ?? '',\n actual: actual ?? '',\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n private hasher = xxhash();\n private async getIndexCacheKey({\n indexName,\n dimension,\n metric,\n type,\n vectorType = 'vector',\n }: CreateIndexParams & { type: IndexType | undefined; vectorType?: VectorType }) {\n const input = indexName + dimension + metric + (type || 'ivfflat') + vectorType; // ivfflat is default\n return (await this.hasher).h32(input);\n }\n private cachedIndexExists(indexName: string, newKey: number) {\n const existingIndexCacheKey = this.createdIndexes.get(indexName);\n return existingIndexCacheKey && existingIndexCacheKey === newKey;\n }\n private async setupSchema(client: pg.PoolClient) {\n if (!this.schema || this.schemaSetupComplete) {\n return;\n }\n\n if (!this.setupSchemaPromise) {\n this.setupSchemaPromise = (async () => {\n try {\n // First check if schema exists and we have usage permission\n const schemaCheck = await client.query(\n `\n SELECT EXISTS (\n SELECT 1 FROM information_schema.schemata\n WHERE schema_name = $1\n )\n `,\n [this.schema],\n );\n\n const schemaExists = schemaCheck.rows[0].exists;\n\n if (!schemaExists) {\n try {\n await client.query(`CREATE SCHEMA IF NOT EXISTS ${this.getSchemaName()}`);\n this.logger.info(`Schema \"${this.schema}\" created successfully`);\n } catch (error) {\n this.logger.error(`Failed to create schema \"${this.schema}\"`, { error });\n throw new Error(\n `Unable to create schema \"${this.schema}\". This requires CREATE privilege on the database. ` +\n `Either create the schema manually or grant CREATE privilege to the user.`,\n );\n }\n }\n\n // If we got here, schema exists and we can use it\n this.schemaSetupComplete = true;\n this.logger.debug(`Schema \"${this.schema}\" is ready for use`);\n } catch (error) {\n // Reset flags so we can retry\n this.schemaSetupComplete = undefined;\n this.setupSchemaPromise = null;\n throw error;\n } finally {\n this.setupSchemaPromise = null;\n }\n })();\n }\n\n await this.setupSchemaPromise;\n }\n\n async createIndex({\n indexName,\n dimension,\n metric = 'cosine',\n indexConfig = {},\n buildIndex = true,\n vectorType = 'vector',\n }: PgCreateIndexParams): Promise<void> {\n const { tableName } = this.getTableName(indexName);\n\n // Validate inputs\n try {\n if (!indexName.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) {\n throw new Error('Invalid index name format');\n }\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n if (vectorType !== 'vector' && vectorType !== 'halfvec') {\n throw new Error('vectorType must be \"vector\" or \"halfvec\"');\n }\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'CREATE_INDEX', 'INVALID_INPUT'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n\n const indexCacheKey = await this.getIndexCacheKey({\n indexName,\n dimension,\n type: indexConfig.type,\n metric,\n vectorType,\n });\n if (this.cachedIndexExists(indexName, indexCacheKey)) {\n // we already saw this index get created since the process started, no need to recreate it\n return;\n }\n\n const mutex = this.getMutexByName(`create-${indexName}`);\n // Use async-mutex instead of advisory lock for perf (over 2x as fast)\n await mutex\n .runExclusive(async () => {\n if (this.cachedIndexExists(indexName, indexCacheKey)) {\n // this may have been created while we were waiting to acquire a lock\n return;\n }\n\n const client = await this.pool.connect();\n\n try {\n // Setup schema if needed\n await this.setupSchema(client);\n\n // Install vector extension and detect where it is\n await this.installVectorExtension(client);\n\n // Check if halfvec is supported when requested\n if (vectorType === 'halfvec' && !this.supportsHalfvec()) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'CREATE_INDEX', 'HALFVEC_NOT_SUPPORTED'),\n text:\n `halfvec type requires pgvector >= 0.7.0, but version ${this.vectorExtensionVersion || 'unknown'} is installed. ` +\n `Either upgrade pgvector or use vectorType: 'vector' (which supports up to 2000 dimensions for indexes).`,\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n indexName,\n requestedVectorType: vectorType,\n pgvectorVersion: this.vectorExtensionVersion || 'unknown',\n requiredVersion: '0.7.0',\n },\n });\n }\n\n // Set search path to include both schemas if needed\n if (\n this.schema &&\n this.vectorExtensionSchema &&\n this.schema !== this.vectorExtensionSchema &&\n this.vectorExtensionSchema !== 'pg_catalog'\n ) {\n await client.query(`SET search_path TO ${this.getSchemaName()}, \"${this.vectorExtensionSchema}\"`);\n }\n\n // Use the properly qualified vector type (vector or halfvec)\n const qualifiedVectorType = this.getVectorTypeName(vectorType);\n\n await client.query(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id SERIAL PRIMARY KEY,\n vector_id TEXT UNIQUE NOT NULL,\n embedding ${qualifiedVectorType}(${dimension}),\n metadata JSONB DEFAULT '{}'::jsonb\n );\n `);\n this.createdIndexes.set(indexName, indexCacheKey);\n this.indexVectorTypes.set(indexName, vectorType);\n\n if (buildIndex) {\n await this.setupIndex({ indexName, metric, indexConfig, vectorType }, client);\n }\n } catch (error: any) {\n this.createdIndexes.delete(indexName);\n this.indexVectorTypes.delete(indexName);\n throw error;\n } finally {\n client.release();\n }\n })\n .catch(error => {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n });\n }\n\n async buildIndex({ indexName, metric = 'cosine', indexConfig }: PgDefineIndexParams): Promise<void> {\n const client = await this.pool.connect();\n try {\n await this.setupIndex({ indexName, metric, indexConfig }, client);\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'BUILD_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n private async setupIndex(\n { indexName, metric, indexConfig, vectorType = 'vector' }: PgDefineIndexParams,\n client: pg.PoolClient,\n ) {\n const mutex = this.getMutexByName(`build-${indexName}`);\n // Use async-mutex instead of advisory lock for perf (over 2x as fast)\n await mutex.runExclusive(async () => {\n // Check if the index config is empty\n const isConfigEmpty =\n !indexConfig ||\n Object.keys(indexConfig).length === 0 ||\n (!indexConfig.type && !indexConfig.ivf && !indexConfig.hnsw);\n // Determine index type - use defaults if no config provided\n const indexType = isConfigEmpty ? 'ivfflat' : indexConfig.type || 'ivfflat';\n\n const { tableName, vectorIndexName } = this.getTableName(indexName);\n\n // Try to get existing index info to check if configuration has changed\n let existingIndexInfo: PGIndexStats | null = null;\n let dimension = 0;\n try {\n existingIndexInfo = await this.getIndexInfo({ indexName });\n dimension = existingIndexInfo.dimension;\n\n if (isConfigEmpty && existingIndexInfo.metric === metric) {\n if (existingIndexInfo.type === 'flat') {\n // No index exists - create the default ivfflat\n this.logger?.debug(`No index exists for ${vectorIndexName}, will create default ivfflat index`);\n } else {\n // Preserve existing non-flat index\n this.logger?.debug(\n `Index ${vectorIndexName} already exists (type: ${existingIndexInfo.type}, metric: ${existingIndexInfo.metric}), preserving existing configuration`,\n );\n const cacheKey = await this.getIndexCacheKey({\n indexName,\n dimension,\n type: existingIndexInfo.type,\n metric: existingIndexInfo.metric,\n vectorType: existingIndexInfo.vectorType,\n });\n this.createdIndexes.set(indexName, cacheKey);\n this.indexVectorTypes.set(indexName, existingIndexInfo.vectorType);\n return;\n }\n }\n\n // If config was empty but metric didn't match, OR config was provided, check for changes\n let configMatches = existingIndexInfo.metric === metric && existingIndexInfo.type === indexType;\n if (indexType === 'hnsw') {\n configMatches =\n configMatches &&\n existingIndexInfo.config.m === (indexConfig.hnsw?.m ?? 8) &&\n existingIndexInfo.config.efConstruction === (indexConfig.hnsw?.efConstruction ?? 32);\n } else if (indexType === 'flat') {\n configMatches = configMatches && existingIndexInfo.type === 'flat';\n } else if (indexType === 'ivfflat' && indexConfig.ivf?.lists) {\n configMatches = configMatches && existingIndexInfo.config.lists === indexConfig.ivf?.lists;\n }\n\n if (configMatches) {\n this.logger?.debug(`Index ${vectorIndexName} already exists with same configuration, skipping recreation`);\n // Update cache with the existing configuration\n const cacheKey = await this.getIndexCacheKey({\n indexName,\n dimension,\n type: existingIndexInfo.type,\n metric: existingIndexInfo.metric,\n vectorType: existingIndexInfo.vectorType,\n });\n this.createdIndexes.set(indexName, cacheKey);\n this.indexVectorTypes.set(indexName, existingIndexInfo.vectorType);\n return;\n }\n\n // Configuration changed, need to rebuild\n this.logger?.info(`Index ${vectorIndexName} configuration changed, rebuilding index`);\n await client.query(`DROP INDEX IF EXISTS ${vectorIndexName}`);\n this.describeIndexCache.delete(indexName);\n } catch {\n this.logger?.debug(`Index ${indexName} doesn't exist yet, will create it`);\n }\n\n if (indexType === 'flat') {\n this.describeIndexCache.delete(indexName);\n return;\n }\n\n // Get the operator class based on vector type and metric\n // pgvector uses different operator classes for vector vs halfvec\n // Use the detected vectorType from existing table if available, otherwise use the parameter\n const effectiveVectorType = existingIndexInfo?.vectorType ?? vectorType;\n const metricOp = this.getMetricOperatorClass(metric, effectiveVectorType);\n\n let indexSQL: string;\n if (indexType === 'hnsw') {\n const m = indexConfig.hnsw?.m ?? 8;\n const efConstruction = indexConfig.hnsw?.efConstruction ?? 32;\n\n indexSQL = `\n CREATE INDEX IF NOT EXISTS ${vectorIndexName}\n ON ${tableName}\n USING hnsw (embedding ${metricOp})\n WITH (\n m = ${m},\n ef_construction = ${efConstruction}\n )\n `;\n } else {\n let lists: number;\n if (indexConfig.ivf?.lists) {\n lists = indexConfig.ivf.lists;\n } else {\n const size = (await client.query(`SELECT COUNT(*) FROM ${tableName}`)).rows[0].count;\n lists = Math.max(100, Math.min(4000, Math.floor(Math.sqrt(size) * 2)));\n }\n indexSQL = `\n CREATE INDEX IF NOT EXISTS ${vectorIndexName}\n ON ${tableName}\n USING ivfflat (embedding ${metricOp})\n WITH (lists = ${lists});\n `;\n }\n\n await client.query(indexSQL);\n });\n }\n\n private async installVectorExtension(client: pg.PoolClient) {\n // If we've already successfully installed, no need to do anything\n if (this.vectorExtensionInstalled) {\n return;\n }\n\n // If there's no existing installation attempt or the previous one failed\n if (!this.installVectorExtensionPromise) {\n this.installVectorExtensionPromise = (async () => {\n try {\n // First, detect if and where the extension is already installed\n const existingSchema = await this.detectVectorExtensionSchema(client);\n\n if (existingSchema) {\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = existingSchema;\n this.logger.info(`Vector extension already installed in schema: ${existingSchema}`);\n return;\n }\n\n // Try to install the extension\n try {\n // First try to install in the custom schema if provided\n if (this.schema && this.schema !== 'public') {\n try {\n await client.query(`CREATE EXTENSION IF NOT EXISTS vector SCHEMA ${this.getSchemaName()}`);\n // Re-detect to get the version info (needed for halfvec support check)\n const installedSchema = await this.detectVectorExtensionSchema(client);\n if (installedSchema) {\n this.vectorExtensionInstalled = true;\n this.logger.info(`Vector extension installed in schema: ${installedSchema}`);\n return;\n }\n // Fallback if detection failed but install succeeded\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = this.schema;\n this.logger.info(`Vector extension installed in schema: ${this.schema}`);\n return;\n } catch (schemaError) {\n this.logger.debug(`Could not install vector extension in schema ${this.schema}, trying public schema`, {\n error: schemaError,\n });\n }\n }\n\n // Fall back to installing in public schema (or default)\n await client.query('CREATE EXTENSION IF NOT EXISTS vector');\n\n // Detect where it was actually installed\n const installedSchema = await this.detectVectorExtensionSchema(client);\n if (installedSchema) {\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = installedSchema;\n this.logger.info(`Vector extension installed in schema: ${installedSchema}`);\n }\n } catch (error) {\n this.logger.warn(\n 'Could not install vector extension. This requires superuser privileges. ' +\n 'If the extension is already installed, you can ignore this warning.',\n { error },\n );\n\n // Even if installation failed, check if it exists somewhere\n const existingSchema = await this.detectVectorExtensionSchema(client);\n if (existingSchema) {\n this.vectorExtensionInstalled = true;\n this.vectorExtensionSchema = existingSchema;\n this.logger.info(`Vector extension found in schema: ${existingSchema}`);\n }\n }\n } catch (error) {\n this.logger.error('Error setting up vector extension', { error });\n this.vectorExtensionInstalled = undefined;\n this.installVectorExtensionPromise = null;\n throw error;\n } finally {\n this.installVectorExtensionPromise = null;\n }\n })();\n }\n\n await this.installVectorExtensionPromise;\n }\n\n async listIndexes(): Promise<string[]> {\n const client = await this.pool.connect();\n try {\n // Query for tables that match the exact Mastra PgVector table structure:\n // Must have: vector_id (TEXT), embedding (vector or halfvec), metadata (JSONB)\n const mastraTablesQuery = `\n SELECT DISTINCT t.table_name\n FROM information_schema.tables t\n WHERE t.table_schema = $1\n AND EXISTS (\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name = 'vector_id'\n AND c.data_type = 'text'\n )\n AND EXISTS (\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name = 'embedding'\n AND c.udt_name IN ('vector', 'halfvec')\n )\n AND EXISTS (\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name = 'metadata'\n AND c.data_type = 'jsonb'\n );\n `;\n const mastraTables = await client.query(mastraTablesQuery, [this.schema || 'public']);\n return mastraTables.rows.map(row => row.table_name);\n } catch (e) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n },\n e,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<PGIndexStats> {\n const client = await this.pool.connect();\n try {\n const { tableName } = this.getTableName(indexName);\n\n // Check if table exists with a vector or halfvec column\n const tableExistsQuery = `\n SELECT udt_name\n FROM information_schema.columns\n WHERE table_schema = $1\n AND table_name = $2\n AND udt_name IN ('vector', 'halfvec')\n LIMIT 1;\n `;\n const tableExists = await client.query(tableExistsQuery, [this.schema || 'public', indexName]);\n\n if (tableExists.rows.length === 0) {\n throw new Error(`Vector table ${tableName} does not exist`);\n }\n\n // Determine the vector type from the column\n const vectorType: VectorType = tableExists.rows[0].udt_name === 'halfvec' ? 'halfvec' : 'vector';\n\n // Get vector dimension\n const dimensionQuery = `\n SELECT atttypmod as dimension\n FROM pg_attribute\n WHERE attrelid = $1::regclass\n AND attname = 'embedding';\n `;\n\n // Get row count\n const countQuery = `\n SELECT COUNT(*) as count\n FROM ${tableName};\n `;\n\n // Get index metric type\n const indexQuery = `\n SELECT\n am.amname as index_method,\n pg_get_indexdef(i.indexrelid) as index_def,\n opclass.opcname as operator_class\n FROM pg_index i\n JOIN pg_class c ON i.indexrelid = c.oid\n JOIN pg_am am ON c.relam = am.oid\n JOIN pg_opclass opclass ON i.indclass[0] = opclass.oid\n JOIN pg_namespace n ON c.relnamespace = n.oid\n WHERE c.relname = $1\n AND n.nspname = $2;\n `;\n\n const [dimResult, countResult, indexResult] = await Promise.all([\n client.query(dimensionQuery, [tableName]),\n client.query(countQuery),\n client.query(indexQuery, [`${indexName}_vector_idx`, this.schema || 'public']),\n ]);\n\n const { index_method, index_def, operator_class } = indexResult.rows[0] || {\n index_method: 'flat',\n index_def: '',\n operator_class: 'cosine',\n };\n\n // Convert pg_vector index method to our metric type\n const metric = operator_class.includes('l2')\n ? 'euclidean'\n : operator_class.includes('ip')\n ? 'dotproduct'\n : 'cosine';\n\n // Parse index configuration\n const config: { m?: number; efConstruction?: number; lists?: number } = {};\n\n if (index_method === 'hnsw') {\n const m = index_def.match(/m\\s*=\\s*'?(\\d+)'?/)?.[1];\n const efConstruction = index_def.match(/ef_construction\\s*=\\s*'?(\\d+)'?/)?.[1];\n if (m) config.m = parseInt(m);\n if (efConstruction) config.efConstruction = parseInt(efConstruction);\n } else if (index_method === 'ivfflat') {\n const lists = index_def.match(/lists\\s*=\\s*'?(\\d+)'?/)?.[1];\n if (lists) config.lists = parseInt(lists);\n }\n\n return {\n dimension: dimResult.rows[0].dimension,\n count: parseInt(countResult.rows[0].count),\n metric,\n type: index_method as 'flat' | 'hnsw' | 'ivfflat',\n vectorType,\n config,\n };\n } catch (e: any) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n e,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const client = await this.pool.connect();\n try {\n const { tableName } = this.getTableName(indexName);\n // Drop the table\n await client.query(`DROP TABLE IF EXISTS ${tableName} CASCADE`);\n this.createdIndexes.delete(indexName);\n this.indexVectorTypes.delete(indexName);\n this.describeIndexCache.delete(indexName);\n } catch (error: any) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async truncateIndex({ indexName }: DeleteIndexParams): Promise<void> {\n const client = await this.pool.connect();\n try {\n const { tableName } = this.getTableName(indexName);\n await client.query(`TRUNCATE ${tableName}`);\n } catch (e: any) {\n await client.query('ROLLBACK');\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'TRUNCATE_INDEX', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n e,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client.release();\n }\n }\n\n async disconnect() {\n // Wait for cache warmup to complete before closing pool\n // This prevents \"Cannot use a pool after calling end on the pool\" errors\n if (this.cacheWarmupPromise) {\n try {\n await this.cacheWarmupPromise;\n } catch {\n // Ignore errors - we're shutting down anyway\n }\n }\n\n await this.pool.end();\n }\n\n /**\n * Updates a vector by its ID with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n async updateVector({ indexName, id, filter, update }: UpdateVectorParams<PGVectorFilter>): Promise<void> {\n let client;\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n\n // Validate that exactly one of id or filter is provided\n if (!id && !filter) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'NO_TARGET'),\n text: 'Either id or filter must be provided',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (id && filter) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot provide both id and filter - they are mutually exclusive',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n client = await this.pool.connect();\n const { tableName } = this.getTableName(indexName);\n\n // Get the properly qualified vector type for this index\n const indexInfo = await this.getIndexInfo({ indexName });\n const qualifiedVectorType = this.getVectorTypeName(indexInfo.vectorType);\n\n let updateParts = [];\n let values: any[] = [];\n let valueIndex = 1;\n\n // Build SET clause\n if (update.vector) {\n updateParts.push(`embedding = $${valueIndex}::${qualifiedVectorType}`);\n values.push(`[${update.vector.join(',')}]`);\n valueIndex++;\n }\n\n if (update.metadata) {\n updateParts.push(`metadata = $${valueIndex}::jsonb`);\n values.push(JSON.stringify(update.metadata));\n valueIndex++;\n }\n\n if (updateParts.length === 0) {\n return;\n }\n\n let whereClause: string;\n let whereValues: any[];\n\n if (id) {\n // Update by ID\n whereClause = `vector_id = $${valueIndex}`;\n whereValues = [id];\n } else {\n // Update by filter\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n text: 'Cannot update with empty filter',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n\n // Extract WHERE clause (remove \"WHERE\" prefix if present)\n whereClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n\n if (!whereClause) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'INVALID_FILTER'),\n text: 'Filter produced empty WHERE clause',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName, filter: JSON.stringify(filter) },\n });\n }\n\n // Adjust parameter indices for filter values\n whereClause = whereClause.replace(/\\$(\\d+)/g, (match, num) => {\n const newIndex = parseInt(num) + valueIndex - 1;\n return `$${newIndex}`;\n });\n whereValues = filterValues;\n }\n\n const query = `\n UPDATE ${tableName}\n SET ${updateParts.join(', ')}\n WHERE ${whereClause}\n `;\n\n const result = await client.query(query, [...values, ...whereValues]);\n\n this.logger?.info(`Updated ${result.rowCount || 0} vectors in ${indexName}`, {\n indexName,\n id: id ? id : undefined,\n filter: filter ? filter : undefined,\n updatedCount: result.rowCount || 0,\n });\n } catch (error: any) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n ...(filter && { filter: JSON.stringify(filter) }),\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client?.release();\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n let client;\n try {\n client = await this.pool.connect();\n const { tableName } = this.getTableName(indexName);\n const query = `\n DELETE FROM ${tableName}\n WHERE vector_id = $1\n `;\n await client.query(query, [id]);\n } catch (error: any) {\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n id,\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client?.release();\n }\n }\n\n /**\n * Delete vectors matching a metadata filter.\n * @param indexName - The name of the index containing the vectors.\n * @param filter - The filter to match vectors for deletion.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams<PGVectorFilter>): Promise<void> {\n let client;\n try {\n client = await this.pool.connect();\n const { tableName } = this.getTableName(indexName);\n\n // Validate that exactly one of filter or ids is provided\n if (!filter && !ids) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'NO_TARGET'),\n text: 'Either filter or ids must be provided',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (filter && ids) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot provide both filter and ids - they are mutually exclusive',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n let query: string;\n let values: any[];\n\n if (ids) {\n // Delete by IDs\n if (ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'EMPTY_IDS'),\n text: 'Cannot delete with empty ids array',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n const placeholders = ids.map((_: string, i: number) => `$${i + 1}`).join(', ');\n query = `DELETE FROM ${tableName} WHERE vector_id IN (${placeholders})`;\n values = ids;\n } else {\n // Delete by filter\n // Safety check: Don't allow empty filters to prevent accidental deletion of all vectors\n if (!filter || Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n text: 'Cannot delete with empty filter. Use deleteIndex to delete all vectors.',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n // Translate filter using existing infrastructure\n const translatedFilter = this.transformFilter(filter);\n const { sql: filterQuery, values: filterValues } = buildDeleteFilterQuery(translatedFilter);\n\n // Extract WHERE clause (remove \"WHERE\" prefix if present)\n const whereClause = filterQuery.trim().replace(/^WHERE\\s+/i, '');\n\n if (!whereClause) {\n throw new MastraError({\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'INVALID_FILTER'),\n text: 'Filter produced empty WHERE clause',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName, filter: JSON.stringify(filter) },\n });\n }\n\n query = `DELETE FROM ${tableName} WHERE ${whereClause}`;\n values = filterValues;\n }\n\n // Execute the delete query\n const result = await client.query(query, values);\n\n this.logger?.info(`Deleted ${result.rowCount || 0} vectors from ${indexName}`, {\n indexName,\n filter: filter ? filter : undefined,\n ids: ids ? ids : undefined,\n deletedCount: result.rowCount || 0,\n });\n } catch (error: any) {\n // Re-throw MastraErrors as-is\n if (error instanceof MastraError) {\n throw error;\n }\n\n // Wrap other errors\n const mastraError = new MastraError(\n {\n id: createVectorErrorId('PG', 'DELETE_VECTORS', 'FAILED'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n } finally {\n client?.release();\n }\n }\n}\n","import type { Pool, PoolClient, QueryResult } from 'pg';\n\n// Re-export pg types for consumers\nexport type { Pool, PoolClient, QueryResult } from 'pg';\n\n/**\n * Values array for parameterized queries.\n */\nexport type QueryValues = unknown[];\n\n/**\n * Common interface for database clients.\n * PoolAdapter implements this interface by wrapping a pg.Pool.\n */\nexport interface DbClient {\n /**\n * The underlying connection pool.\n */\n readonly $pool: Pool;\n\n /**\n * Acquire a client from the pool for manual query execution.\n * Remember to call client.release() when done.\n */\n connect(): Promise<PoolClient>;\n\n /**\n * Execute a query that returns no data.\n * Use for INSERT, UPDATE, DELETE without RETURNING.\n */\n none(query: string, values?: QueryValues): Promise<null>;\n\n /**\n * Execute a query that returns exactly one row.\n * @throws Error if zero or more than one row is returned\n */\n one<T = any>(query: string, values?: QueryValues): Promise<T>;\n\n /**\n * Execute a query that returns zero or one row.\n * @returns The row, or null if no rows returned\n * @throws Error if more than one row is returned\n */\n oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null>;\n\n /**\n * Execute a query that returns any number of rows (including zero).\n * Alias for manyOrNone.\n */\n any<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n\n /**\n * Execute a query that returns zero or more rows.\n */\n manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n\n /**\n * Execute a query that returns at least one row.\n * @throws Error if no rows are returned\n */\n many<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n\n /**\n * Execute a raw query, returning the full result object.\n */\n query(query: string, values?: QueryValues): Promise<QueryResult>;\n\n /**\n * Execute a function within a transaction.\n * Automatically handles BEGIN, COMMIT, and ROLLBACK.\n */\n tx<T>(callback: (t: TxClient) => Promise<T>): Promise<T>;\n}\n\n/**\n * Transaction client interface for executing queries within a transaction.\n */\nexport interface TxClient {\n none(query: string, values?: QueryValues): Promise<null>;\n one<T = any>(query: string, values?: QueryValues): Promise<T>;\n oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null>;\n any<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n many<T = any>(query: string, values?: QueryValues): Promise<T[]>;\n query(query: string, values?: QueryValues): Promise<QueryResult>;\n /** Execute multiple promises in parallel */\n batch<T>(promises: Promise<T>[]): Promise<T[]>;\n}\n\n/**\n * Truncate a query string for error messages.\n */\nfunction truncateQuery(query: string, maxLength = 100): string {\n const normalized = query.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxLength) {\n return normalized;\n }\n return normalized.slice(0, maxLength) + '...';\n}\n\n/**\n * Adapter that wraps a pg.Pool to implement DbClient.\n */\nexport class PoolAdapter implements DbClient {\n constructor(public readonly $pool: Pool) {}\n\n connect(): Promise<PoolClient> {\n return this.$pool.connect();\n }\n\n async none(query: string, values?: QueryValues): Promise<null> {\n await this.$pool.query(query, values);\n return null;\n }\n\n async one<T = any>(query: string, values?: QueryValues): Promise<T> {\n const result = await this.$pool.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n const result = await this.$pool.query(query, values);\n if (result.rows.length === 0) {\n return null;\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one or none was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.$pool.query(query, values);\n return result.rows as T[];\n }\n\n async manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n return this.any<T>(query, values);\n }\n\n async many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.$pool.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n return result.rows as T[];\n }\n\n async query(query: string, values?: QueryValues): Promise<QueryResult> {\n return this.$pool.query(query, values);\n }\n\n async tx<T>(callback: (t: TxClient) => Promise<T>): Promise<T> {\n const client = await this.$pool.connect();\n try {\n await client.query('BEGIN');\n const txClient = new TransactionClient(client);\n const result = await callback(txClient);\n await client.query('COMMIT');\n return result;\n } catch (error) {\n try {\n await client.query('ROLLBACK');\n } catch (rollbackError) {\n // Log rollback failure but throw original error\n console.error('Transaction rollback failed:', rollbackError);\n }\n throw error;\n } finally {\n client.release();\n }\n }\n}\n\n/**\n * Transaction client that wraps a PoolClient for executing queries within a transaction.\n */\nclass TransactionClient implements TxClient {\n constructor(private readonly client: PoolClient) {}\n\n async none(query: string, values?: QueryValues): Promise<null> {\n await this.client.query(query, values);\n return null;\n }\n\n async one<T = any>(query: string, values?: QueryValues): Promise<T> {\n const result = await this.client.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async oneOrNone<T = any>(query: string, values?: QueryValues): Promise<T | null> {\n const result = await this.client.query(query, values);\n if (result.rows.length === 0) {\n return null;\n }\n if (result.rows.length > 1) {\n throw new Error(`Multiple rows returned when one or none was expected: ${truncateQuery(query)}`);\n }\n return result.rows[0] as T;\n }\n\n async any<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.client.query(query, values);\n return result.rows as T[];\n }\n\n async manyOrNone<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n return this.any<T>(query, values);\n }\n\n async many<T = any>(query: string, values?: QueryValues): Promise<T[]> {\n const result = await this.client.query(query, values);\n if (result.rows.length === 0) {\n throw new Error(`No data returned from query: ${truncateQuery(query)}`);\n }\n return result.rows as T[];\n }\n\n async query(query: string, values?: QueryValues): Promise<QueryResult> {\n return this.client.query(query, values);\n }\n\n async batch<T>(promises: Promise<T>[]): Promise<T[]> {\n return Promise.all(promises);\n }\n}\n","export const POSTGRES_IDENTIFIER_MAX_LENGTH = 63;\n\nexport function truncateIdentifier(value: string, maxLength = POSTGRES_IDENTIFIER_MAX_LENGTH): string {\n if (maxLength <= 0) return '';\n if (Buffer.byteLength(value, 'utf-8') <= maxLength) return value;\n\n let bytes = 0;\n let end = 0;\n for (const ch of value) {\n const chBytes = Buffer.byteLength(ch, 'utf-8');\n if (bytes + chBytes > maxLength) break;\n bytes += chBytes;\n end += ch.length; // surrogate pairs have .length === 2\n }\n return value.slice(0, end);\n}\n\n/**\n * Builds a constraint name with an optional schema prefix, truncated to fit\n * within Postgres' identifier length limit. The result is always lowercased\n * because PostgreSQL folds unquoted identifiers to lowercase when storing them\n * in system catalogs (pg_constraint.conname, pg_indexes.indexname, etc.).\n * Without this normalisation, runtime lookups that compare a mixed-case name\n * against the catalog would silently fail.\n */\nexport function buildConstraintName({\n baseName,\n schemaName,\n maxLength = POSTGRES_IDENTIFIER_MAX_LENGTH,\n}: {\n baseName: string;\n schemaName?: string;\n maxLength?: number;\n}): string {\n const prefix = schemaName ? `${schemaName}_` : '';\n return truncateIdentifier(`${prefix}${baseName}`.toLowerCase(), maxLength);\n}\n","import type { ConnectionOptions } from 'node:tls';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SPANS,\n TABLE_SCHEMAS,\n getSqlType,\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 { parseSqlIdentifier } from '@mastra/core/utils';\nimport { Pool } from 'pg';\nimport type { DbClient } from '../client';\nimport { PoolAdapter } from '../client';\nimport { buildConstraintName } from './constraint-utils';\n\n// Re-export DbClient for external use\nexport type { DbClient } from '../client';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing database client (Pool or PoolAdapter)\n * 2. Config to create a new pool internally\n */\nexport type PgDomainConfig = PgDomainClientConfig | PgDomainPoolConfig | PgDomainRestConfig;\n\n/**\n * Pass an existing database client (DbClient)\n */\nexport interface PgDomainClientConfig {\n /** The database client */\n client: DbClient;\n /** Optional schema name (defaults to 'public') */\n schemaName?: string;\n /** When true, default indexes will not be created during initialization */\n skipDefaultIndexes?: boolean;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n}\n\n/**\n * Pass an existing pg.Pool\n */\nexport interface PgDomainPoolConfig {\n /** Pre-configured pg.Pool */\n pool: Pool;\n /** Optional schema name (defaults to 'public') */\n schemaName?: string;\n /** When true, default indexes will not be created during initialization */\n skipDefaultIndexes?: boolean;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n}\n\n/**\n * Pass config to create a new pg.Pool internally\n */\nexport type PgDomainRestConfig = {\n /** Optional schema name (defaults to 'public') */\n schemaName?: string;\n /** When true, default indexes will not be created during initialization */\n skipDefaultIndexes?: boolean;\n /** Custom indexes to create for this domain's tables */\n indexes?: CreateIndexOptions[];\n} & (\n | {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | ConnectionOptions;\n }\n | {\n connectionString: string;\n ssl?: boolean | ConnectionOptions;\n }\n);\n\n/**\n * Resolves PgDomainConfig to a database client and schema.\n * Handles creating a new pool if config is provided.\n */\nexport function resolvePgConfig(config: PgDomainConfig): {\n client: DbClient;\n schemaName?: string;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n} {\n // Existing client\n if ('client' in config) {\n return {\n client: config.client,\n schemaName: config.schemaName,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n }\n\n // Existing pool\n if ('pool' in config) {\n return {\n client: new PoolAdapter(config.pool),\n schemaName: config.schemaName,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n }\n\n // Config to create new pool\n let pool: Pool;\n if ('connectionString' in config) {\n pool = new Pool({\n connectionString: config.connectionString,\n ssl: config.ssl,\n });\n } else {\n pool = new Pool({\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n });\n }\n\n return {\n client: new PoolAdapter(pool),\n schemaName: config.schemaName,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n}\n\nexport function getSchemaName(schema?: string) {\n return schema ? `\"${parseSqlIdentifier(schema, 'schema name')}\"` : '\"public\"';\n}\n\nexport function getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const quotedIndexName = `\"${parsedIndexName}\"`;\n const quotedSchemaName = schemaName;\n return quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\nfunction mapToSqlType(type: StorageColumn['type']): string {\n switch (type) {\n case 'uuid':\n return 'UUID';\n case 'boolean':\n return 'BOOLEAN';\n default:\n return getSqlType(type);\n }\n}\n\nexport function generateTableSQL({\n tableName,\n schema,\n schemaName,\n compositePrimaryKey,\n includeAllConstraints = false,\n}: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n schemaName?: string;\n compositePrimaryKey?: string[];\n /** When true, includes all constraints in the SQL (for exports). When false, some constraints are added at runtime after data migration. */\n includeAllConstraints?: boolean;\n}): string {\n // Validate composite PK columns exist in schema\n if (compositePrimaryKey) {\n for (const col of compositePrimaryKey) {\n if (!(col in schema)) {\n throw new Error(`compositePrimaryKey column \"${col}\" does not exist in schema for table \"${tableName}\"`);\n }\n }\n }\n\n const compositePKSet = compositePrimaryKey ? new Set(compositePrimaryKey) : null;\n\n const timeZColumns = Object.entries(schema)\n .filter(([_, def]) => def.type === 'timestamp')\n .map(([name]) => {\n const parsedName = parseSqlIdentifier(name, 'column name');\n return `\"${parsedName}Z\" TIMESTAMPTZ DEFAULT NOW()`;\n });\n\n const columns = Object.entries(schema).map(([name, def]) => {\n const parsedName = parseSqlIdentifier(name, 'column name');\n const constraints = [];\n // Skip per-column PRIMARY KEY if column is part of composite PK\n if (def.primaryKey && !compositePKSet?.has(name)) constraints.push('PRIMARY KEY');\n if (!def.nullable) constraints.push('NOT NULL');\n return `\"${parsedName}\" ${mapToSqlType(def.type)} ${constraints.join(' ')}`;\n });\n\n const tableConstraints: string[] = [];\n if (compositePrimaryKey) {\n const pkCols = compositePrimaryKey.map(c => `\"${parseSqlIdentifier(c, 'column name')}\"`).join(', ');\n tableConstraints.push(`PRIMARY KEY (${pkCols})`);\n }\n\n const finalColumns = [...columns, ...timeZColumns, ...tableConstraints].join(',\\n');\n // Sanitize schema name before using it in constraint names to ensure valid SQL identifiers\n const parsedSchemaName = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n // Use the original (long) base name so existing databases that already have\n // the constraint under this name are detected by the IF NOT EXISTS check.\n // buildConstraintName will truncate only when a schema prefix pushes the\n // combined name past the 63-byte Postgres limit.\n const workflowSnapshotConstraint = buildConstraintName({\n baseName: 'mastra_workflow_snapshot_workflow_name_run_id_key',\n schemaName: parsedSchemaName || undefined,\n });\n const spansPrimaryKeyConstraint = buildConstraintName({\n baseName: 'mastra_ai_spans_traceid_spanid_pk',\n schemaName: parsedSchemaName || undefined,\n });\n const quotedSchemaName = getSchemaName(schemaName);\n const schemaFilter = parsedSchemaName || 'public';\n\n const sql = `\n CREATE TABLE IF NOT EXISTS ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })} (\n ${finalColumns}\n );\n ${\n tableName === TABLE_WORKFLOW_SNAPSHOT\n ? `\n DO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = lower('${workflowSnapshotConstraint}') AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${schemaFilter}')\n ) AND NOT EXISTS (\n SELECT 1 FROM pg_indexes WHERE indexname = lower('${workflowSnapshotConstraint}') AND schemaname = '${schemaFilter}'\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n ADD CONSTRAINT ${workflowSnapshotConstraint}\n UNIQUE (workflow_name, run_id);\n END IF;\n END $$;\n `\n : ''\n }\n ${\n // For spans table: Include PRIMARY KEY in exports, but not in runtime (handled after deduplication)\n tableName === TABLE_SPANS && includeAllConstraints\n ? `\n DO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = lower('${spansPrimaryKeyConstraint}') AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = '${schemaFilter}')\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n ADD CONSTRAINT ${spansPrimaryKeyConstraint}\n PRIMARY KEY (\"traceId\", \"spanId\");\n END IF;\n END $$;\n `\n : ''\n }\n `;\n // Note: At runtime, PRIMARY KEY for spans table is added separately after deduplication\n // See PgDB.addSpansPrimaryKey()\n\n return sql;\n}\n\n/**\n * Generates a CREATE INDEX SQL statement from index options.\n * Used by exportSchemas to produce index DDL without a database connection.\n */\nexport function generateIndexSQL(options: CreateIndexOptions, schemaName?: string): string {\n const { name, table, columns, unique = false, where, method = 'btree' } = options;\n\n const quotedSchemaName = getSchemaName(schemaName);\n const fullTableName = getTableName({ indexName: table, schemaName: quotedSchemaName });\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const methodStr = method !== 'btree' ? `USING ${method} ` : '';\n\n const columnsStr = columns\n .map(col => {\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n if (!colName) {\n throw new Error(`Invalid column specification: ${col}`);\n }\n return `\"${parseSqlIdentifier(colName, 'column name')}\" ${modifiers.join(' ')}`;\n }\n return `\"${parseSqlIdentifier(col, 'column name')}\"`;\n })\n .join(', ');\n\n const whereStr = where ? ` WHERE ${where}` : '';\n const quotedIndexName = `\"${parseSqlIdentifier(name, 'index name')}\"`;\n\n return `CREATE ${uniqueStr}INDEX IF NOT EXISTS ${quotedIndexName} ON ${fullTableName} ${methodStr}(${columnsStr})${whereStr};`;\n}\n\n/**\n * Generates the SQL for a timestamp trigger function and trigger on a table.\n * Returns the DDL string without executing it.\n */\nexport function generateTimestampTriggerSQL(tableName: string, schemaName?: string): string {\n const quotedSchemaName = getSchemaName(schemaName);\n const fullTableName = getTableName({ indexName: tableName, schemaName: quotedSchemaName });\n const functionName = `${quotedSchemaName}.trigger_set_timestamps`;\n const triggerName = `\"${parseSqlIdentifier(`${tableName}_timestamps`, 'trigger name')}\"`;\n\n return `CREATE OR REPLACE FUNCTION ${functionName}()\nRETURNS TRIGGER AS $$\nBEGIN\n IF TG_OP = 'INSERT' THEN\n NEW.\"createdAt\" = NOW();\n NEW.\"updatedAt\" = NOW();\n NEW.\"createdAtZ\" = NOW();\n NEW.\"updatedAtZ\" = NOW();\n ELSIF TG_OP = 'UPDATE' THEN\n NEW.\"updatedAt\" = NOW();\n NEW.\"updatedAtZ\" = NOW();\n NEW.\"createdAt\" = OLD.\"createdAt\";\n NEW.\"createdAtZ\" = OLD.\"createdAtZ\";\n END IF;\n RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\nDROP TRIGGER IF EXISTS ${triggerName} ON ${fullTableName};\n\nCREATE TRIGGER ${triggerName}\n BEFORE INSERT OR UPDATE ON ${fullTableName}\n FOR EACH ROW\n EXECUTE FUNCTION ${functionName}();`;\n}\n\n/**\n * Internal config for PgDB - accepts already-resolved client\n */\nexport interface PgDBInternalConfig {\n client: DbClient;\n schemaName?: string;\n skipDefaultIndexes?: boolean;\n}\n\n// Static map to track schema setup across all PgDB instances\n// Key: schemaName, Value: { promise, complete }\n// This prevents race conditions when multiple domains try to create the same schema concurrently\nconst schemaSetupRegistry = new Map<string, { promise: Promise<void> | null; complete: boolean }>();\n\nexport class PgDB extends MastraBase {\n public client: DbClient;\n public schemaName?: string;\n public skipDefaultIndexes?: boolean;\n\n constructor(config: PgDBInternalConfig) {\n super({\n component: 'STORAGE',\n name: 'PG_DB_LAYER',\n });\n\n this.client = config.client;\n this.schemaName = config.schemaName;\n this.skipDefaultIndexes = config.skipDefaultIndexes;\n }\n\n async hasColumn(table: string, column: string): Promise<boolean> {\n const schema = this.schemaName || 'public';\n\n const result = await this.client.oneOrNone(\n `SELECT 1 FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2 AND (column_name = $3 OR column_name = $4)`,\n [schema, table, column, column.toLowerCase()],\n );\n\n return !!result;\n }\n\n /**\n * Prepares values for insertion, handling JSONB columns by stringifying them\n */\n private prepareValuesForInsert(record: Record<string, any>, tableName: TABLE_NAMES): any[] {\n return Object.entries(record).map(([key, value]) => {\n const schema = TABLE_SCHEMAS[tableName];\n const columnSchema = schema?.[key];\n\n if (columnSchema?.type === 'jsonb' && value !== null && value !== undefined) {\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n /**\n * Adds timestamp Z columns to a record if timestamp columns exist\n */\n private addTimestampZColumns(record: Record<string, any>): void {\n if (record.createdAt) {\n record.createdAtZ = record.createdAt;\n }\n if (record.created_at) {\n record.created_atZ = record.created_at;\n }\n if (record.updatedAt) {\n record.updatedAtZ = record.updatedAt;\n }\n }\n\n /**\n * Prepares a value for database operations\n */\n private prepareValue(value: any, columnName: string, tableName: TABLE_NAMES): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n const schema = TABLE_SCHEMAS[tableName];\n const columnSchema = schema?.[columnName];\n\n if (columnSchema?.type === 'jsonb') {\n return JSON.stringify(value);\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return value;\n }\n\n private async setupSchema() {\n if (!this.schemaName) {\n return;\n }\n\n // Use static registry to coordinate schema setup across all PgDB instances\n let registryEntry = schemaSetupRegistry.get(this.schemaName);\n if (registryEntry?.complete) {\n return;\n }\n\n const quotedSchemaName = getSchemaName(this.schemaName);\n\n if (!registryEntry?.promise) {\n const schemaNameCapture = this.schemaName;\n const setupPromise = (async () => {\n try {\n const schemaExists = await this.client.oneOrNone(\n `\n SELECT EXISTS (\n SELECT 1 FROM information_schema.schemata\n WHERE schema_name = $1\n )\n `,\n [schemaNameCapture],\n );\n\n if (!schemaExists?.exists) {\n try {\n await this.client.none(`CREATE SCHEMA IF NOT EXISTS ${quotedSchemaName}`);\n this.logger.info(`Schema \"${schemaNameCapture}\" created successfully`);\n } catch (error) {\n this.logger.error(`Failed to create schema \"${schemaNameCapture}\"`, { error });\n throw new Error(\n `Unable to create schema \"${schemaNameCapture}\". This requires CREATE privilege on the database. ` +\n `Either create the schema manually or grant CREATE privilege to the user.`,\n );\n }\n }\n\n // Mark as complete in the registry\n const entry = schemaSetupRegistry.get(schemaNameCapture);\n if (entry) {\n entry.complete = true;\n }\n this.logger.debug(`Schema \"${quotedSchemaName}\" is ready for use`);\n } catch (error) {\n // On error, clear the registry entry so retry is possible\n schemaSetupRegistry.delete(schemaNameCapture);\n throw error;\n }\n })();\n\n // Register the promise immediately so concurrent callers can await it\n schemaSetupRegistry.set(this.schemaName, { promise: setupPromise, complete: false });\n registryEntry = schemaSetupRegistry.get(this.schemaName);\n }\n\n await registryEntry!.promise;\n }\n\n protected getDefaultValue(type: StorageColumn['type']): string {\n switch (type) {\n case 'timestamp':\n return 'DEFAULT NOW()';\n case 'jsonb':\n return \"DEFAULT '{}'::jsonb\";\n default:\n return getDefaultValue(type);\n }\n }\n\n async insert({ tableName, record }: { tableName: TABLE_NAMES; record: Record<string, any> }): Promise<void> {\n try {\n this.addTimestampZColumns(record);\n\n const schemaName = getSchemaName(this.schemaName);\n const columns = Object.keys(record).map(col => parseSqlIdentifier(col, 'column name'));\n const values = this.prepareValuesForInsert(record, tableName);\n const placeholders = values.map((_, i) => `$${i + 1}`).join(', ');\n const fullTableName = getTableName({ indexName: tableName, schemaName });\n const columnList = columns.map(c => `\"${c}\"`).join(', ');\n\n // For spans table, use ON CONFLICT to handle duplicate (traceId, spanId) gracefully\n if (tableName === TABLE_SPANS) {\n // Build update clause for all columns except the primary key columns\n const updateColumns = columns.filter(c => c !== 'traceId' && c !== 'spanId');\n\n if (updateColumns.length > 0) {\n const updateClause = updateColumns.map(c => `\"${c}\" = EXCLUDED.\"${c}\"`).join(', ');\n await this.client.none(\n `INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})\n ON CONFLICT (\"traceId\", \"spanId\") DO UPDATE SET ${updateClause}`,\n values,\n );\n } else {\n // Only PK columns provided - use DO NOTHING to avoid invalid SQL\n await this.client.none(\n `INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})\n ON CONFLICT (\"traceId\", \"spanId\") DO NOTHING`,\n values,\n );\n }\n } else {\n await this.client.none(`INSERT INTO ${fullTableName} (${columnList}) VALUES (${placeholders})`, values);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async clearTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const schemaName = getSchemaName(this.schemaName);\n const tableNameWithSchema = getTableName({ indexName: tableName, schemaName });\n\n // Check if table exists before truncating (handles case where init failed)\n const tableExists = await this.client.oneOrNone<{ exists: boolean }>(\n `SELECT EXISTS (\n SELECT 1 FROM information_schema.tables\n WHERE table_schema = $1 AND table_name = $2\n )`,\n [this.schemaName || 'public', tableName],\n );\n\n if (tableExists?.exists) {\n await this.client.none(`TRUNCATE TABLE ${tableNameWithSchema} CASCADE`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CLEAR_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async createTable({\n tableName,\n schema,\n compositePrimaryKey,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n compositePrimaryKey?: string[];\n }): Promise<void> {\n try {\n const timeZColumnNames = Object.entries(schema)\n .filter(([_, def]) => def.type === 'timestamp')\n .map(([name]) => name);\n\n if (this.schemaName) {\n await this.setupSchema();\n }\n\n const sql = generateTableSQL({ tableName, schema, schemaName: this.schemaName, compositePrimaryKey });\n\n await this.client.none(sql);\n\n await this.alterTable({\n tableName,\n schema,\n ifNotExists: timeZColumnNames,\n });\n\n // Set up timestamp triggers and run migrations for Spans table\n if (tableName === TABLE_SPANS) {\n await this.setupTimestampTriggers(tableName);\n await this.migrateSpansTable();\n\n // Check if PRIMARY KEY constraint already exists - if so, skip migration\n // This avoids running expensive queries on every init after migration is complete\n const pkExists = await this.spansPrimaryKeyExists();\n if (!pkExists) {\n // Check for duplicates before attempting to add PRIMARY KEY\n const duplicateInfo = await this.checkForDuplicateSpans();\n if (duplicateInfo.hasDuplicates) {\n // Duplicates exist - throw error requiring manual migration\n const errorMessage =\n `\\n` +\n `===========================================================================\\n` +\n `MIGRATION REQUIRED: Duplicate spans detected in ${duplicateInfo.tableName}\\n` +\n `===========================================================================\\n` +\n `\\n` +\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations.\\n` +\n `\\n` +\n `The spans table requires a unique constraint on (traceId, spanId), but your\\n` +\n `database contains duplicate entries that must be resolved first.\\n` +\n `\\n` +\n `To fix this, run the manual migration command:\\n` +\n `\\n` +\n ` npx mastra migrate\\n` +\n `\\n` +\n `This command will:\\n` +\n ` 1. Remove duplicate spans (keeping the most complete/recent version)\\n` +\n ` 2. Add the required unique constraint\\n` +\n `\\n` +\n `Note: This migration may take some time for large tables.\\n` +\n `===========================================================================\\n`;\n\n throw new MastraError({\n id: createStorageErrorId('PG', 'MIGRATION_REQUIRED', 'DUPLICATE_SPANS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: errorMessage,\n });\n } else {\n // No duplicates - safe to add PRIMARY KEY directly\n await this.addSpansPrimaryKey();\n }\n }\n }\n } catch (error) {\n // Rethrow MastraError directly to preserve structured error IDs (e.g., MIGRATION_REQUIRED::DUPLICATE_SPANS)\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n private async setupTimestampTriggers(tableName: TABLE_NAMES): Promise<void> {\n const fullTableName = getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) });\n\n try {\n const triggerSQL = generateTimestampTriggerSQL(tableName, this.schemaName);\n await this.client.none(triggerSQL);\n this.logger?.debug?.(`Set up timestamp triggers for table ${fullTableName}`);\n } catch (error) {\n this.logger?.warn?.(`Failed to set up timestamp triggers for ${fullTableName}:`, error);\n }\n }\n\n /**\n * Migrates the spans table schema from OLD_SPAN_SCHEMA to current SPAN_SCHEMA.\n * This adds new columns that don't exist in old schema.\n */\n private async migrateSpansTable(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n const schema = TABLE_SCHEMAS[TABLE_SPANS];\n\n try {\n // Add any columns from current schema that don't exist in the database\n for (const [columnName, columnDef] of Object.entries(schema)) {\n const columnExists = await this.hasColumn(TABLE_SPANS, columnName);\n if (!columnExists) {\n const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n const sqlType = mapToSqlType(columnDef.type);\n // Align with createTable: nullable columns omit NOT NULL, non-nullable columns include it\n const nullable = columnDef.nullable ? '' : 'NOT NULL';\n const defaultValue = !columnDef.nullable ? this.getDefaultValue(columnDef.type) : '';\n const alterSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n await this.client.none(alterSql);\n this.logger?.debug?.(`Added column '${columnName}' to ${fullTableName}`);\n\n // For timestamp columns, also add the timezone-aware version\n // This matches the behavior in alterTable()\n if (sqlType === 'TIMESTAMP') {\n const timestampZSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}Z\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n await this.client.none(timestampZSql);\n this.logger?.debug?.(`Added timezone column '${columnName}Z' to ${fullTableName}`);\n }\n }\n }\n\n // Also add timezone columns for any existing timestamp columns that don't have them yet\n // This handles the case where timestamp columns existed but their *Z counterparts don't\n for (const [columnName, columnDef] of Object.entries(schema)) {\n if (columnDef.type === 'timestamp') {\n const tzColumnName = `${columnName}Z`;\n const tzColumnExists = await this.hasColumn(TABLE_SPANS, tzColumnName);\n if (!tzColumnExists) {\n const parsedTzColumnName = parseSqlIdentifier(tzColumnName, 'column name');\n const timestampZSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedTzColumnName}\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n await this.client.none(timestampZSql);\n this.logger?.debug?.(`Added timezone column '${tzColumnName}' to ${fullTableName}`);\n }\n }\n }\n\n this.logger?.info?.(`Migration completed for ${fullTableName}`);\n } catch (error) {\n // Log warning but don't fail - migrations should be best-effort\n this.logger?.warn?.(`Failed to migrate spans table ${fullTableName}:`, error);\n }\n }\n\n /**\n * Deduplicates spans in the mastra_ai_spans table before adding the PRIMARY KEY constraint.\n * Keeps spans based on priority: completed (endedAt NOT NULL) > most recent updatedAt > most recent createdAt.\n *\n * Note: This prioritizes migration completion over perfect data preservation.\n * Old trace data may be lost, which is acceptable for this use case.\n */\n private async deduplicateSpans(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n try {\n // Quick check: are there any duplicates at all? Use LIMIT 1 for speed on large tables.\n const duplicateCheck = await this.client.oneOrNone<{ has_duplicates: boolean }>(`\n SELECT EXISTS (\n SELECT 1\n FROM ${fullTableName}\n GROUP BY \"traceId\", \"spanId\"\n HAVING COUNT(*) > 1\n LIMIT 1\n ) as has_duplicates\n `);\n\n if (!duplicateCheck?.has_duplicates) {\n this.logger?.debug?.(`No duplicate spans found in ${fullTableName}`);\n return;\n }\n\n this.logger?.info?.(`Duplicate spans detected in ${fullTableName}, starting deduplication...`);\n\n // Delete duplicates directly without fetching details into memory.\n // This avoids OOM issues on large tables with many duplicates.\n // Priority: completed spans (endedAt NOT NULL) > most recent updatedAt > most recent createdAt\n // Uses ctid (physical row id) as final tiebreaker for deterministic results.\n const result = await this.client.query(`\n DELETE FROM ${fullTableName} t1\n USING ${fullTableName} t2\n WHERE t1.\"traceId\" = t2.\"traceId\"\n AND t1.\"spanId\" = t2.\"spanId\"\n AND (\n -- Keep completed spans over incomplete\n (t1.\"endedAt\" IS NULL AND t2.\"endedAt\" IS NOT NULL)\n OR\n -- If both have same completion status, keep more recent updatedAt\n (\n (t1.\"endedAt\" IS NULL) = (t2.\"endedAt\" IS NULL)\n AND (\n (t1.\"updatedAt\" < t2.\"updatedAt\")\n OR (t1.\"updatedAt\" IS NULL AND t2.\"updatedAt\" IS NOT NULL)\n OR\n -- If updatedAt is the same, keep more recent createdAt\n (\n (t1.\"updatedAt\" = t2.\"updatedAt\" OR (t1.\"updatedAt\" IS NULL AND t2.\"updatedAt\" IS NULL))\n AND (\n (t1.\"createdAt\" < t2.\"createdAt\")\n OR (t1.\"createdAt\" IS NULL AND t2.\"createdAt\" IS NOT NULL)\n OR\n -- If all else equal, use ctid as tiebreaker\n (\n (t1.\"createdAt\" = t2.\"createdAt\" OR (t1.\"createdAt\" IS NULL AND t2.\"createdAt\" IS NULL))\n AND t1.ctid < t2.ctid\n )\n )\n )\n )\n )\n )\n `);\n\n this.logger?.info?.(\n `Deduplication complete: removed ${result.rowCount ?? 0} duplicate spans from ${fullTableName}`,\n );\n } catch (error) {\n // Re-throw deduplication errors so PRIMARY KEY addition will fail with a clear error\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DEDUPLICATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: TABLE_SPANS,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Checks for duplicate (traceId, spanId) combinations in the spans table.\n * Returns information about duplicates for logging/CLI purposes.\n */\n private async checkForDuplicateSpans(): Promise<{\n hasDuplicates: boolean;\n duplicateCount: number;\n tableName: string;\n }> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n try {\n // Count duplicate (traceId, spanId) combinations\n const result = await this.client.oneOrNone<{ duplicate_count: string }>(`\n SELECT COUNT(*) as duplicate_count\n FROM (\n SELECT \"traceId\", \"spanId\"\n FROM ${fullTableName}\n GROUP BY \"traceId\", \"spanId\"\n HAVING COUNT(*) > 1\n ) duplicates\n `);\n\n const duplicateCount = parseInt(result?.duplicate_count ?? '0', 10);\n return {\n hasDuplicates: duplicateCount > 0,\n duplicateCount,\n tableName: fullTableName,\n };\n } catch (error) {\n // If table doesn't exist or other error, assume no duplicates\n this.logger?.debug?.(`Could not check for duplicates: ${error}`);\n return { hasDuplicates: false, duplicateCount: 0, tableName: fullTableName };\n }\n }\n\n /**\n * Checks if the PRIMARY KEY constraint on (traceId, spanId) already exists on the spans table.\n * Used to skip deduplication when the constraint already exists (migration already complete).\n */\n private async spansPrimaryKeyExists(): Promise<boolean> {\n const parsedSchemaName = this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : '';\n const constraintName = buildConstraintName({\n baseName: 'mastra_ai_spans_traceid_spanid_pk',\n schemaName: parsedSchemaName || undefined,\n });\n const schemaFilter = this.schemaName || 'public';\n\n const result = await this.client.oneOrNone<{ exists: boolean }>(\n `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = lower($1) AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = $2)) as exists`,\n [constraintName, schemaFilter],\n );\n\n return result?.exists ?? false;\n }\n\n /**\n * Adds the PRIMARY KEY constraint on (traceId, spanId) to the spans table.\n * Should be called AFTER deduplication to ensure no duplicate key violations.\n */\n private async addSpansPrimaryKey(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n const parsedSchemaName = this.schemaName ? parseSqlIdentifier(this.schemaName, 'schema name') : '';\n const constraintName = buildConstraintName({\n baseName: 'mastra_ai_spans_traceid_spanid_pk',\n schemaName: parsedSchemaName || undefined,\n });\n const schemaFilter = this.schemaName || 'public';\n\n try {\n // Check if the constraint already exists\n const constraintExists = await this.client.oneOrNone<{ exists: boolean }>(\n `\n SELECT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = lower($1) AND connamespace = (SELECT oid FROM pg_namespace WHERE nspname = $2)\n ) as exists\n `,\n [constraintName, schemaFilter],\n );\n\n if (constraintExists?.exists) {\n this.logger?.debug?.(`PRIMARY KEY constraint ${constraintName} already exists on ${fullTableName}`);\n return;\n }\n\n // Add the PRIMARY KEY constraint\n await this.client.none(`\n ALTER TABLE ${fullTableName}\n ADD CONSTRAINT ${constraintName}\n PRIMARY KEY (\"traceId\", \"spanId\")\n `);\n\n this.logger?.info?.(`Added PRIMARY KEY constraint ${constraintName} to ${fullTableName}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'ADD_SPANS_PRIMARY_KEY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName: TABLE_SPANS,\n constraintName,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n\n // Check if already migrated\n const pkExists = await this.spansPrimaryKeyExists();\n if (pkExists) {\n return {\n success: true,\n alreadyMigrated: true,\n duplicatesRemoved: 0,\n message: `Migration already complete. PRIMARY KEY constraint exists on ${fullTableName}.`,\n };\n }\n\n // Check for duplicates\n const duplicateInfo = await this.checkForDuplicateSpans();\n\n if (duplicateInfo.hasDuplicates) {\n this.logger?.info?.(\n `Found ${duplicateInfo.duplicateCount} duplicate (traceId, spanId) combinations. Starting deduplication...`,\n );\n\n // Run deduplication\n await this.deduplicateSpans();\n } else {\n this.logger?.info?.(`No duplicate spans found.`);\n }\n\n // Add PRIMARY KEY constraint\n await this.addSpansPrimaryKey();\n\n return {\n success: true,\n alreadyMigrated: false,\n duplicatesRemoved: duplicateInfo.duplicateCount,\n message: duplicateInfo.hasDuplicates\n ? `Migration complete. Removed duplicates and added PRIMARY KEY constraint to ${fullTableName}.`\n : `Migration complete. Added PRIMARY KEY constraint to ${fullTableName}.`,\n };\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n const fullTableName = getTableName({ indexName: TABLE_SPANS, schemaName: getSchemaName(this.schemaName) });\n const pkExists = await this.spansPrimaryKeyExists();\n\n if (pkExists) {\n return {\n needsMigration: false,\n hasDuplicates: false,\n duplicateCount: 0,\n constraintExists: true,\n tableName: fullTableName,\n };\n }\n\n const duplicateInfo = await this.checkForDuplicateSpans();\n return {\n needsMigration: true,\n hasDuplicates: duplicateInfo.hasDuplicates,\n duplicateCount: duplicateInfo.duplicateCount,\n constraintExists: false,\n tableName: fullTableName,\n };\n }\n\n /**\n * Alters table schema to add columns if they don't exist\n * @param tableName Name of the table\n * @param schema Schema of the table\n * @param ifNotExists Array of column names to add if they don't exist\n */\n async alterTable({\n tableName,\n schema,\n ifNotExists,\n }: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n ifNotExists: string[];\n }): Promise<void> {\n const fullTableName = getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) });\n\n try {\n for (const columnName of ifNotExists) {\n if (schema[columnName]) {\n const columnDef = schema[columnName];\n const parsedColumnName = parseSqlIdentifier(columnName, 'column name');\n const sqlType = mapToSqlType(columnDef.type);\n // Align with createTable: nullable columns omit NOT NULL, non-nullable columns include it\n const nullable = columnDef.nullable ? '' : 'NOT NULL';\n const defaultValue = !columnDef.nullable ? this.getDefaultValue(columnDef.type) : '';\n const alterSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}\" ${sqlType} ${nullable} ${defaultValue}`.trim();\n\n await this.client.none(alterSql);\n\n if (sqlType === 'TIMESTAMP') {\n const timestampZSql =\n `ALTER TABLE ${fullTableName} ADD COLUMN IF NOT EXISTS \"${parsedColumnName}Z\" TIMESTAMPTZ DEFAULT NOW()`.trim();\n await this.client.none(timestampZSql);\n }\n\n this.logger?.debug?.(`Ensured column ${parsedColumnName} exists in table ${fullTableName}`);\n }\n }\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'ALTER_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async load<R>({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, string> }): Promise<R | null> {\n try {\n const keyEntries = Object.entries(keys).map(([key, value]) => [parseSqlIdentifier(key, 'column name'), value]);\n const conditions = keyEntries.map(([key], index) => `\"${key}\" = $${index + 1}`).join(' AND ');\n const values = keyEntries.map(([_, value]) => value);\n\n const result = await this.client.oneOrNone<R>(\n `SELECT * FROM ${getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) })} WHERE ${conditions} ORDER BY \"createdAt\" DESC LIMIT 1`,\n values,\n );\n\n if (!result) {\n return null;\n }\n\n if (tableName === TABLE_WORKFLOW_SNAPSHOT) {\n const snapshot = result as any;\n if (typeof snapshot.snapshot === 'string') {\n snapshot.snapshot = JSON.parse(snapshot.snapshot);\n }\n return snapshot;\n }\n\n return result;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LOAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async batchInsert({ tableName, records }: { tableName: TABLE_NAMES; records: Record<string, any>[] }): Promise<void> {\n try {\n await this.client.query('BEGIN');\n for (const record of records) {\n await this.insert({ tableName, record });\n }\n await this.client.query('COMMIT');\n } catch (error) {\n await this.client.query('ROLLBACK');\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_INSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n numberOfRecords: records.length,\n },\n },\n error,\n );\n }\n }\n\n async dropTable({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n try {\n const schemaName = getSchemaName(this.schemaName);\n const tableNameWithSchema = getTableName({ indexName: tableName, schemaName });\n await this.client.none(`DROP TABLE IF EXISTS ${tableNameWithSchema}`);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DROP_TABLE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async createIndex(options: CreateIndexOptions): Promise<void> {\n try {\n const {\n name,\n table,\n columns,\n unique = false,\n concurrent = true,\n where,\n method = 'btree',\n opclass,\n storage,\n tablespace,\n } = options;\n\n const schemaName = this.schemaName || 'public';\n const fullTableName = getTableName({\n indexName: table as TABLE_NAMES,\n schemaName: getSchemaName(this.schemaName),\n });\n\n const indexExists = await this.client.oneOrNone(\n `SELECT 1 FROM pg_indexes\n WHERE indexname = $1\n AND schemaname = $2`,\n [name, schemaName],\n );\n\n if (indexExists) {\n return;\n }\n\n const uniqueStr = unique ? 'UNIQUE ' : '';\n const concurrentStr = concurrent ? 'CONCURRENTLY ' : '';\n const methodStr = method !== 'btree' ? `USING ${method} ` : '';\n\n const columnsStr = columns\n .map(col => {\n if (col.includes(' DESC') || col.includes(' ASC')) {\n const [colName, ...modifiers] = col.split(' ');\n if (!colName) {\n throw new Error(`Invalid column specification: ${col}`);\n }\n const quotedCol = `\"${parseSqlIdentifier(colName, 'column name')}\" ${modifiers.join(' ')}`;\n return opclass ? `${quotedCol} ${opclass}` : quotedCol;\n }\n const quotedCol = `\"${parseSqlIdentifier(col, 'column name')}\"`;\n return opclass ? `${quotedCol} ${opclass}` : quotedCol;\n })\n .join(', ');\n\n const whereStr = where ? ` WHERE ${where}` : '';\n const tablespaceStr = tablespace ? ` TABLESPACE ${tablespace}` : '';\n\n let withStr = '';\n if (storage && Object.keys(storage).length > 0) {\n const storageParams = Object.entries(storage)\n .map(([key, value]) => `${key} = ${value}`)\n .join(', ');\n withStr = ` WITH (${storageParams})`;\n }\n\n const quotedIndexName = `\"${parseSqlIdentifier(name, 'index name')}\"`;\n const sql = `CREATE ${uniqueStr}INDEX ${concurrentStr}${quotedIndexName} ON ${fullTableName} ${methodStr}(${columnsStr})${withStr}${tablespaceStr}${whereStr}`;\n\n await this.client.none(sql);\n } catch (error) {\n if (error instanceof Error && error.message.includes('CONCURRENTLY')) {\n const retryOptions = { ...options, concurrent: false };\n return this.createIndex(retryOptions);\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_CREATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName: options.name,\n tableName: options.table,\n },\n },\n error,\n );\n }\n }\n\n async dropIndex(indexName: string): Promise<void> {\n try {\n const schemaName = this.schemaName || 'public';\n const indexExists = await this.client.oneOrNone(\n `SELECT 1 FROM pg_indexes\n WHERE indexname = $1\n AND schemaname = $2`,\n [indexName, schemaName],\n );\n\n if (!indexExists) {\n return;\n }\n\n const quotedIndexName = `\"${parseSqlIdentifier(indexName, 'index name')}\"`;\n const sql = `DROP INDEX IF EXISTS ${getSchemaName(this.schemaName)}.${quotedIndexName}`;\n await this.client.none(sql);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_DROP', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async listIndexes(tableName?: string): Promise<IndexInfo[]> {\n try {\n const schemaName = this.schemaName || 'public';\n\n let query: string;\n let params: any[];\n\n if (tableName) {\n query = `\n SELECT\n i.indexname as name,\n i.tablename as table,\n i.indexdef as definition,\n ix.indisunique as is_unique,\n pg_size_pretty(pg_relation_size(c.oid)) as size,\n array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) as columns\n FROM pg_indexes i\n JOIN pg_class c ON c.relname = i.indexname AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = i.schemaname)\n JOIN pg_index ix ON ix.indexrelid = c.oid\n JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = ANY(ix.indkey)\n WHERE i.schemaname = $1\n AND i.tablename = $2\n GROUP BY i.indexname, i.tablename, i.indexdef, ix.indisunique, c.oid\n `;\n params = [schemaName, tableName];\n } else {\n query = `\n SELECT\n i.indexname as name,\n i.tablename as table,\n i.indexdef as definition,\n ix.indisunique as is_unique,\n pg_size_pretty(pg_relation_size(c.oid)) as size,\n array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) as columns\n FROM pg_indexes i\n JOIN pg_class c ON c.relname = i.indexname AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = i.schemaname)\n JOIN pg_index ix ON ix.indexrelid = c.oid\n JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = ANY(ix.indkey)\n WHERE i.schemaname = $1\n GROUP BY i.indexname, i.tablename, i.indexdef, ix.indisunique, c.oid\n `;\n params = [schemaName];\n }\n\n const results = await this.client.manyOrNone(query, params);\n\n return results.map(row => {\n let columns: string[] = [];\n if (typeof row.columns === 'string' && row.columns.startsWith('{') && row.columns.endsWith('}')) {\n const arrayContent = row.columns.slice(1, -1);\n columns = arrayContent ? arrayContent.split(',') : [];\n } else if (Array.isArray(row.columns)) {\n columns = row.columns;\n }\n\n return {\n name: row.name,\n table: row.table,\n columns,\n unique: row.is_unique || false,\n size: row.size || '0',\n definition: row.definition || '',\n };\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_LIST', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: tableName\n ? {\n tableName,\n }\n : {},\n },\n error,\n );\n }\n }\n\n async describeIndex(indexName: string): Promise<StorageIndexStats> {\n try {\n const schemaName = this.schemaName || 'public';\n\n const query = `\n SELECT\n i.indexname as name,\n i.tablename as table,\n i.indexdef as definition,\n ix.indisunique as is_unique,\n pg_size_pretty(pg_relation_size(c.oid)) as size,\n array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) as columns,\n am.amname as method,\n s.idx_scan as scans,\n s.idx_tup_read as tuples_read,\n s.idx_tup_fetch as tuples_fetched\n FROM pg_indexes i\n JOIN pg_class c ON c.relname = i.indexname AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = i.schemaname)\n JOIN pg_index ix ON ix.indexrelid = c.oid\n JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = ANY(ix.indkey)\n JOIN pg_am am ON c.relam = am.oid\n LEFT JOIN pg_stat_user_indexes s ON s.indexrelname = i.indexname AND s.schemaname = i.schemaname\n WHERE i.schemaname = $1\n AND i.indexname = $2\n GROUP BY i.indexname, i.tablename, i.indexdef, ix.indisunique, c.oid, am.amname, s.idx_scan, s.idx_tup_read, s.idx_tup_fetch\n `;\n\n const result = await this.client.oneOrNone(query, [schemaName, indexName]);\n\n if (!result) {\n throw new Error(`Index \"${indexName}\" not found in schema \"${schemaName}\"`);\n }\n\n let columns: string[] = [];\n if (typeof result.columns === 'string' && result.columns.startsWith('{') && result.columns.endsWith('}')) {\n const arrayContent = result.columns.slice(1, -1);\n columns = arrayContent ? arrayContent.split(',') : [];\n } else if (Array.isArray(result.columns)) {\n columns = result.columns;\n }\n\n return {\n name: result.name,\n table: result.table,\n columns,\n unique: result.is_unique || false,\n size: result.size || '0',\n definition: result.definition || '',\n method: result.method || 'btree',\n scans: parseInt(String(result.scans)) || 0,\n tuples_read: parseInt(String(result.tuples_read)) || 0,\n tuples_fetched: parseInt(String(result.tuples_fetched)) || 0,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INDEX_DESCRIBE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async update({\n tableName,\n keys,\n data,\n }: {\n tableName: TABLE_NAMES;\n keys: Record<string, any>;\n data: Record<string, any>;\n }): Promise<void> {\n try {\n const setColumns: string[] = [];\n const setValues: any[] = [];\n let paramIndex = 1;\n\n Object.entries(data).forEach(([key, value]) => {\n const parsedKey = parseSqlIdentifier(key, 'column name');\n setColumns.push(`\"${parsedKey}\" = $${paramIndex++}`);\n setValues.push(this.prepareValue(value, key, tableName));\n });\n\n const whereConditions: string[] = [];\n const whereValues: any[] = [];\n\n Object.entries(keys).forEach(([key, value]) => {\n const parsedKey = parseSqlIdentifier(key, 'column name');\n whereConditions.push(`\"${parsedKey}\" = $${paramIndex++}`);\n whereValues.push(this.prepareValue(value, key, tableName));\n });\n\n const tableName_ = getTableName({\n indexName: tableName,\n schemaName: getSchemaName(this.schemaName),\n });\n\n const sql = `UPDATE ${tableName_} SET ${setColumns.join(', ')} WHERE ${whereConditions.join(' AND ')}`;\n const values = [...setValues, ...whereValues];\n\n await this.client.none(sql, values);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n },\n },\n error,\n );\n }\n }\n\n async batchUpdate({\n tableName,\n updates,\n }: {\n tableName: TABLE_NAMES;\n updates: Array<{\n keys: Record<string, any>;\n data: Record<string, any>;\n }>;\n }): Promise<void> {\n try {\n await this.client.query('BEGIN');\n for (const { keys, data } of updates) {\n await this.update({ tableName, keys, data });\n }\n await this.client.query('COMMIT');\n } catch (error) {\n await this.client.query('ROLLBACK');\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_UPDATE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n numberOfRecords: updates.length,\n },\n },\n error,\n );\n }\n }\n\n async batchDelete({ tableName, keys }: { tableName: TABLE_NAMES; keys: Record<string, any>[] }): Promise<void> {\n try {\n if (keys.length === 0) {\n return;\n }\n\n const tableName_ = getTableName({\n indexName: tableName,\n schemaName: getSchemaName(this.schemaName),\n });\n\n await this.client.tx(async t => {\n for (const keySet of keys) {\n const conditions: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n Object.entries(keySet).forEach(([key, value]) => {\n const parsedKey = parseSqlIdentifier(key, 'column name');\n conditions.push(`\"${parsedKey}\" = $${paramIndex++}`);\n values.push(value);\n });\n\n const sql = `DELETE FROM ${tableName_} WHERE ${conditions.join(' AND ')}`;\n await t.none(sql, values);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_DELETE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n tableName,\n numberOfRecords: keys.length,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Delete all data from a table (alias for clearTable for consistency with other stores)\n */\n async deleteData({ tableName }: { tableName: TABLE_NAMES }): Promise<void> {\n return this.clearTable({ tableName });\n }\n}\n","import type { StorageColumn, TABLE_NAMES } from '@mastra/core/storage';\nimport { TABLE_SCHEMAS } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\n\nexport function getSchemaName(schema?: string) {\n return schema ? `\"${parseSqlIdentifier(schema, 'schema name')}\"` : undefined;\n}\n\nexport function getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const parsedIndexName = parseSqlIdentifier(indexName, 'index name');\n const quotedIndexName = `\"${parsedIndexName}\"`;\n const quotedSchemaName = schemaName;\n return quotedSchemaName ? `${quotedSchemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * Prepare WHERE clause for PostgreSQL queries\n */\nexport function prepareWhereClause(\n filters: Record<string, any>,\n _schema?: Record<string, StorageColumn>,\n): { sql: string; args: any[] } {\n const conditions: string[] = [];\n const args: any[] = [];\n let paramIndex = 1;\n\n Object.entries(filters).forEach(([key, value]) => {\n if (value === undefined) return;\n\n // Handle special operators\n if (key.endsWith('_gte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`\"${parseSqlIdentifier(fieldName, 'field name')}\" >= $${paramIndex++}`);\n args.push(value instanceof Date ? value.toISOString() : value);\n } else if (key.endsWith('_lte')) {\n const fieldName = key.slice(0, -4);\n conditions.push(`\"${parseSqlIdentifier(fieldName, 'field name')}\" <= $${paramIndex++}`);\n args.push(value instanceof Date ? value.toISOString() : value);\n } else if (value === null) {\n conditions.push(`\"${parseSqlIdentifier(key, 'field name')}\" IS NULL`);\n } else {\n conditions.push(`\"${parseSqlIdentifier(key, 'field name')}\" = $${paramIndex++}`);\n args.push(value instanceof Date ? value.toISOString() : value);\n }\n });\n\n return {\n sql: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '',\n args,\n };\n}\n\n/**\n * Transform SQL row to record format, handling JSON columns\n */\nexport function transformFromSqlRow<T>({\n tableName,\n sqlRow,\n}: {\n tableName: TABLE_NAMES;\n sqlRow: Record<string, any>;\n}): T {\n const schema = TABLE_SCHEMAS[tableName];\n const result: Record<string, any> = {};\n\n Object.entries(sqlRow).forEach(([key, value]) => {\n const columnSchema = schema?.[key];\n\n // Handle JSON columns\n if (columnSchema?.type === 'jsonb' && typeof value === 'string') {\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n }\n // Handle Date columns\n // Handle Date columns - convert to Date objects for timestamp columns\n else if (columnSchema?.type === 'timestamp' && value && typeof value === 'string') {\n result[key] = new Date(value);\n } else if (columnSchema?.type === 'timestamp' && value instanceof Date) {\n result[key] = value;\n }\n // Handle boolean columns\n else if (columnSchema?.type === 'boolean') {\n result[key] = Boolean(value);\n } else {\n result[key] = value;\n }\n });\n\n return result as T;\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n AgentsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_AGENTS,\n TABLE_AGENT_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageAgentType,\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n CreateIndexOptions,\n AgentInstructionBlock,\n} from '@mastra/core/storage';\nimport type {\n AgentVersion,\n CreateVersionInput,\n ListVersionsInput,\n ListVersionsOutput,\n} from '@mastra/core/storage/domains/agents';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nexport class AgentsPG extends AgentsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_AGENTS, TABLE_AGENT_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (AgentsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns all DDL statements for this domain: tables.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n\n // Tables\n for (const tableName of AgentsPG.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n }\n\n return statements;\n }\n\n /**\n * Returns default index definitions for the agents domain tables.\n * Currently no default indexes are defined for agents.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for agents.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n // No default indexes for agents domain\n }\n\n async init(): Promise<void> {\n // Migrate from legacy schemas before creating tables\n await this.#migrateFromLegacySchema();\n await this.#migrateVersionsSchema();\n\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] });\n // Add new columns for backwards compatibility with intermediate schema versions\n await this.#db.alterTable({\n tableName: TABLE_AGENTS,\n schema: TABLE_SCHEMAS[TABLE_AGENTS],\n ifNotExists: ['status', 'authorId'],\n });\n\n // Migrate tools field from string[] to JSONB format\n await this.#migrateToolsToJsonbFormat();\n\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n\n // Clean up any stale draft records from previously failed createAgent calls\n await this.#cleanupStaleDrafts();\n }\n\n /**\n * Migrates from the legacy flat agent schema (where config fields like name, instructions, model\n * were stored directly on mastra_agents) to the new versioned schema (thin agent record + versions table).\n */\n async #migrateFromLegacySchema(): Promise<void> {\n const fullTableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n const fullVersionsTableName = getTableName({\n indexName: TABLE_AGENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const legacyTableName = getTableName({\n indexName: `${TABLE_AGENTS}_legacy`,\n schemaName: getSchemaName(this.#schema),\n });\n\n const hasLegacyColumns = await this.#db.hasColumn(TABLE_AGENTS, 'name');\n\n if (hasLegacyColumns) {\n // Current table has legacy schema — rename it and drop old versions table\n await this.#db.client.none(`ALTER TABLE ${fullTableName} RENAME TO \"${TABLE_AGENTS}_legacy\"`);\n await this.#db.client.none(`DROP TABLE IF EXISTS ${fullVersionsTableName}`);\n }\n\n // Check if legacy table exists (either just renamed, or left behind by a previous partial migration)\n const legacyExists = await this.#db.hasColumn(`${TABLE_AGENTS}_legacy`, 'name');\n if (!legacyExists) return;\n\n // Read all existing agents from the legacy table\n const oldAgents = await this.#db.client.manyOrNone(`SELECT * FROM ${legacyTableName}`);\n\n // Create new tables (IF NOT EXISTS handles idempotency on resume)\n await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\n await this.#db.createTable({ tableName: TABLE_AGENT_VERSIONS, schema: TABLE_SCHEMAS[TABLE_AGENT_VERSIONS] });\n\n // ON CONFLICT DO NOTHING makes inserts safe for resumed partial migrations\n for (const row of oldAgents) {\n const agentId = row.id as string;\n if (!agentId) continue;\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n\n await this.#db.client.none(\n `INSERT INTO ${fullTableName} (id, status, \"activeVersionId\", \"authorId\", metadata, \"createdAt\", \"updatedAt\")\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n ON CONFLICT (id) DO NOTHING`,\n [\n agentId,\n 'published',\n versionId,\n row.ownerId ?? row.authorId ?? null,\n row.metadata ? JSON.stringify(row.metadata) : null,\n row.createdAt ?? now,\n row.updatedAt ?? now,\n ],\n );\n\n await this.#db.client.none(\n `INSERT INTO ${fullVersionsTableName}\n (id, \"agentId\", \"versionNumber\", name, description, instructions, model, tools,\n \"defaultOptions\", workflows, agents, \"integrationTools\", \"inputProcessors\",\n \"outputProcessors\", memory, scorers, \"changedFields\", \"changeMessage\", \"createdAt\")\n VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19)\n ON CONFLICT (id) DO NOTHING`,\n [\n versionId,\n agentId,\n 1,\n row.name ?? agentId,\n row.description ?? null,\n this.serializeInstructions(row.instructions ?? ''),\n row.model ? JSON.stringify(row.model) : '{}',\n row.tools ? JSON.stringify(row.tools) : null,\n row.defaultOptions ? JSON.stringify(row.defaultOptions) : null,\n row.workflows ? JSON.stringify(row.workflows) : null,\n row.agents ? JSON.stringify(row.agents) : null,\n row.integrationTools ? JSON.stringify(row.integrationTools) : null,\n row.inputProcessors ? JSON.stringify(row.inputProcessors) : null,\n row.outputProcessors ? JSON.stringify(row.outputProcessors) : null,\n row.memory ? JSON.stringify(row.memory) : null,\n row.scorers ? JSON.stringify(row.scorers) : null,\n null,\n 'Migrated from legacy schema',\n row.createdAt ?? now,\n ],\n );\n }\n\n // Drop legacy table only after all inserts succeed\n await this.#db.client.none(`DROP TABLE IF EXISTS ${legacyTableName}`);\n }\n\n /**\n * Migrates the agent_versions table from the old snapshot-based schema (single `snapshot` JSON column)\n * to the new flat schema (individual config columns). This handles the case where the agents table\n * was already migrated but the versions table still has the old schema.\n */\n async #migrateVersionsSchema(): Promise<void> {\n const hasSnapshotColumn = await this.#db.hasColumn(TABLE_AGENT_VERSIONS, 'snapshot');\n if (!hasSnapshotColumn) return;\n\n const fullVersionsTableName = getTableName({\n indexName: TABLE_AGENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const legacyTableName = getTableName({\n indexName: `${TABLE_AGENTS}_legacy`,\n schemaName: getSchemaName(this.#schema),\n });\n\n // Drop the old versions table - the new schema will be created by init()\n await this.#db.client.none(`DROP TABLE IF EXISTS ${fullVersionsTableName}`);\n\n // Also clean up any lingering legacy table from a partial migration\n await this.#db.client.none(`DROP TABLE IF EXISTS ${legacyTableName}`);\n }\n\n /**\n * Migrates the tools field from string[] format to JSONB format { \"tool-key\": { \"description\": \"...\" } }.\n * This handles the transition from the old format where tools were stored as an array of string keys\n * to the new format where tools can have per-agent description overrides.\n */\n async #migrateToolsToJsonbFormat(): Promise<void> {\n const fullVersionsTableName = getTableName({\n indexName: TABLE_AGENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n try {\n // Check if any records have tools stored as a JSON array\n const recordsWithArrayTools = await this.#db.client.any(\n `SELECT id, tools FROM ${fullVersionsTableName} \n WHERE tools IS NOT NULL \n AND jsonb_typeof(tools) = 'array'`,\n );\n\n if (recordsWithArrayTools.length === 0) {\n return; // No migration needed\n }\n\n // Convert each record's tools from array to object format\n for (const record of recordsWithArrayTools) {\n const toolsArray = record.tools as string[];\n const toolsObject: Record<string, { description?: string }> = {};\n\n // Convert each tool string to an object key with empty config\n for (const toolKey of toolsArray) {\n toolsObject[toolKey] = {};\n }\n\n // Update the record with the new format\n await this.#db.client.none(\n `UPDATE ${fullVersionsTableName} \n SET tools = $1::jsonb \n WHERE id = $2`,\n [JSON.stringify(toolsObject), record.id],\n );\n }\n\n this.logger?.info?.(\n `Migrated ${recordsWithArrayTools.length} agent version(s) tools from array to object format`,\n );\n } catch (error) {\n // Log but don't fail - this is a non-breaking migration\n this.logger?.warn?.('Failed to migrate tools to JSONB format:', error);\n }\n }\n\n /**\n * Removes stale draft agent records that have no activeVersionId.\n * These are left behind when createAgent partially fails (inserts thin record\n * but fails to create the version due to schema mismatch).\n */\n async #cleanupStaleDrafts(): Promise<void> {\n try {\n const fullTableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${fullTableName} WHERE status = 'draft' AND \\\"activeVersionId\\\" IS NULL`);\n } catch {\n // Non-critical cleanup, ignore errors\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\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 parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseRow(row: any): StorageAgentType {\n return {\n id: row.id as string,\n status: row.status as 'draft' | 'published' | 'archived',\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: row.createdAtZ || row.createdAt,\n updatedAt: row.updatedAtZ || row.updatedAt,\n };\n }\n\n async getById(id: string): Promise<StorageAgentType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin agent record with status='draft' and activeVersionId=null\n await this.#db.client.none(\n `INSERT INTO ${agentsTable} (\n id, status, \"authorId\", metadata,\n \"activeVersionId\",\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n agent.id,\n 'draft',\n agent.authorId ?? null,\n agent.metadata ? JSON.stringify(agent.metadata) : null,\n null, // activeVersionId starts as null\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract config fields from the flat input\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;\n\n // Create version 1 from the config\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n agentId: agent.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n // 3. Return the thin agent record (activeVersionId remains null)\n return {\n id: agent.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: agent.authorId,\n metadata: agent.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n // Best-effort cleanup to prevent orphaned draft records\n try {\n const agentsTable = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(\n `DELETE FROM ${agentsTable} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [agent.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n // First, get the existing agent\n const existingAgent = await this.getById(id);\n if (!existingAgent) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 // Separate metadata fields from config fields\n const { authorId, activeVersionId, metadata, ...configFields } = updates;\n\n // Extract just the config field names from StorageAgentSnapshotType\n const configFieldNames = [\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 ];\n\n // Check if any config fields are present in the update\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Handle config updates by creating a new version\n if (hasConfigUpdate) {\n // Get the latest version to use as base\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_AGENT', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for agent ${id}`,\n details: { agentId: id },\n });\n }\n\n // Extract config from latest version\n const {\n id: _versionId,\n agentId: _agentId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n // Merge updates into latest config\n // Convert null values to undefined (null means \"remove this field\")\n const sanitizedConfigFields = Object.fromEntries(\n Object.entries(configFields).map(([key, value]) => [key, value === null ? undefined : value]),\n );\n const newConfig = {\n ...latestConfig,\n ...sanitizedConfigFields,\n };\n\n // Identify which fields changed\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n // Create new version only if fields changed\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n const newVersionNumber = latestVersion.versionNumber + 1;\n\n await this.createVersion({\n id: newVersionId,\n agentId: id,\n versionNumber: newVersionNumber,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the agent record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Do NOT automatically set status='published' when activeVersionId is updated\n }\n\n if (metadata !== undefined) {\n // REPLACE metadata (not merge) - this is standard DB behavior\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(metadata));\n }\n\n // Always update the updatedAt timestamp\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n // Add the ID for the WHERE clause\n values.push(id);\n\n if (setClauses.length > 2) {\n // More than just updatedAt and updatedAtZ\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n // Return the updated agent\n const updatedAgent = await this.getById(id);\n if (!updatedAgent) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_AGENT', 'NOT_FOUND_AFTER_UPDATE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Agent ${id} not found after update`,\n details: { agentId: id },\n });\n }\n\n return updatedAgent;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n // Delete all versions for this agent first\n await this.deleteVersionsByParentId(id);\n\n // Then delete the agent\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_AGENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId: id },\n },\n error,\n );\n }\n }\n\n async list(args?: StorageListAgentsInput): Promise<StorageListAgentsOutput> {\n const { page = 0, perPage: perPageInput, orderBy } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n // Get total count\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName}`);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n agents: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ORDER BY \"${field}\" ${direction} LIMIT $1 OFFSET $2`,\n [limitValue, offset],\n );\n\n const agents = (dataResult || []).map(row => this.parseRow(row));\n\n return {\n agents,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_AGENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Agent Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateVersionInput): Promise<AgentVersion> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"agentId\", \"versionNumber\",\n name, description, instructions, model, tools,\n \"defaultOptions\", workflows, agents, \"integrationTools\",\n \"inputProcessors\", \"outputProcessors\", memory, scorers,\n \"mcpClients\", \"requestContextSchema\", \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22)`,\n [\n input.id,\n input.agentId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n this.serializeInstructions(input.instructions),\n JSON.stringify(input.model),\n input.tools ? JSON.stringify(input.tools) : null,\n input.defaultOptions ? JSON.stringify(input.defaultOptions) : null,\n input.workflows ? JSON.stringify(input.workflows) : null,\n input.agents ? JSON.stringify(input.agents) : null,\n input.integrationTools ? JSON.stringify(input.integrationTools) : null,\n input.inputProcessors ? JSON.stringify(input.inputProcessors) : null,\n input.outputProcessors ? JSON.stringify(input.outputProcessors) : null,\n input.memory ? JSON.stringify(input.memory) : null,\n input.scorers ? JSON.stringify(input.scorers) : null,\n input.mcpClients ? JSON.stringify(input.mcpClients) : null,\n input.requestContextSchema ? JSON.stringify(input.requestContextSchema) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 AND \"versionNumber\" = $2`,\n [agentId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [agentId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListVersionsInput): Promise<ListVersionsOutput> {\n const { agentId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_VERSIONS', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { page },\n },\n new Error('page must be >= 0'),\n );\n }\n\n const perPage = normalizePerPage(perPageInput, 20);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n\n // Get total count\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"agentId\" = $1`, [\n agentId,\n ]);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n // Get paginated results\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"agentId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [agentId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 const tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"agentId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 tableName = getTableName({ indexName: TABLE_AGENT_VERSIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"agentId\" = $1`, [\n agentId,\n ]);\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'COUNT_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { agentId },\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private serializeInstructions(instructions: string | AgentInstructionBlock[] | undefined | null): string | undefined {\n if (instructions == null) return undefined;\n return Array.isArray(instructions) ? JSON.stringify(instructions) : instructions;\n }\n\n private deserializeInstructions(raw: string | null | undefined): string | AgentInstructionBlock[] {\n if (!raw) return '';\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed as AgentInstructionBlock[];\n } catch {\n // Not JSON — plain string\n }\n return raw;\n }\n\n private parseVersionRow(row: any): AgentVersion {\n return {\n id: row.id as string,\n agentId: row.agentId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n instructions: this.deserializeInstructions(row.instructions as string),\n model: this.parseJson(row.model, 'model'),\n tools: this.parseJson(row.tools, 'tools'),\n defaultOptions: this.parseJson(row.defaultOptions, 'defaultOptions'),\n workflows: this.parseJson(row.workflows, 'workflows'),\n agents: this.parseJson(row.agents, 'agents'),\n integrationTools: this.parseJson(row.integrationTools, 'integrationTools'),\n inputProcessors: this.parseJson(row.inputProcessors, 'inputProcessors'),\n outputProcessors: this.parseJson(row.outputProcessors, 'outputProcessors'),\n memory: this.parseJson(row.memory, 'memory'),\n scorers: this.parseJson(row.scorers, 'scorers'),\n mcpClients: this.parseJson(row.mcpClients, 'mcpClients'),\n requestContextSchema: this.parseJson(row.requestContextSchema, 'requestContextSchema'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: row.createdAtZ || row.createdAt,\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_DATASETS,\n TABLE_DATASET_ITEMS,\n TABLE_DATASET_VERSIONS,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_CONFIGS,\n TABLE_SCHEMAS,\n DATASETS_SCHEMA,\n DATASET_ITEMS_SCHEMA,\n DATASET_VERSIONS_SCHEMA,\n DatasetsStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n DatasetRecord,\n DatasetItem,\n DatasetItemRow,\n DatasetVersion,\n CreateDatasetInput,\n UpdateDatasetInput,\n AddDatasetItemInput,\n UpdateDatasetItemInput,\n ListDatasetsInput,\n ListDatasetsOutput,\n ListDatasetItemsInput,\n ListDatasetItemsOutput,\n ListDatasetVersionsInput,\n ListDatasetVersionsOutput,\n BatchInsertItemsInput,\n BatchDeleteItemsInput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\n/** Serialize a value for a jsonb column. Returns null for null/undefined. */\nfunction jsonbArg(value: unknown): string | null {\n return value === undefined || value === null ? null : JSON.stringify(value);\n}\n\nexport class DatasetsPG extends DatasetsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (DatasetsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n for (const tableName of DatasetsPG.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n schemaName,\n compositePrimaryKey: TABLE_CONFIGS[tableName]?.compositePrimaryKey,\n includeAllConstraints: true,\n }),\n );\n }\n return statements;\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_DATASETS, schema: DATASETS_SCHEMA });\n await this.#db.createTable({\n tableName: TABLE_DATASET_ITEMS,\n schema: DATASET_ITEMS_SCHEMA,\n compositePrimaryKey: TABLE_CONFIGS[TABLE_DATASET_ITEMS]?.compositePrimaryKey,\n });\n await this.#db.createTable({ tableName: TABLE_DATASET_VERSIONS, schema: DATASET_VERSIONS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n { name: 'idx_dataset_items_dataset_validto', table: TABLE_DATASET_ITEMS, columns: ['datasetId', 'validTo'] },\n {\n name: 'idx_dataset_items_dataset_version',\n table: TABLE_DATASET_ITEMS,\n columns: ['datasetId', 'datasetVersion'],\n },\n {\n name: 'idx_dataset_items_dataset_validto_deleted',\n table: TABLE_DATASET_ITEMS,\n columns: ['datasetId', 'validTo', 'isDeleted'],\n },\n {\n name: 'idx_dataset_versions_dataset_version',\n table: TABLE_DATASET_VERSIONS,\n columns: ['datasetId', 'version'],\n },\n {\n name: 'idx_dataset_versions_dataset_version_unique',\n table: TABLE_DATASET_VERSIONS,\n columns: ['datasetId', 'version'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) return;\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create default index ${indexDef.name}:`, error);\n }\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n // --- Row transformers ---\n\n private transformDatasetRow(row: Record<string, any>): DatasetRecord {\n return {\n id: row.id as string,\n name: row.name as string,\n description: (row.description as string) ?? undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n inputSchema: row.inputSchema ? safelyParseJSON(row.inputSchema) : undefined,\n groundTruthSchema: row.groundTruthSchema ? safelyParseJSON(row.groundTruthSchema) : undefined,\n version: row.version as number,\n createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n };\n }\n\n private transformItemRow(row: Record<string, any>): DatasetItem {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n input: safelyParseJSON(row.input),\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n };\n }\n\n private transformItemRowFull(row: Record<string, any>): DatasetItemRow {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n datasetVersion: row.datasetVersion as number,\n validTo: row.validTo as number | null,\n isDeleted: Boolean(row.isDeleted),\n input: safelyParseJSON(row.input),\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n };\n }\n\n private transformDatasetVersionRow(row: Record<string, any>): DatasetVersion {\n return {\n id: row.id as string,\n datasetId: row.datasetId as string,\n version: row.version as number,\n createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n };\n }\n\n // --- Dataset CRUD ---\n\n async createDataset(input: CreateDatasetInput): Promise<DatasetRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_DATASETS,\n record: {\n id,\n name: input.name,\n description: input.description ?? null,\n metadata: input.metadata ?? null,\n inputSchema: input.inputSchema ?? null,\n groundTruthSchema: input.groundTruthSchema ?? null,\n version: 0,\n createdAt: nowIso,\n updatedAt: nowIso,\n },\n });\n\n return {\n id,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n inputSchema: input.inputSchema,\n groundTruthSchema: input.groundTruthSchema,\n version: 0,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getDatasetById({ id }: { id: string }): Promise<DatasetRecord | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE \"id\" = $1`, [id]);\n return result ? this.transformDatasetRow(result) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doUpdateDataset(args: UpdateDatasetInput): Promise<DatasetRecord> {\n try {\n const existing = await this.getDatasetById({ id: args.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_DATASET', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: args.id },\n });\n }\n\n const tableName = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const now = new Date().toISOString();\n const setClauses: string[] = ['\"updatedAt\" = $1', '\"updatedAtZ\" = $2'];\n const values: any[] = [now, now];\n let paramIndex = 3;\n\n if (args.name !== undefined) {\n setClauses.push(`\"name\" = $${paramIndex++}`);\n values.push(args.name);\n }\n if (args.description !== undefined) {\n setClauses.push(`\"description\" = $${paramIndex++}`);\n values.push(args.description);\n }\n if (args.metadata !== undefined) {\n setClauses.push(`\"metadata\" = $${paramIndex++}`);\n values.push(JSON.stringify(args.metadata));\n }\n if (args.inputSchema !== undefined) {\n setClauses.push(`\"inputSchema\" = $${paramIndex++}`);\n values.push(args.inputSchema === null ? null : JSON.stringify(args.inputSchema));\n }\n if (args.groundTruthSchema !== undefined) {\n setClauses.push(`\"groundTruthSchema\" = $${paramIndex++}`);\n values.push(args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema));\n }\n\n values.push(args.id);\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE \"id\" = $${paramIndex}`,\n values,\n );\n\n return {\n ...existing,\n name: args.name ?? existing.name,\n description: args.description ?? existing.description,\n metadata: args.metadata ?? existing.metadata,\n inputSchema: args.inputSchema !== undefined ? args.inputSchema : existing.inputSchema,\n groundTruthSchema: args.groundTruthSchema !== undefined ? args.groundTruthSchema : existing.groundTruthSchema,\n updatedAt: new Date(now),\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteDataset({ id }: { id: string }): Promise<void> {\n try {\n const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const versionsTable = getTableName({\n indexName: TABLE_DATASET_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n const experimentResultsTable = getTableName({\n indexName: TABLE_EXPERIMENT_RESULTS,\n schemaName: getSchemaName(this.#schema),\n });\n\n // Detach experiments — each wrapped in try/catch because experiment tables may not exist yet\n try {\n await this.#db.client.none(\n `DELETE FROM ${experimentResultsTable} WHERE \"experimentId\" IN (SELECT \"id\" FROM ${experimentsTable} WHERE \"datasetId\" = $1)`,\n [id],\n );\n } catch {\n /* table may not exist */\n }\n try {\n await this.#db.client.none(\n `UPDATE ${experimentsTable} SET \"datasetId\" = NULL, \"datasetVersion\" = NULL WHERE \"datasetId\" = $1`,\n [id],\n );\n } catch {\n /* table may not exist */\n }\n\n // Cascade delete — atomic transaction\n await this.#db.client.tx(async t => {\n await t.none(`DELETE FROM ${versionsTable} WHERE \"datasetId\" = $1`, [id]);\n await t.none(`DELETE FROM ${itemsTable} WHERE \"datasetId\" = $1`, [id]);\n await t.none(`DELETE FROM ${datasetsTable} WHERE \"id\" = $1`, [id]);\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_DATASET', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listDatasets(args: ListDatasetsInput): Promise<ListDatasetsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n const tableName = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName}`);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return { datasets: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ORDER BY \"createdAt\" DESC LIMIT $1 OFFSET $2`,\n [limitValue, offset],\n );\n\n return {\n datasets: (rows || []).map(row => this.transformDatasetRow(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_DATASETS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- SCD-2 mutations ---\n\n protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {\n try {\n const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const versionsTable = getTableName({\n indexName: TABLE_DATASET_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const id = crypto.randomUUID();\n const versionId = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n let newVersion: number;\n\n await this.#db.client.tx(async t => {\n const row = await t.one(\n `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\"`,\n [args.datasetId],\n );\n newVersion = row.version as number;\n\n await t.none(\n `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"metadata\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,NULL,false,$4,$5,$6,$7,$8,$9,$10)`,\n [\n id,\n args.datasetId,\n newVersion,\n JSON.stringify(args.input),\n jsonbArg(args.groundTruth),\n jsonbArg(args.metadata),\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n await t.none(\n `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n [versionId, args.datasetId, newVersion, nowIso, nowIso],\n );\n });\n\n return {\n id,\n datasetId: args.datasetId,\n datasetVersion: newVersion!,\n input: args.input,\n groundTruth: args.groundTruth,\n metadata: args.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'ADD_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doUpdateItem(args: UpdateDatasetItemInput): Promise<DatasetItem> {\n try {\n const existing = await this.getItemById({ id: args.id });\n if (!existing) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_ITEM', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: args.id },\n });\n }\n if (existing.datasetId !== args.datasetId) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: args.id, expectedDatasetId: args.datasetId, actualDatasetId: existing.datasetId },\n });\n }\n\n const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const versionsTable = getTableName({\n indexName: TABLE_DATASET_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const versionId = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n // Merge fields: use new value if provided, else keep existing\n const mergedInput = args.input ?? existing.input;\n const mergedGroundTruth = args.groundTruth ?? existing.groundTruth;\n const mergedMetadata = args.metadata ?? existing.metadata;\n\n let newVersion: number;\n\n await this.#db.client.tx(async t => {\n // 1. Bump dataset version\n const row = await t.one(\n `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\"`,\n [args.datasetId],\n );\n newVersion = row.version as number;\n\n // 2. Close old row (set validTo = newVersion)\n await t.none(\n `UPDATE ${itemsTable} SET \"validTo\" = $1 WHERE \"id\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n [newVersion, args.id],\n );\n\n // 3. Insert new row with merged fields, preserving original createdAt\n await t.none(\n `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"metadata\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,NULL,false,$4,$5,$6,$7,$8,$9,$10)`,\n [\n args.id,\n args.datasetId,\n newVersion,\n JSON.stringify(mergedInput),\n jsonbArg(mergedGroundTruth),\n jsonbArg(mergedMetadata),\n existing.createdAt.toISOString(),\n existing.createdAt.toISOString(),\n nowIso,\n nowIso,\n ],\n );\n\n // 4. Insert dataset_version row\n await t.none(\n `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n [versionId, args.datasetId, newVersion, nowIso, nowIso],\n );\n });\n\n return {\n ...existing,\n datasetVersion: newVersion!,\n input: mergedInput,\n groundTruth: mergedGroundTruth,\n metadata: mergedMetadata,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doDeleteItem({ id, datasetId }: { id: string; datasetId: string }): Promise<void> {\n try {\n const existing = await this.getItemById({ id });\n if (!existing) return; // no-op if not found\n if (existing.datasetId !== datasetId) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'DELETE_ITEM', 'DATASET_MISMATCH'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { itemId: id, expectedDatasetId: datasetId, actualDatasetId: existing.datasetId },\n });\n }\n\n const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const versionsTable = getTableName({\n indexName: TABLE_DATASET_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const versionId = crypto.randomUUID();\n const nowIso = new Date().toISOString();\n\n await this.#db.client.tx(async t => {\n // 1. Bump dataset version\n const row = await t.one(\n `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\"`,\n [datasetId],\n );\n const newVersion = row.version as number;\n\n // 2. Close old row\n await t.none(\n `UPDATE ${itemsTable} SET \"validTo\" = $1 WHERE \"id\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n [newVersion, id],\n );\n\n // 3. Insert tombstone (isDeleted=true, validTo=NULL — tombstone is the \"current\" terminal version)\n await t.none(\n `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"metadata\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,NULL,true,$4,$5,$6,$7,$8,$9,$10)`,\n [\n id,\n datasetId,\n newVersion,\n JSON.stringify(existing.input),\n jsonbArg(existing.groundTruth),\n jsonbArg(existing.metadata),\n existing.createdAt.toISOString(),\n existing.createdAt.toISOString(),\n nowIso,\n nowIso,\n ],\n );\n\n // 4. Insert dataset_version row\n await t.none(\n `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n [versionId, datasetId, newVersion, nowIso, nowIso],\n );\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doBatchInsertItems(input: BatchInsertItemsInput): Promise<DatasetItem[]> {\n try {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'BULK_ADD_ITEMS', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const versionsTable = getTableName({\n indexName: TABLE_DATASET_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const now = new Date();\n const nowIso = now.toISOString();\n const versionId = crypto.randomUUID();\n\n // Pre-generate IDs\n const itemsWithIds = input.items.map(itemInput => ({ id: crypto.randomUUID(), input: itemInput }));\n\n let newVersion: number;\n\n await this.#db.client.tx(async t => {\n // 1. Single version bump\n const row = await t.one(\n `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\"`,\n [input.datasetId],\n );\n newVersion = row.version as number;\n\n // 2. N item inserts\n for (const { id, input: itemInput } of itemsWithIds) {\n await t.none(\n `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"metadata\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,NULL,false,$4,$5,$6,$7,$8,$9,$10)`,\n [\n id,\n input.datasetId,\n newVersion,\n JSON.stringify(itemInput.input),\n jsonbArg(itemInput.groundTruth),\n jsonbArg(itemInput.metadata),\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n }\n\n // 3. Single dataset_version row\n await t.none(\n `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n [versionId, input.datasetId, newVersion, nowIso, nowIso],\n );\n });\n\n return itemsWithIds.map(({ id, input: itemInput }) => ({\n id,\n datasetId: input.datasetId,\n datasetVersion: newVersion!,\n input: itemInput.input,\n groundTruth: itemInput.groundTruth,\n metadata: itemInput.metadata,\n createdAt: now,\n updatedAt: now,\n }));\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BULK_ADD_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n protected async _doBatchDeleteItems(input: BatchDeleteItemsInput): Promise<void> {\n try {\n const dataset = await this.getDatasetById({ id: input.datasetId });\n if (!dataset) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'BULK_DELETE_ITEMS', 'DATASET_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { datasetId: input.datasetId },\n });\n }\n\n // Fetch current items outside tx (same as LibSQL — skip items not found or mismatched)\n const currentItems: DatasetItem[] = [];\n for (const itemId of input.itemIds) {\n const item = await this.getItemById({ id: itemId });\n if (item && item.datasetId === input.datasetId) {\n currentItems.push(item);\n }\n }\n if (currentItems.length === 0) return;\n\n const datasetsTable = getTableName({ indexName: TABLE_DATASETS, schemaName: getSchemaName(this.#schema) });\n const itemsTable = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const versionsTable = getTableName({\n indexName: TABLE_DATASET_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const nowIso = new Date().toISOString();\n const versionId = crypto.randomUUID();\n\n await this.#db.client.tx(async t => {\n // 1. Single version bump\n const row = await t.one(\n `UPDATE ${datasetsTable} SET \"version\" = \"version\" + 1 WHERE \"id\" = $1 RETURNING \"version\"`,\n [input.datasetId],\n );\n const newVersion = row.version as number;\n\n // 2. For each item: close old row + insert tombstone\n for (const item of currentItems) {\n await t.none(\n `UPDATE ${itemsTable} SET \"validTo\" = $1 WHERE \"id\" = $2 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n [newVersion, item.id],\n );\n await t.none(\n `INSERT INTO ${itemsTable} (\"id\",\"datasetId\",\"datasetVersion\",\"validTo\",\"isDeleted\",\"input\",\"groundTruth\",\"metadata\",\"createdAt\",\"createdAtZ\",\"updatedAt\",\"updatedAtZ\") VALUES ($1,$2,$3,NULL,true,$4,$5,$6,$7,$8,$9,$10)`,\n [\n item.id,\n input.datasetId,\n newVersion,\n JSON.stringify(item.input),\n jsonbArg(item.groundTruth),\n jsonbArg(item.metadata),\n item.createdAt.toISOString(),\n item.createdAt.toISOString(),\n nowIso,\n nowIso,\n ],\n );\n }\n\n // 3. Single dataset_version row\n await t.none(\n `INSERT INTO ${versionsTable} (\"id\",\"datasetId\",\"version\",\"createdAt\",\"createdAtZ\") VALUES ($1,$2,$3,$4,$5)`,\n [versionId, input.datasetId, newVersion, nowIso, nowIso],\n );\n });\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BULK_DELETE_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- SCD-2 queries ---\n\n async getItemById(args: { id: string; datasetVersion?: number }): Promise<DatasetItem | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n let result;\n\n if (args.datasetVersion !== undefined) {\n result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"id\" = $1 AND \"datasetVersion\" = $2 AND \"isDeleted\" = false`,\n [args.id, args.datasetVersion],\n );\n } else {\n result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"id\" = $1 AND \"validTo\" IS NULL AND \"isDeleted\" = false`,\n [args.id],\n );\n }\n\n return result ? this.transformItemRow(result) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_ITEM', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getItemsByVersion({ datasetId, version }: { datasetId: string; version: number }): Promise<DatasetItem[]> {\n try {\n const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"datasetId\" = $1 AND \"datasetVersion\" <= $2 AND (\"validTo\" IS NULL OR \"validTo\" > $3) AND \"isDeleted\" = false ORDER BY \"createdAt\" DESC`,\n [datasetId, version, version],\n );\n return (rows || []).map(row => this.transformItemRow(row));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_ITEMS_BY_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getItemHistory(itemId: string): Promise<DatasetItemRow[]> {\n try {\n const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"id\" = $1 ORDER BY \"datasetVersion\" DESC`,\n [itemId],\n );\n return (rows || []).map(row => this.transformItemRowFull(row));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_ITEM_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listItems(args: ListDatasetItemsInput): Promise<ListDatasetItemsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n const tableName = getTableName({ indexName: TABLE_DATASET_ITEMS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = ['\"datasetId\" = $1'];\n const queryParams: any[] = [args.datasetId];\n let paramIndex = 2;\n\n if (args.version !== undefined) {\n // SCD-2 time-travel\n conditions.push(`\"datasetVersion\" <= $${paramIndex++}`);\n queryParams.push(args.version);\n conditions.push(`(\"validTo\" IS NULL OR \"validTo\" > $${paramIndex++})`);\n queryParams.push(args.version);\n conditions.push(`\"isDeleted\" = false`);\n } else {\n // Current items only\n conditions.push(`\"validTo\" IS NULL`);\n conditions.push(`\"isDeleted\" = false`);\n }\n\n if (args.search) {\n conditions.push(\n `(\"input\"::text ILIKE $${paramIndex} OR COALESCE(\"groundTruth\"::text, '') ILIKE $${paramIndex})`,\n );\n queryParams.push(`%${args.search}%`);\n paramIndex++;\n }\n\n const whereClause = `WHERE ${conditions.join(' AND ')}`;\n\n // Count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return { items: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"createdAt\" DESC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n [...queryParams, limitValue, offset],\n );\n\n return {\n items: (rows || []).map(row => this.transformItemRow(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_ITEMS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Dataset versions ---\n\n async createDatasetVersion(datasetId: string, version: number): Promise<DatasetVersion> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_DATASET_VERSIONS,\n record: { id, datasetId, version, createdAt: nowIso },\n });\n\n return { id, datasetId, version, createdAt: now };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_DATASET_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listDatasetVersions(input: ListDatasetVersionsInput): Promise<ListDatasetVersionsOutput> {\n try {\n const { page, perPage: perPageInput } = input.pagination;\n const tableName = getTableName({ indexName: TABLE_DATASET_VERSIONS, schemaName: getSchemaName(this.#schema) });\n\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"datasetId\" = $1`,\n [input.datasetId],\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return { versions: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"datasetId\" = $1 ORDER BY \"version\" DESC LIMIT $2 OFFSET $3`,\n [input.datasetId, limitValue, offset],\n );\n\n return {\n versions: (rows || []).map(row => this.transformDatasetVersionRow(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_DATASET_VERSIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Clear ---\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","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n TABLE_EXPERIMENTS,\n TABLE_EXPERIMENT_RESULTS,\n TABLE_SCHEMAS,\n EXPERIMENTS_SCHEMA,\n EXPERIMENT_RESULTS_SCHEMA,\n ExperimentsStorage,\n calculatePagination,\n normalizePerPage,\n safelyParseJSON,\n ensureDate,\n} from '@mastra/core/storage';\nimport type {\n Experiment,\n ExperimentResult,\n CreateExperimentInput,\n UpdateExperimentInput,\n AddExperimentResultInput,\n ListExperimentsInput,\n ListExperimentsOutput,\n ListExperimentResultsInput,\n ListExperimentResultsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nexport class ExperimentsPG extends ExperimentsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (ExperimentsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n for (const tableName of ExperimentsPG.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n }\n return statements;\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_EXPERIMENTS, schema: EXPERIMENTS_SCHEMA });\n await this.#db.createTable({ tableName: TABLE_EXPERIMENT_RESULTS, schema: EXPERIMENT_RESULTS_SCHEMA });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n { name: 'idx_experiments_datasetid', table: TABLE_EXPERIMENTS, columns: ['datasetId'] },\n { name: 'idx_experiment_results_experimentid', table: TABLE_EXPERIMENT_RESULTS, columns: ['experimentId'] },\n {\n name: 'idx_experiment_results_exp_item',\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 for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create default index ${indexDef.name}:`, error);\n }\n }\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) return;\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n // --- Row transformers ---\n\n private transformExperimentRow(row: Record<string, any>): Experiment {\n return {\n id: row.id as string,\n name: (row.name as string) ?? undefined,\n description: (row.description as string) ?? undefined,\n metadata: row.metadata ? safelyParseJSON(row.metadata) : undefined,\n datasetId: (row.datasetId as string | null) ?? null,\n datasetVersion: row.datasetVersion != null ? (row.datasetVersion as number) : null,\n targetType: row.targetType as Experiment['targetType'],\n targetId: row.targetId as string,\n status: row.status as Experiment['status'],\n totalItems: row.totalItems as number,\n succeededCount: row.succeededCount as number,\n failedCount: row.failedCount as number,\n skippedCount: (row.skippedCount as number) ?? 0,\n startedAt: row.startedAt ? ensureDate(row.startedAtZ || row.startedAt)! : null,\n completedAt: row.completedAt ? ensureDate(row.completedAtZ || row.completedAt)! : null,\n createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n updatedAt: ensureDate(row.updatedAtZ || row.updatedAt)!,\n };\n }\n\n private transformExperimentResultRow(row: Record<string, any>): ExperimentResult {\n return {\n id: row.id as string,\n experimentId: row.experimentId as string,\n itemId: row.itemId as string,\n itemDatasetVersion: row.itemDatasetVersion != null ? (row.itemDatasetVersion as number) : null,\n input: safelyParseJSON(row.input),\n output: row.output ? safelyParseJSON(row.output) : null,\n groundTruth: row.groundTruth ? safelyParseJSON(row.groundTruth) : null,\n error: row.error ? safelyParseJSON(row.error) : null,\n startedAt: ensureDate(row.startedAtZ || row.startedAt)!,\n completedAt: ensureDate(row.completedAtZ || row.completedAt)!,\n retryCount: row.retryCount as number,\n traceId: (row.traceId as string | null) ?? null,\n createdAt: ensureDate(row.createdAtZ || row.createdAt)!,\n };\n }\n\n // --- Experiment CRUD ---\n\n async createExperiment(input: CreateExperimentInput): Promise<Experiment> {\n try {\n const id = input.id ?? crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_EXPERIMENTS,\n record: {\n id,\n name: input.name ?? null,\n description: input.description ?? null,\n metadata: input.metadata ?? null,\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 startedAt: null,\n completedAt: null,\n createdAt: nowIso,\n updatedAt: nowIso,\n },\n });\n\n return {\n id,\n name: input.name,\n description: input.description,\n metadata: input.metadata,\n 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 startedAt: null,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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('PG', 'UPDATE_EXPERIMENT', 'NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { experimentId: input.id },\n });\n }\n\n const tableName = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n const now = new Date().toISOString();\n const setClauses: string[] = ['\"updatedAt\" = $1', '\"updatedAtZ\" = $2'];\n const values: any[] = [now, now];\n let paramIndex = 3;\n\n if (input.name !== undefined) {\n setClauses.push(`\"name\" = $${paramIndex++}`);\n values.push(input.name);\n }\n if (input.description !== undefined) {\n setClauses.push(`\"description\" = $${paramIndex++}`);\n values.push(input.description);\n }\n if (input.metadata !== undefined) {\n setClauses.push(`\"metadata\" = $${paramIndex++}`);\n values.push(JSON.stringify(input.metadata));\n }\n if (input.status !== undefined) {\n setClauses.push(`\"status\" = $${paramIndex++}`);\n values.push(input.status);\n }\n if (input.succeededCount !== undefined) {\n setClauses.push(`\"succeededCount\" = $${paramIndex++}`);\n values.push(input.succeededCount);\n }\n if (input.failedCount !== undefined) {\n setClauses.push(`\"failedCount\" = $${paramIndex++}`);\n values.push(input.failedCount);\n }\n if (input.skippedCount !== undefined) {\n setClauses.push(`\"skippedCount\" = $${paramIndex++}`);\n values.push(input.skippedCount);\n }\n if (input.startedAt !== undefined) {\n setClauses.push(`\"startedAt\" = $${paramIndex++}`);\n values.push(input.startedAt?.toISOString() ?? null);\n }\n if (input.completedAt !== undefined) {\n setClauses.push(`\"completedAt\" = $${paramIndex++}`);\n values.push(input.completedAt?.toISOString() ?? null);\n }\n\n values.push(input.id);\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE \"id\" = $${paramIndex}`,\n values,\n );\n\n // Re-SELECT to get correctly transformed fields (timestamps, jsonb)\n const updated = await this.getExperimentById({ id: input.id });\n return updated!;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentById({ id }: { id: string }): Promise<Experiment | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE \"id\" = $1`, [id]);\n return result ? this.transformExperimentRow(result) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listExperiments(args: ListExperimentsInput): Promise<ListExperimentsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n const tableName = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIndex = 1;\n\n if (args.datasetId) {\n conditions.push(`\"datasetId\" = $${paramIndex++}`);\n queryParams.push(args.datasetId);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return { experiments: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"createdAt\" DESC LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n [...queryParams, limitValue, offset],\n );\n\n return {\n experiments: (rows || []).map(row => this.transformExperimentRow(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_EXPERIMENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperiment({ id }: { id: string }): Promise<void> {\n try {\n const resultsTable = getTableName({\n indexName: TABLE_EXPERIMENT_RESULTS,\n schemaName: getSchemaName(this.#schema),\n });\n const experimentsTable = getTableName({ indexName: TABLE_EXPERIMENTS, schemaName: getSchemaName(this.#schema) });\n\n // Delete results first (FK semantics)\n await this.#db.client.none(`DELETE FROM ${resultsTable} WHERE \"experimentId\" = $1`, [id]);\n await this.#db.client.none(`DELETE FROM ${experimentsTable} WHERE \"id\" = $1`, [id]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_EXPERIMENT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Experiment results ---\n\n async addExperimentResult(input: AddExperimentResultInput): Promise<ExperimentResult> {\n try {\n const id = input.id ?? crypto.randomUUID();\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.insert({\n tableName: TABLE_EXPERIMENT_RESULTS,\n record: {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion ?? null,\n input: input.input,\n output: input.output ?? null,\n groundTruth: input.groundTruth ?? null,\n error: input.error ?? null,\n startedAt: input.startedAt.toISOString(),\n completedAt: input.completedAt.toISOString(),\n retryCount: input.retryCount,\n traceId: input.traceId ?? null,\n createdAt: nowIso,\n },\n });\n\n return {\n id,\n experimentId: input.experimentId,\n itemId: input.itemId,\n itemDatasetVersion: input.itemDatasetVersion ?? null,\n input: input.input,\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 createdAt: now,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'ADD_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getExperimentResultById({ id }: { id: string }): Promise<ExperimentResult | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE \"id\" = $1`, [id]);\n return result ? this.transformExperimentResultRow(result) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_EXPERIMENT_RESULT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listExperimentResults(args: ListExperimentResultsInput): Promise<ListExperimentResultsOutput> {\n try {\n const { page, perPage: perPageInput } = args.pagination;\n const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"experimentId\" = $1`,\n [args.experimentId],\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return { results: [], pagination: { total: 0, page, perPage: perPageInput, hasMore: false } };\n }\n\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const limitValue = perPageInput === false ? total : perPage;\n\n const rows = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"experimentId\" = $1 ORDER BY \"startedAt\" ASC LIMIT $2 OFFSET $3`,\n [args.experimentId, limitValue, offset],\n );\n\n return {\n results: (rows || []).map(row => this.transformExperimentResultRow(row)),\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_EXPERIMENT_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async deleteExperimentResults({ experimentId }: { experimentId: string }): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_EXPERIMENT_RESULTS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"experimentId\" = $1`, [experimentId]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_EXPERIMENT_RESULTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // --- Clear ---\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","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n MCPClientsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_MCP_CLIENTS,\n TABLE_MCP_CLIENT_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageMCPClientType,\n StorageCreateMCPClientInput,\n StorageUpdateMCPClientInput,\n StorageListMCPClientsInput,\n StorageListMCPClientsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n MCPClientVersion,\n CreateMCPClientVersionInput,\n ListMCPClientVersionsInput,\n ListMCPClientVersionsOutput,\n} from '@mastra/core/storage/domains/mcp-clients';\nimport { PgDB, resolvePgConfig } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nconst SNAPSHOT_FIELDS = ['name', 'description', 'servers'] as const;\n\nexport class MCPClientsPG extends MCPClientsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (MCPClientsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [\n {\n name: 'idx_mcp_client_versions_client_version',\n table: TABLE_MCP_CLIENT_VERSIONS,\n columns: ['mcpClientId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch {\n // Indexes are performance optimizations, continue on failure\n }\n }\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({\n tableName: TABLE_MCP_CLIENTS,\n schema: TABLE_SCHEMAS[TABLE_MCP_CLIENTS],\n });\n await this.#db.createTable({\n tableName: TABLE_MCP_CLIENT_VERSIONS,\n schema: TABLE_SCHEMAS[TABLE_MCP_CLIENT_VERSIONS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\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 // ==========================================================================\n // MCP Client CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StorageMCPClientType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseMCPClientRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async create(input: { mcpClient: StorageCreateMCPClientInput }): Promise<StorageMCPClientType> {\n const { mcpClient } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin MCP client record\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, status, \"activeVersionId\", \"authorId\", metadata,\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n mcpClient.id,\n 'draft',\n null,\n mcpClient.authorId ?? null,\n mcpClient.metadata ? JSON.stringify(mcpClient.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract snapshot fields and create version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n mcpClientId: mcpClient.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: [...SNAPSHOT_FIELDS],\n changeMessage: 'Initial version',\n });\n\n return {\n id: mcpClient.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: mcpClient.authorId,\n metadata: mcpClient.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n // Best-effort cleanup\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENTS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(\n `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [mcpClient.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async update(input: StorageUpdateMCPClientInput): Promise<StorageMCPClientType> {\n const { id, ...updates } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n\n const existingClient = await this.getById(id);\n if (!existingClient) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n let versionCreated = false;\n\n // Check if any snapshot config fields are present\n const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_MCP_CLIENT', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for MCP client ${id}`,\n details: { mcpClientId: id },\n });\n }\n\n const {\n id: _versionId,\n mcpClientId: _mcpClientId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = SNAPSHOT_FIELDS.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n versionCreated = true;\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n mcpClientId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields: [...changedFields],\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the MCP client record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n if (status === undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push('published');\n }\n }\n\n if (status !== undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push(status);\n }\n\n if (metadata !== undefined) {\n const mergedMetadata = { ...(existingClient.metadata || {}), ...metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\n }\n\n // Always update timestamps\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n values.push(id);\n\n if (setClauses.length > 2 || versionCreated) {\n // More than just updatedAt and updatedAtZ, or a new version was created\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n const updatedClient = await this.getById(id);\n if (!updatedClient) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 updatedClient;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n await this.deleteVersionsByParentId(id);\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async list(args?: StorageListMCPClientsInput): Promise<StorageListMCPClientsOutput> {\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('PG', '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 = getTableName({ indexName: TABLE_MCP_CLIENTS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 1;\n\n if (authorId !== undefined) {\n conditions.push(`\"authorId\" = $${paramIdx++}`);\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n queryParams.push(JSON.stringify(metadata));\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n mcpClients: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n [...queryParams, limitValue, offset],\n );\n\n const mcpClients = (dataResult || []).map(row => this.parseMCPClientRow(row));\n\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('PG', 'LIST_MCP_CLIENTS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // MCP Client Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateMCPClientVersionInput): Promise<MCPClientVersion> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"mcpClientId\", \"versionNumber\",\n name, description, servers,\n \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`,\n [\n input.id,\n input.mcpClientId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n JSON.stringify(input.servers),\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersion(id: string): Promise<MCPClientVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersionByNumber(mcpClientId: string, versionNumber: number): Promise<MCPClientVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"mcpClientId\" = $1 AND \"versionNumber\" = $2`,\n [mcpClientId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getLatestVersion(mcpClientId: string): Promise<MCPClientVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"mcpClientId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [mcpClientId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_MCP_CLIENT_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListMCPClientVersionsInput): Promise<ListMCPClientVersionsOutput> {\n const { mcpClientId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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\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 tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"mcpClientId\" = $1`,\n [mcpClientId],\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"mcpClientId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [mcpClientId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersion(id: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"mcpClientId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_MCP_CLIENT_VERSIONS_BY_MCP_CLIENT_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { mcpClientId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(mcpClientId: string): Promise<number> {\n try {\n const tableName = getTableName({\n indexName: TABLE_MCP_CLIENT_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"mcpClientId\" = $1`, [\n mcpClientId,\n ]);\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseMCPClientRow(row: any): StorageMCPClientType {\n return {\n id: row.id as string,\n status: row.status as StorageMCPClientType['status'],\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAtZ || row.createdAt),\n updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n };\n }\n\n private parseVersionRow(row: any): MCPClientVersion {\n return {\n id: row.id as string,\n mcpClientId: row.mcpClientId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n servers: this.parseJson(row.servers, 'servers'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAtZ || row.createdAt),\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\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 MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n createStorageErrorId,\n} from '@mastra/core/storage';\n\n/**\n * Local constant for the observational memory table name.\n * Defined locally to avoid a static import that crashes on older @mastra/core\n * versions that don't export TABLE_OBSERVATIONAL_MEMORY.\n */\nconst OM_TABLE = 'mastra_observational_memory' as const;\n\n/**\n * Try to import the OM schema statically. On older @mastra/core versions that\n * don't export OBSERVATIONAL_MEMORY_TABLE_SCHEMA this will be undefined,\n * and getExportDDL / init() will simply skip the OM table.\n */\nlet _omTableSchema: Record<string, Record<string, any>> | undefined;\ntry {\n const storage = require('@mastra/core/storage');\n _omTableSchema = storage.OBSERVATIONAL_MEMORY_TABLE_SCHEMA;\n} catch {\n // OM not available in this version of core\n}\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesByResourceIdInput,\n StorageListMessagesOutput,\n StorageListThreadsInput,\n StorageListThreadsOutput,\n CreateIndexOptions,\n StorageCloneThreadInput,\n StorageCloneThreadOutput,\n ThreadCloneMetadata,\n ObservationalMemoryRecord,\n BufferedObservationChunk,\n CreateObservationalMemoryInput,\n UpdateActiveObservationsInput,\n UpdateBufferedObservationsInput,\n SwapBufferedToActiveInput,\n SwapBufferedToActiveResult,\n UpdateBufferedReflectionInput,\n SwapBufferedReflectionToActiveInput,\n CreateReflectionGenerationInput,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport {\n PgDB,\n resolvePgConfig,\n generateTableSQL,\n generateIndexSQL,\n getSchemaName as dbGetSchemaName,\n getTableName as dbGetTableName,\n} from '../../db';\nimport type { PgDomainConfig } from '../../db';\n\n// Database row type that includes timezone-aware columns\ntype MessageRowFromDB = {\n id: string;\n content: string | any;\n role: string;\n type?: string;\n createdAt: Date | string;\n createdAtZ?: Date | string;\n threadId: string;\n resourceId: string;\n};\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const quotedIndexName = `\"${indexName}\"`;\n return schemaName ? `${schemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * Generate SQL placeholder string for IN clauses.\n * @param count - Number of placeholders to generate\n * @param startIndex - Starting index for placeholders (default: 1)\n * @returns Comma-separated placeholder string, e.g. \"$1, $2, $3\"\n */\nfunction inPlaceholders(count: number, startIndex = 1): string {\n return Array.from({ length: count }, (_, i) => `$${i + startIndex}`).join(', ');\n}\n\nexport class MemoryPG extends MemoryStorage {\n readonly supportsObservationalMemory = true;\n\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, OM_TABLE] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (MemoryPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_THREADS, schema: TABLE_SCHEMAS[TABLE_THREADS] });\n await this.#db.createTable({ tableName: TABLE_MESSAGES, schema: TABLE_SCHEMAS[TABLE_MESSAGES] });\n await this.#db.createTable({ tableName: TABLE_RESOURCES, schema: TABLE_SCHEMAS[TABLE_RESOURCES] });\n\n // Dynamically import OM schema to avoid breaking older @mastra/core versions\n let omSchema: Record<string, any> | undefined;\n try {\n const { OBSERVATIONAL_MEMORY_TABLE_SCHEMA } = await import('@mastra/core/storage');\n omSchema = OBSERVATIONAL_MEMORY_TABLE_SCHEMA?.[OM_TABLE];\n } catch {\n // OM not available in this version of core\n }\n\n if (omSchema) {\n await this.#db.createTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n });\n // Add new OM columns for backwards compatibility with existing databases\n await this.#db.alterTable({\n tableName: OM_TABLE as any,\n schema: omSchema,\n ifNotExists: [\n 'observedMessageIds',\n 'observedTimezone',\n 'bufferedObservations',\n 'bufferedObservationTokens',\n 'bufferedMessageIds',\n 'bufferedReflection',\n 'bufferedReflectionTokens',\n 'bufferedReflectionInputTokens',\n 'bufferedObservationChunks',\n 'isBufferingObservation',\n 'isBufferingReflection',\n 'lastBufferedAtTokens',\n 'lastBufferedAtTime',\n ],\n });\n }\n await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\n });\n if (omSchema) {\n // Create index on lookupKey for efficient OM queries\n const omTableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON ${omTableName} (\"lookupKey\")`);\n }\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Returns default index definitions for the memory domain tables.\n * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n */\n static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n return [\n {\n name: `${schemaPrefix}mastra_threads_resourceid_createdat_idx`,\n table: TABLE_THREADS,\n columns: ['resourceId', 'createdAt DESC'],\n },\n {\n name: `${schemaPrefix}mastra_messages_thread_id_createdat_idx`,\n table: TABLE_MESSAGES,\n columns: ['thread_id', 'createdAt DESC'],\n },\n ];\n }\n\n /**\n * Returns all DDL statements for this domain: tables (threads, messages, resources, OM), indexes.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n const quotedSchemaName = dbGetSchemaName(schemaName);\n\n // Tables: threads, messages, resources\n for (const tableName of [TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES] as const) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n }\n\n // Observational memory table (if schema available in this version of core)\n const omSchema = _omTableSchema?.[OM_TABLE];\n if (omSchema) {\n statements.push(\n generateTableSQL({\n tableName: OM_TABLE as any,\n schema: omSchema,\n schemaName,\n includeAllConstraints: true,\n }),\n );\n // idx_om_lookup_key index\n const fullOmTableName = dbGetTableName({ indexName: OM_TABLE, schemaName: quotedSchemaName });\n const idxPrefix = schemaPrefix ? `${schemaPrefix}` : '';\n statements.push(\n `CREATE INDEX IF NOT EXISTS \"${idxPrefix}idx_om_lookup_key\" ON ${fullOmTableName} (\"lookupKey\");`,\n );\n }\n\n // Default indexes\n for (const idx of MemoryPG.getDefaultIndexDefs(schemaPrefix)) {\n statements.push(generateIndexSQL(idx, schemaName));\n }\n\n return statements;\n }\n\n /**\n * Returns default index definitions for this instance's schema.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return MemoryPG.getDefaultIndexDefs(schemaPrefix);\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_MESSAGES });\n await this.#db.clearTable({ tableName: TABLE_THREADS });\n await this.#db.clearTable({ tableName: TABLE_RESOURCES });\n }\n\n /**\n * Normalizes message row from database by applying createdAtZ fallback\n */\n private normalizeMessageRow(row: MessageRowFromDB): Omit<MessageRowFromDB, 'createdAtZ'> {\n return {\n id: row.id,\n content: row.content,\n role: row.role,\n type: row.type,\n createdAt: row.createdAtZ || row.createdAt,\n threadId: row.threadId,\n resourceId: row.resourceId,\n };\n }\n\n async getThreadById({ threadId }: { threadId: string }): Promise<StorageThreadType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n\n const thread = await this.#db.client.oneOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n `SELECT * FROM ${tableName} WHERE id = $1`,\n [threadId],\n );\n\n if (!thread) {\n return null;\n }\n\n return {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAtZ || thread.createdAt,\n updatedAt: thread.updatedAtZ || thread.updatedAt,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_THREAD_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n public async listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput> {\n const { page = 0, perPage: perPageInput, orderBy, filter } = args;\n\n try {\n // Validate pagination input before normalization\n // This ensures page === 0 when perPageInput === false\n this.validatePaginationInput(page, perPageInput ?? 100);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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\n const perPage = normalizePerPage(perPageInput, 100);\n\n // Validate metadata keys to prevent SQL injection\n try {\n this.validateMetadataKeys(filter?.metadata);\n } catch (error) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 { field, direction } = this.parseOrderBy(orderBy);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const whereClauses: string[] = [];\n const queryParams: any[] = [];\n let paramIndex = 1;\n\n // Add resourceId filter if provided\n if (filter?.resourceId) {\n whereClauses.push(`\"resourceId\" = $${paramIndex}`);\n queryParams.push(filter.resourceId);\n paramIndex++;\n }\n\n // Add metadata filters if provided (AND logic)\n // Uses JSONB containment (@>) to avoid SQL injection and correctly match all value types including null\n // metadata column is TEXT type storing JSON, so we need to cast to jsonb first\n if (filter?.metadata && Object.keys(filter.metadata).length > 0) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n // Use JSONB containment operator - no key interpolation needed\n whereClauses.push(`metadata::jsonb @> $${paramIndex}::jsonb`);\n // Build a small JSON object for each key-value pair\n queryParams.push(JSON.stringify({ [key]: value }));\n paramIndex++;\n }\n }\n\n const whereClause = whereClauses.length > 0 ? `WHERE ${whereClauses.join(' AND ')}` : '';\n const baseQuery = `FROM ${tableName} ${whereClause}`;\n\n const countQuery = `SELECT COUNT(*) ${baseQuery}`;\n const countResult = await this.#db.client.one(countQuery, queryParams);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n // Select both standard and timezone-aware columns (*Z) for proper UTC timestamp handling\n const dataQuery = `SELECT id, \"resourceId\", title, metadata, \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\" ${baseQuery} ORDER BY \"${field}\" ${direction} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`;\n const rows = await this.#db.client.manyOrNone<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n dataQuery,\n [...queryParams, limitValue, offset],\n );\n\n const threads = (rows || []).map(thread => ({\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n // Use timezone-aware columns (*Z) for correct UTC timestamps, with fallback for legacy data\n createdAt: thread.createdAtZ || thread.createdAt,\n updatedAt: thread.updatedAtZ || thread.updatedAt,\n }));\n\n return {\n threads,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', '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 return {\n threads: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveThread({ thread }: { thread: StorageThreadType }): Promise<StorageThreadType> {\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id,\n \"resourceId\",\n title,\n metadata,\n \"createdAt\",\n \"createdAtZ\",\n \"updatedAt\",\n \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (id) DO UPDATE SET\n \"resourceId\" = EXCLUDED.\"resourceId\",\n title = EXCLUDED.title,\n metadata = EXCLUDED.metadata,\n \"createdAt\" = EXCLUDED.\"createdAt\",\n \"createdAtZ\" = EXCLUDED.\"createdAtZ\",\n \"updatedAt\" = EXCLUDED.\"updatedAt\",\n \"updatedAtZ\" = EXCLUDED.\"updatedAtZ\"`,\n [\n thread.id,\n thread.resourceId,\n thread.title,\n thread.metadata ? JSON.stringify(thread.metadata) : null,\n thread.createdAt,\n thread.createdAt,\n thread.updatedAt,\n thread.updatedAt,\n ],\n );\n\n return thread;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: thread.id,\n },\n },\n error,\n );\n }\n }\n\n async updateThread({\n id,\n title,\n metadata,\n }: {\n id: string;\n title: string;\n metadata: Record<string, unknown>;\n }): Promise<StorageThreadType> {\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const existingThread = await this.getThreadById({ threadId: id });\n if (!existingThread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread ${id} not found`,\n details: {\n threadId: id,\n title,\n },\n });\n }\n\n const mergedMetadata = {\n ...existingThread.metadata,\n ...metadata,\n };\n\n try {\n const now = new Date().toISOString();\n const thread = await this.#db.client.one<StorageThreadType & { createdAtZ: Date; updatedAtZ: Date }>(\n `UPDATE ${threadTableName}\n SET\n title = $1,\n metadata = $2,\n \"updatedAt\" = $3,\n \"updatedAtZ\" = $4\n WHERE id = $5\n RETURNING *\n `,\n [title, mergedMetadata, now, now, id],\n );\n\n return {\n id: thread.id,\n resourceId: thread.resourceId,\n title: thread.title,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAtZ || thread.createdAt,\n updatedAt: thread.updatedAtZ || thread.updatedAt,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: id,\n title,\n },\n },\n error,\n );\n }\n }\n\n async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.tx(async t => {\n await t.none(`DELETE FROM ${tableName} WHERE thread_id = $1`, [threadId]);\n\n const schemaName = this.#schema || 'public';\n const vectorTables = await t.manyOrNone<{ tablename: string }>(\n `\n SELECT tablename\n FROM pg_tables\n WHERE schemaname = $1\n AND (tablename = 'memory_messages' OR tablename LIKE 'memory_messages_%')\n `,\n [schemaName],\n );\n\n for (const { tablename } of vectorTables) {\n const vectorTableName = getTableName({ indexName: tablename, schemaName: getSchemaName(this.#schema) });\n await t.none(`DELETE FROM ${vectorTableName} WHERE metadata->>'thread_id' = $1`, [threadId]);\n }\n\n await t.none(`DELETE FROM ${threadTableName} WHERE id = $1`, [threadId]);\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Fetches messages around target messages using cursor-based pagination.\n *\n * This replaces the previous ROW_NUMBER() approach which caused severe performance\n * issues on large tables (see GitHub issue #11150). The old approach required\n * scanning and sorting ALL messages in a thread to assign row numbers.\n *\n * The new approach uses the existing (thread_id, createdAt) index to efficiently\n * fetch only the messages needed by using createdAt as a cursor.\n */\n private async _getIncludedMessages({ include }: { include: StorageListMessagesInput['include'] }) {\n if (!include || include.length === 0) return null;\n\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const selectColumns = `id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n\n // Build a single efficient query that fetches context for all target messages\n // For each target message, we fetch:\n // 1. The target message itself plus any previous messages (createdAt <= target)\n // 2. Any next messages after the target (createdAt > target)\n // Each subquery is wrapped in parentheses to allow ORDER BY within UNION ALL\n const unionQueries: string[] = [];\n const params: any[] = [];\n let paramIdx = 1;\n\n for (const inc of include) {\n const { id, withPreviousMessages = 0, withNextMessages = 0 } = inc;\n\n // Always fetch the target message, plus any requested previous messages\n // Uses createdAt <= target's createdAt, ordered DESC, limited to withPreviousMessages + 1\n // The +1 ensures we always get the target message itself\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = (SELECT thread_id FROM ${tableName} WHERE id = $${paramIdx})\n AND COALESCE(m.\"createdAtZ\", m.\"createdAt\") <= (SELECT COALESCE(\"createdAtZ\", \"createdAt\") FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY COALESCE(m.\"createdAtZ\", m.\"createdAt\") DESC\n LIMIT $${paramIdx + 1}\n )`);\n params.push(id, withPreviousMessages + 1); // +1 to include the target message itself\n paramIdx += 2;\n\n // Query for messages after the target (only if requested)\n // Uses createdAt > target's createdAt, ordered ASC, limited to withNextMessages\n if (withNextMessages > 0) {\n unionQueries.push(`(\n SELECT ${selectColumns}\n FROM ${tableName} m\n WHERE m.thread_id = (SELECT thread_id FROM ${tableName} WHERE id = $${paramIdx})\n AND COALESCE(m.\"createdAtZ\", m.\"createdAt\") > (SELECT COALESCE(\"createdAtZ\", \"createdAt\") FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY COALESCE(m.\"createdAtZ\", m.\"createdAt\") ASC\n LIMIT $${paramIdx + 1}\n )`);\n params.push(id, withNextMessages);\n paramIdx += 2;\n }\n }\n\n if (unionQueries.length === 0) return null;\n\n // When there's only one subquery, we don't need UNION ALL or an outer ORDER BY\n // (the subquery already has its own ORDER BY)\n // When there are multiple subqueries, we join them and sort the combined result\n let finalQuery: string;\n if (unionQueries.length === 1) {\n // Single query - just use it directly (remove outer parentheses for cleaner SQL)\n finalQuery = unionQueries[0]!.slice(1, -1); // Remove ( and )\n } else {\n // Multiple queries - UNION ALL and sort the result\n finalQuery = `SELECT * FROM (${unionQueries.join(' UNION ALL ')}) AS combined ORDER BY \"createdAt\" ASC`;\n }\n const includedRows = await this.#db.client.manyOrNone(finalQuery, params);\n\n // Deduplicate results (messages may appear in multiple context windows)\n const seen = new Set<string>();\n const dedupedRows = includedRows.filter(row => {\n if (seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n return dedupedRows;\n }\n\n private parseRow(row: MessageRowFromDB): MastraDBMessage {\n const normalized = this.normalizeMessageRow(row);\n let content = normalized.content;\n try {\n content = JSON.parse(normalized.content);\n } catch {\n // use content as is if it's not JSON\n }\n return {\n id: normalized.id,\n content,\n role: normalized.role as MastraDBMessage['role'],\n createdAt: new Date(normalized.createdAt as string),\n threadId: normalized.threadId,\n resourceId: normalized.resourceId,\n ...(normalized.type && normalized.type !== 'v2' ? { type: normalized.type } : {}),\n } satisfies MastraDBMessage;\n }\n\n public async listMessagesById({ messageIds }: { messageIds: string[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messageIds.length === 0) return { messages: [] };\n const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n\n try {\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const query = `\n ${selectStatement} FROM ${tableName}\n WHERE id IN (${inPlaceholders(messageIds.length)})\n ORDER BY \"createdAt\" DESC\n `;\n const resultRows = await this.#db.client.manyOrNone(query, messageIds);\n\n const list = new MessageList().add(\n resultRows.map(row => this.parseRow(row)) as (MastraMessageV1 | MastraDBMessage)[],\n 'memory',\n );\n return { messages: list.get.all.db() };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n messageIds: JSON.stringify(messageIds),\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException(mastraError);\n return { messages: [] };\n }\n }\n\n public async listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput> {\n const { threadId, resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n const threadIds = (Array.isArray(threadId) ? threadId : [threadId]).filter(\n (id): id is string => typeof id === 'string',\n );\n\n if (threadIds.length === 0 || threadIds.some(id => !id.trim())) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES', 'INVALID_THREAD_ID'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: Array.isArray(threadId) ? String(threadId) : String(threadId) },\n },\n new Error('threadId must be a non-empty string or array of non-empty strings'),\n );\n }\n\n if (page < 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'LIST_MESSAGES', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Page number must be non-negative',\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n page,\n },\n });\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n const conditions: string[] = [`thread_id IN (${inPlaceholders(threadIds.length)})`];\n const queryParams: any[] = [...threadIds];\n let paramIndex = threadIds.length + 1;\n\n if (resourceId) {\n conditions.push(`\"resourceId\" = $${paramIndex++}`);\n queryParams.push(resourceId);\n }\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${startOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.start);\n }\n\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`COALESCE(\"createdAtZ\", \"createdAt\") ${endOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.end);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const countQuery = `SELECT COUNT(*) FROM ${tableName} ${whereClause}`;\n const countResult = await this.#db.client.one(countQuery, queryParams);\n const total = parseInt(countResult.count, 10);\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataQuery = `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement} LIMIT $${paramIndex++} OFFSET $${paramIndex++}`;\n const rows = await this.#db.client.manyOrNone(dataQuery, [...queryParams, limitValue, offset]);\n const messages: MessageRowFromDB[] = [...(rows || [])];\n\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ include });\n if (includeMessages) {\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n const messagesWithParsedContent = messages.map(row => this.parseRow(row));\n\n const list = new MessageList().add(messagesWithParsedContent, 'memory');\n let finalMessages = list.get.all.db();\n\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n if (aValue == null && bValue == null) return a.id.localeCompare(b.id);\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const threadIdSet = new Set(threadIds);\n const returnedThreadMessageIds = new Set(\n finalMessages.filter(m => m.threadId && threadIdSet.has(m.threadId)).map(m => m.id),\n );\n const allThreadMessagesReturned = returnedThreadMessageIds.size >= total;\n const hasMore = perPageInput !== false && !allThreadMessagesReturned && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId: Array.isArray(threadId) ? threadId.join(',') : threadId,\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n public async listMessagesByResourceId(\n args: StorageListMessagesByResourceIdInput,\n ): Promise<StorageListMessagesOutput> {\n const { resourceId, include, filter, perPage: perPageInput, page = 0, orderBy } = args;\n\n // Validate that resourceId is provided\n const hasResourceId = resourceId !== undefined && resourceId !== null && resourceId.trim() !== '';\n if (!hasResourceId) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'INVALID_QUERY'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n resourceId: resourceId ?? '',\n },\n },\n new Error('resourceId is required'),\n );\n }\n\n // Validate page parameter\n if (page < 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'INVALID_PAGE'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: 'Page number must be non-negative',\n details: {\n resourceId,\n page,\n },\n });\n }\n\n const perPage = normalizePerPage(perPageInput, 40);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n try {\n const { field, direction } = this.parseOrderBy(orderBy, 'ASC');\n const orderByStatement = `ORDER BY \"${field}\" ${direction}`;\n\n const selectStatement = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"`;\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIndex = 1;\n\n // Add resourceId filter\n conditions.push(`\"resourceId\" = $${paramIndex++}`);\n queryParams.push(resourceId);\n\n if (filter?.dateRange?.start) {\n const startOp = filter.dateRange.startExclusive ? '>' : '>=';\n conditions.push(`\"createdAt\" ${startOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.start);\n }\n\n if (filter?.dateRange?.end) {\n const endOp = filter.dateRange.endExclusive ? '<' : '<=';\n conditions.push(`\"createdAt\" ${endOp} $${paramIndex++}`);\n queryParams.push(filter.dateRange.end);\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const countQuery = `SELECT COUNT(*) FROM ${tableName} ${whereClause}`;\n const countResult = await this.#db.client.one(countQuery, queryParams);\n const total = parseInt(countResult.count, 10);\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataQuery = `${selectStatement} FROM ${tableName} ${whereClause} ${orderByStatement} LIMIT $${paramIndex++} OFFSET $${paramIndex++}`;\n const rows = await this.#db.client.manyOrNone(dataQuery, [...queryParams, limitValue, offset]);\n const messages: MessageRowFromDB[] = [...(rows || [])];\n\n if (total === 0 && messages.length === 0 && (!include || include.length === 0)) {\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const messageIds = new Set(messages.map(m => m.id));\n if (include && include.length > 0) {\n const includeMessages = await this._getIncludedMessages({ include });\n if (includeMessages) {\n for (const includeMsg of includeMessages) {\n if (!messageIds.has(includeMsg.id)) {\n messages.push(includeMsg);\n messageIds.add(includeMsg.id);\n }\n }\n }\n }\n\n const messagesWithParsedContent = messages.map(row => this.parseRow(row));\n\n const list = new MessageList().add(messagesWithParsedContent, 'memory');\n let finalMessages = list.get.all.db();\n\n finalMessages = finalMessages.sort((a, b) => {\n const aValue = field === 'createdAt' ? new Date(a.createdAt).getTime() : (a as any)[field];\n const bValue = field === 'createdAt' ? new Date(b.createdAt).getTime() : (b as any)[field];\n\n if (aValue == null && bValue == null) return a.id.localeCompare(b.id);\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n\n if (aValue === bValue) {\n return a.id.localeCompare(b.id);\n }\n\n if (typeof aValue === 'number' && typeof bValue === 'number') {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n return direction === 'ASC'\n ? String(aValue).localeCompare(String(bValue))\n : String(bValue).localeCompare(String(aValue));\n });\n\n const hasMore = perPageInput !== false && offset + perPage < total;\n\n return {\n messages: finalMessages,\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n };\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_MESSAGES_BY_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId: resourceId ?? '',\n },\n },\n error,\n );\n this.logger?.error?.(mastraError.toString());\n this.logger?.trackException(mastraError);\n return {\n messages: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n }\n\n async saveMessages({ messages }: { messages: MastraDBMessage[] }): Promise<{ messages: MastraDBMessage[] }> {\n if (messages.length === 0) return { messages: [] };\n\n const threadId = messages[0]?.threadId;\n if (!threadId) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Thread ID is required`,\n });\n }\n\n const thread = await this.getThreadById({ threadId });\n if (!thread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n text: `Thread ${threadId} not found`,\n details: {\n threadId,\n },\n });\n }\n\n try {\n const tableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.tx(async t => {\n const messageInserts = messages.map(message => {\n if (!message.threadId) {\n throw new Error(\n `Expected to find a threadId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n if (!message.resourceId) {\n throw new Error(\n `Expected to find a resourceId for message, but couldn't find one. An unexpected error has occurred.`,\n );\n }\n return t.none(\n `INSERT INTO ${tableName} (id, thread_id, content, \"createdAt\", \"createdAtZ\", role, type, \"resourceId\")\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)\n ON CONFLICT (id) DO UPDATE SET\n thread_id = EXCLUDED.thread_id,\n content = EXCLUDED.content,\n role = EXCLUDED.role,\n type = EXCLUDED.type,\n \"resourceId\" = EXCLUDED.\"resourceId\"`,\n [\n message.id,\n message.threadId,\n typeof message.content === 'string' ? message.content : JSON.stringify(message.content),\n message.createdAt || new Date().toISOString(),\n message.createdAt || new Date().toISOString(),\n message.role,\n message.type || 'v2',\n message.resourceId,\n ],\n );\n });\n\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const nowStr = new Date().toISOString();\n const threadUpdate = t.none(\n `UPDATE ${threadTableName}\n SET\n \"updatedAt\" = $1,\n \"updatedAtZ\" = $2\n WHERE id = $3\n `,\n [nowStr, nowStr, threadId],\n );\n\n await Promise.all([...messageInserts, threadUpdate]);\n });\n\n const messagesWithParsedContent = 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\n const list = new MessageList().add(messagesWithParsedContent as (MastraMessageV1 | MastraDBMessage)[], 'memory');\n return { messages: list.get.all.db() };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n threadId,\n },\n },\n error,\n );\n }\n }\n\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.length === 0) {\n return [];\n }\n\n const messageIds = messages.map(m => m.id);\n\n const selectQuery = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\" FROM ${getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) })} WHERE id IN (${inPlaceholders(messageIds.length)})`;\n\n const existingMessagesDb = await this.#db.client.manyOrNone(selectQuery, messageIds);\n\n if (existingMessagesDb.length === 0) {\n return [];\n }\n\n const existingMessages: MastraDBMessage[] = existingMessagesDb.map(msg => {\n if (typeof msg.content === 'string') {\n try {\n msg.content = JSON.parse(msg.content);\n } catch {\n // ignore if not valid json\n }\n }\n return msg as MastraDBMessage;\n });\n\n const threadIdsToUpdate = new Set<string>();\n\n await this.#db.client.tx(async t => {\n const queries = [];\n const columnMapping: Record<string, string> = {\n threadId: 'thread_id',\n };\n\n for (const existingMessage of existingMessages) {\n const updatePayload = messages.find(m => m.id === existingMessage.id);\n if (!updatePayload) continue;\n\n const { id, ...fieldsToUpdate } = updatePayload;\n if (Object.keys(fieldsToUpdate).length === 0) continue;\n\n threadIdsToUpdate.add(existingMessage.threadId!);\n if (updatePayload.threadId && updatePayload.threadId !== existingMessage.threadId) {\n threadIdsToUpdate.add(updatePayload.threadId);\n }\n\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n const updatableFields = { ...fieldsToUpdate };\n\n if (updatableFields.content) {\n const newContent = {\n ...existingMessage.content,\n ...updatableFields.content,\n ...(existingMessage.content?.metadata && updatableFields.content.metadata\n ? {\n metadata: {\n ...existingMessage.content.metadata,\n ...updatableFields.content.metadata,\n },\n }\n : {}),\n };\n setClauses.push(`content = $${paramIndex++}`);\n values.push(newContent);\n delete updatableFields.content;\n }\n\n for (const key in updatableFields) {\n if (Object.prototype.hasOwnProperty.call(updatableFields, key)) {\n const dbColumn = columnMapping[key] || key;\n setClauses.push(`\"${dbColumn}\" = $${paramIndex++}`);\n values.push(updatableFields[key as keyof typeof updatableFields]);\n }\n }\n\n if (setClauses.length > 0) {\n values.push(id);\n const sql = `UPDATE ${getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) })} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`;\n queries.push(t.none(sql, values));\n }\n }\n\n if (threadIdsToUpdate.size > 0) {\n const threadIds = Array.from(threadIdsToUpdate);\n queries.push(\n t.none(\n `UPDATE ${getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) })} SET \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id IN (${inPlaceholders(threadIds.length)})`,\n threadIds,\n ),\n );\n }\n\n if (queries.length > 0) {\n await t.batch(queries);\n }\n });\n\n const updatedMessages = await this.#db.client.manyOrNone<MessageRowFromDB>(selectQuery, messageIds);\n\n return (updatedMessages || []).map((row: MessageRowFromDB) => {\n const message = this.normalizeMessageRow(row);\n if (typeof message.content === 'string') {\n try {\n return { ...message, content: JSON.parse(message.content) } as MastraDBMessage;\n } catch {\n /* ignore */\n }\n }\n return message as MastraDBMessage;\n });\n }\n\n async deleteMessages(messageIds: string[]): Promise<void> {\n if (!messageIds || messageIds.length === 0) {\n return;\n }\n\n try {\n const messageTableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n\n await this.#db.client.tx(async t => {\n const placeholders = messageIds.map((_, idx) => `$${idx + 1}`).join(',');\n const messages = await t.manyOrNone(\n `SELECT DISTINCT thread_id FROM ${messageTableName} WHERE id IN (${placeholders})`,\n messageIds,\n );\n\n const threadIds = messages?.map(msg => msg.thread_id).filter(Boolean) || [];\n\n await t.none(`DELETE FROM ${messageTableName} WHERE id IN (${placeholders})`, messageIds);\n\n if (threadIds.length > 0) {\n const updatePromises = threadIds.map(threadId =>\n t.none(`UPDATE ${threadTableName} SET \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id = $1`, [threadId]),\n );\n await Promise.all(updatePromises);\n }\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_MESSAGES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { messageIds: messageIds.join(', ') },\n },\n error,\n );\n }\n }\n\n async getResourceById({ resourceId }: { resourceId: string }): Promise<StorageResourceType | null> {\n const tableName = getTableName({ indexName: TABLE_RESOURCES, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone<StorageResourceType & { createdAtZ: Date; updatedAtZ: Date }>(\n `SELECT * FROM ${tableName} WHERE id = $1`,\n [resourceId],\n );\n\n if (!result) {\n return null;\n }\n\n return {\n id: result.id,\n createdAt: result.createdAtZ || result.createdAt,\n updatedAt: result.updatedAtZ || result.updatedAt,\n workingMemory: result.workingMemory,\n metadata: typeof result.metadata === 'string' ? JSON.parse(result.metadata) : result.metadata,\n };\n }\n\n async saveResource({ resource }: { resource: StorageResourceType }): Promise<StorageResourceType> {\n await this.#db.insert({\n tableName: TABLE_RESOURCES,\n record: {\n ...resource,\n metadata: JSON.stringify(resource.metadata),\n },\n });\n\n return resource;\n }\n\n async updateResource({\n resourceId,\n workingMemory,\n metadata,\n }: {\n resourceId: string;\n workingMemory?: string;\n metadata?: Record<string, unknown>;\n }): Promise<StorageResourceType> {\n const existingResource = await this.getResourceById({ resourceId });\n\n if (!existingResource) {\n const newResource: StorageResourceType = {\n id: resourceId,\n workingMemory,\n metadata: metadata || {},\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n return this.saveResource({ resource: newResource });\n }\n\n const updatedResource = {\n ...existingResource,\n workingMemory: workingMemory !== undefined ? workingMemory : existingResource.workingMemory,\n metadata: {\n ...existingResource.metadata,\n ...metadata,\n },\n updatedAt: new Date(),\n };\n\n const tableName = getTableName({ indexName: TABLE_RESOURCES, schemaName: getSchemaName(this.#schema) });\n\n const updates: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (workingMemory !== undefined) {\n updates.push(`\"workingMemory\" = $${paramIndex}`);\n values.push(workingMemory);\n paramIndex++;\n }\n\n if (metadata) {\n updates.push(`metadata = $${paramIndex}`);\n values.push(JSON.stringify(updatedResource.metadata));\n paramIndex++;\n }\n\n const updatedAtStr = updatedResource.updatedAt.toISOString();\n updates.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(updatedAtStr);\n updates.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(updatedAtStr);\n\n values.push(resourceId);\n\n await this.#db.client.none(`UPDATE ${tableName} SET ${updates.join(', ')} WHERE id = $${paramIndex}`, values);\n\n return updatedResource;\n }\n\n async cloneThread(args: StorageCloneThreadInput): Promise<StorageCloneThreadOutput> {\n const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;\n\n // Get the source thread\n const sourceThread = await this.getThreadById({ threadId: sourceThreadId });\n if (!sourceThread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'CLONE_THREAD', 'SOURCE_NOT_FOUND'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Source thread with id ${sourceThreadId} not found`,\n details: { sourceThreadId },\n });\n }\n\n // Use provided ID or generate a new one\n const newThreadId = providedThreadId || crypto.randomUUID();\n\n // Check if the new thread ID already exists\n const existingThread = await this.getThreadById({ threadId: newThreadId });\n if (existingThread) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'CLONE_THREAD', 'THREAD_EXISTS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n text: `Thread with id ${newThreadId} already exists`,\n details: { newThreadId },\n });\n }\n\n const threadTableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const messageTableName = getTableName({ indexName: TABLE_MESSAGES, schemaName: getSchemaName(this.#schema) });\n\n try {\n return await this.#db.client.tx(async t => {\n // Build message query with filters\n let messageQuery = `SELECT id, content, role, type, \"createdAt\", \"createdAtZ\", thread_id AS \"threadId\", \"resourceId\"\n FROM ${messageTableName} WHERE thread_id = $1`;\n const messageParams: any[] = [sourceThreadId];\n let paramIndex = 2;\n\n // Apply date filters\n if (options?.messageFilter?.startDate) {\n messageQuery += ` AND COALESCE(\"createdAtZ\", \"createdAt\") >= $${paramIndex++}`;\n messageParams.push(options.messageFilter.startDate);\n }\n if (options?.messageFilter?.endDate) {\n messageQuery += ` AND COALESCE(\"createdAtZ\", \"createdAt\") <= $${paramIndex++}`;\n messageParams.push(options.messageFilter.endDate);\n }\n\n // Apply message ID filter\n if (options?.messageFilter?.messageIds && options.messageFilter.messageIds.length > 0) {\n messageQuery += ` AND id IN (${options.messageFilter.messageIds.map(() => `$${paramIndex++}`).join(', ')})`;\n messageParams.push(...options.messageFilter.messageIds);\n }\n\n messageQuery += ` ORDER BY \"createdAt\" ASC`;\n\n // Apply message limit (from most recent, so we need to reverse order for limit then sort back)\n if (options?.messageLimit && options.messageLimit > 0) {\n // Get messages ordered DESC to get most recent, limited, then we'll reverse\n const limitQuery = `SELECT * FROM (${messageQuery.replace('ORDER BY \"createdAt\" ASC', 'ORDER BY \"createdAt\" DESC')} LIMIT $${paramIndex}) AS limited ORDER BY \"createdAt\" ASC`;\n messageParams.push(options.messageLimit);\n messageQuery = limitQuery;\n }\n\n const sourceMessages = await t.manyOrNone<MessageRowFromDB>(messageQuery, messageParams);\n\n const now = new Date();\n\n // Determine the last message ID for clone metadata\n const lastMessageId = sourceMessages.length > 0 ? sourceMessages[sourceMessages.length - 1]!.id : undefined;\n\n // Create clone metadata\n const cloneMetadata: ThreadCloneMetadata = {\n sourceThreadId,\n clonedAt: now,\n ...(lastMessageId && { lastMessageId }),\n };\n\n // Create the new thread\n const newThread: StorageThreadType = {\n id: newThreadId,\n resourceId: resourceId || sourceThread.resourceId,\n title: title || (sourceThread.title ? `Clone of ${sourceThread.title}` : undefined),\n metadata: {\n ...metadata,\n clone: cloneMetadata,\n },\n createdAt: now,\n updatedAt: now,\n };\n\n // Insert the new thread\n await t.none(\n `INSERT INTO ${threadTableName} (\n id,\n \"resourceId\",\n title,\n metadata,\n \"createdAt\",\n \"createdAtZ\",\n \"updatedAt\",\n \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,\n [\n newThread.id,\n newThread.resourceId,\n newThread.title,\n newThread.metadata ? JSON.stringify(newThread.metadata) : null,\n now,\n now,\n now,\n now,\n ],\n );\n\n // Clone messages with new IDs\n const clonedMessages: MastraDBMessage[] = [];\n const targetResourceId = resourceId || sourceThread.resourceId;\n\n for (const sourceMsg of sourceMessages) {\n const newMessageId = crypto.randomUUID();\n const normalizedMsg = this.normalizeMessageRow(sourceMsg);\n let parsedContent = normalizedMsg.content;\n try {\n parsedContent = JSON.parse(normalizedMsg.content);\n } catch {\n // use content as is\n }\n\n await t.none(\n `INSERT INTO ${messageTableName} (id, thread_id, content, \"createdAt\", \"createdAtZ\", role, type, \"resourceId\")\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,\n [\n newMessageId,\n newThreadId,\n typeof normalizedMsg.content === 'string' ? normalizedMsg.content : JSON.stringify(normalizedMsg.content),\n normalizedMsg.createdAt,\n normalizedMsg.createdAt,\n normalizedMsg.role,\n normalizedMsg.type || 'v2',\n targetResourceId,\n ],\n );\n\n clonedMessages.push({\n id: newMessageId,\n threadId: newThreadId,\n content: parsedContent,\n role: normalizedMsg.role as MastraDBMessage['role'],\n type: normalizedMsg.type,\n createdAt: new Date(normalizedMsg.createdAt as string),\n resourceId: targetResourceId,\n });\n }\n\n return {\n thread: newThread,\n clonedMessages,\n };\n });\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CLONE_THREAD', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { sourceThreadId, newThreadId },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Observational Memory Methods\n // ============================================\n\n private getOMKey(threadId: string | null, resourceId: string): string {\n return threadId ? `thread:${threadId}` : `resource:${resourceId}`;\n }\n\n private parseOMRow(row: any): ObservationalMemoryRecord {\n // OM is a new table - use timezone-aware columns (*Z) directly (no legacy fallback needed)\n return {\n id: row.id,\n scope: row.scope,\n threadId: row.threadId || null,\n resourceId: row.resourceId,\n createdAt: new Date(row.createdAtZ),\n updatedAt: new Date(row.updatedAtZ),\n lastObservedAt: row.lastObservedAtZ ? new Date(row.lastObservedAtZ) : undefined,\n originType: row.originType || 'initial',\n generationCount: Number(row.generationCount || 0),\n activeObservations: row.activeObservations || '',\n // Handle new chunk-based structure\n bufferedObservationChunks: row.bufferedObservationChunks\n ? typeof row.bufferedObservationChunks === 'string'\n ? JSON.parse(row.bufferedObservationChunks)\n : row.bufferedObservationChunks\n : undefined,\n // Deprecated fields (for backward compatibility)\n bufferedObservations: row.activeObservationsPendingUpdate || undefined,\n bufferedObservationTokens: row.bufferedObservationTokens ? Number(row.bufferedObservationTokens) : undefined,\n bufferedMessageIds: undefined, // Use bufferedObservationChunks instead\n bufferedReflection: row.bufferedReflection || undefined,\n bufferedReflectionTokens: row.bufferedReflectionTokens ? Number(row.bufferedReflectionTokens) : undefined,\n bufferedReflectionInputTokens: row.bufferedReflectionInputTokens\n ? Number(row.bufferedReflectionInputTokens)\n : undefined,\n reflectedObservationLineCount: row.reflectedObservationLineCount\n ? Number(row.reflectedObservationLineCount)\n : undefined,\n totalTokensObserved: Number(row.totalTokensObserved || 0),\n observationTokenCount: Number(row.observationTokenCount || 0),\n pendingMessageTokens: Number(row.pendingMessageTokens || 0),\n isReflecting: Boolean(row.isReflecting),\n isObserving: Boolean(row.isObserving),\n isBufferingObservation: row.isBufferingObservation === true || row.isBufferingObservation === 'true',\n isBufferingReflection: row.isBufferingReflection === true || row.isBufferingReflection === 'true',\n lastBufferedAtTokens:\n typeof row.lastBufferedAtTokens === 'number'\n ? row.lastBufferedAtTokens\n : parseInt(String(row.lastBufferedAtTokens ?? '0'), 10) || 0,\n lastBufferedAtTime: row.lastBufferedAtTime ? new Date(String(row.lastBufferedAtTime)) : null,\n config: row.config ? (typeof row.config === 'string' ? JSON.parse(row.config) : row.config) : {},\n metadata: row.metadata ? (typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata) : undefined,\n observedMessageIds: row.observedMessageIds\n ? typeof row.observedMessageIds === 'string'\n ? JSON.parse(row.observedMessageIds)\n : row.observedMessageIds\n : undefined,\n observedTimezone: row.observedTimezone || undefined,\n };\n }\n\n async getObservationalMemory(threadId: string | null, resourceId: string): Promise<ObservationalMemoryRecord | null> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"lookupKey\" = $1 ORDER BY \"generationCount\" DESC LIMIT 1`,\n [lookupKey],\n );\n if (!result) return null;\n return this.parseOMRow(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async getObservationalMemoryHistory(\n threadId: string | null,\n resourceId: string,\n limit: number = 10,\n ): Promise<ObservationalMemoryRecord[]> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"lookupKey\" = $1 ORDER BY \"generationCount\" DESC LIMIT $2`,\n [lookupKey, limit],\n );\n if (!result) return [];\n return result.map(row => this.parseOMRow(row));\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_OBSERVATIONAL_MEMORY_HISTORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId, limit },\n },\n error,\n );\n }\n }\n\n async initializeObservationalMemory(input: CreateObservationalMemoryInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.threadId, input.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.scope,\n threadId: input.threadId,\n resourceId: input.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: undefined,\n originType: 'initial',\n generationCount: 0,\n activeObservations: '',\n totalTokensObserved: 0,\n observationTokenCount: 0,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.config,\n observedTimezone: input.observedTimezone,\n };\n\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = now.toISOString();\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`,\n [\n id,\n lookupKey,\n input.scope,\n input.resourceId,\n input.threadId || null,\n '',\n null,\n 'initial',\n JSON.stringify(input.config),\n 0,\n null, // lastObservedAt\n null, // lastObservedAtZ\n null, // lastReflectionAt\n null, // lastReflectionAtZ\n 0,\n 0,\n 0,\n false,\n false,\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n input.observedTimezone || null,\n nowStr, // createdAt\n nowStr, // createdAtZ\n nowStr, // updatedAt\n nowStr, // updatedAtZ\n ],\n );\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INITIALIZE_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId: input.threadId, resourceId: input.resourceId },\n },\n error,\n );\n }\n }\n\n async updateActiveObservations(input: UpdateActiveObservationsInput): Promise<void> {\n try {\n const now = new Date();\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n\n const lastObservedAtStr = input.lastObservedAt.toISOString();\n const nowStr = now.toISOString();\n const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"activeObservations\" = $1,\n \"lastObservedAt\" = $2,\n \"lastObservedAtZ\" = $3,\n \"pendingMessageTokens\" = 0,\n \"observationTokenCount\" = $4,\n \"totalTokensObserved\" = \"totalTokensObserved\" + $5,\n \"observedMessageIds\" = $6,\n \"updatedAt\" = $7,\n \"updatedAtZ\" = $8\n WHERE id = $9`,\n [\n input.observations,\n lastObservedAtStr,\n lastObservedAtStr,\n Math.round(input.tokenCount),\n Math.round(input.tokenCount),\n observedMessageIdsJson,\n nowStr,\n nowStr,\n input.id,\n ],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_ACTIVE_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_ACTIVE_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async createReflectionGeneration(input: CreateReflectionGenerationInput): Promise<ObservationalMemoryRecord> {\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n const lookupKey = this.getOMKey(input.currentRecord.threadId, input.currentRecord.resourceId);\n\n const record: ObservationalMemoryRecord = {\n id,\n scope: input.currentRecord.scope,\n threadId: input.currentRecord.threadId,\n resourceId: input.currentRecord.resourceId,\n createdAt: now,\n updatedAt: now,\n lastObservedAt: input.currentRecord.lastObservedAt,\n originType: 'reflection',\n generationCount: input.currentRecord.generationCount + 1,\n activeObservations: input.reflection,\n totalTokensObserved: input.currentRecord.totalTokensObserved,\n observationTokenCount: input.tokenCount,\n pendingMessageTokens: 0,\n isReflecting: false,\n isObserving: false,\n isBufferingObservation: false,\n isBufferingReflection: false,\n lastBufferedAtTokens: 0,\n lastBufferedAtTime: null,\n config: input.currentRecord.config,\n metadata: input.currentRecord.metadata,\n observedTimezone: input.currentRecord.observedTimezone,\n };\n\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = now.toISOString();\n const lastObservedAtStr = record.lastObservedAt?.toISOString() || null;\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"lookupKey\", scope, \"resourceId\", \"threadId\",\n \"activeObservations\", \"activeObservationsPendingUpdate\",\n \"originType\", config, \"generationCount\", \"lastObservedAt\", \"lastObservedAtZ\", \"lastReflectionAt\", \"lastReflectionAtZ\",\n \"pendingMessageTokens\", \"totalTokensObserved\", \"observationTokenCount\",\n \"isObserving\", \"isReflecting\", \"isBufferingObservation\", \"isBufferingReflection\", \"lastBufferedAtTokens\", \"lastBufferedAtTime\",\n \"observedTimezone\", \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`,\n [\n id,\n lookupKey,\n record.scope,\n record.resourceId,\n record.threadId || null,\n input.reflection,\n null,\n 'reflection',\n JSON.stringify(record.config),\n input.currentRecord.generationCount + 1,\n lastObservedAtStr, // lastObservedAt\n lastObservedAtStr, // lastObservedAtZ\n nowStr, // lastReflectionAt\n nowStr, // lastReflectionAtZ\n record.pendingMessageTokens,\n Math.round(record.totalTokensObserved),\n Math.round(record.observationTokenCount),\n false, // isObserving\n false, // isReflecting\n false, // isBufferingObservation\n false, // isBufferingReflection\n 0, // lastBufferedAtTokens\n null, // lastBufferedAtTime\n record.observedTimezone || null,\n nowStr, // createdAt\n nowStr, // createdAtZ\n nowStr, // updatedAt\n nowStr, // updatedAtZ\n ],\n );\n\n return record;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_REFLECTION_GENERATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { currentRecordId: input.currentRecord.id },\n },\n error,\n );\n }\n }\n\n async setReflectingFlag(id: string, isReflecting: boolean): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \"isReflecting\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n [isReflecting, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_REFLECTING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_REFLECTING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isReflecting },\n },\n error,\n );\n }\n }\n\n async setObservingFlag(id: string, isObserving: boolean): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \"isObserving\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n [isObserving, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_OBSERVING_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_OBSERVING_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isObserving },\n },\n error,\n );\n }\n }\n\n async setBufferingObservationFlag(id: string, isBuffering: boolean, lastBufferedAtTokens?: number): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n let query: string;\n let values: any[];\n\n if (lastBufferedAtTokens !== undefined) {\n query = `UPDATE ${tableName} SET \"isBufferingObservation\" = $1, \"lastBufferedAtTokens\" = $2, \"updatedAt\" = $3, \"updatedAtZ\" = $4 WHERE id = $5`;\n values = [isBuffering, Math.round(lastBufferedAtTokens), nowStr, nowStr, id];\n } else {\n query = `UPDATE ${tableName} SET \"isBufferingObservation\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`;\n values = [isBuffering, nowStr, nowStr, id];\n }\n\n const result = await this.#db.client.query(query, values);\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_BUFFERING_OBSERVATION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_BUFFERING_OBSERVATION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering, lastBufferedAtTokens: lastBufferedAtTokens ?? null },\n },\n error,\n );\n }\n }\n\n async setBufferingReflectionFlag(id: string, isBuffering: boolean): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \"isBufferingReflection\" = $1, \"updatedAt\" = $2, \"updatedAtZ\" = $3 WHERE id = $4`,\n [isBuffering, nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_BUFFERING_REFLECTION_FLAG', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_BUFFERING_REFLECTION_FLAG', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, isBuffering },\n },\n error,\n );\n }\n }\n\n async clearObservationalMemory(threadId: string | null, resourceId: string): Promise<void> {\n try {\n const lookupKey = this.getOMKey(threadId, resourceId);\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"lookupKey\" = $1`, [lookupKey]);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CLEAR_OBSERVATIONAL_MEMORY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { threadId, resourceId },\n },\n error,\n );\n }\n }\n\n async setPendingMessageTokens(id: string, tokenCount: number): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET \n \"pendingMessageTokens\" = $1, \n \"updatedAt\" = $2,\n \"updatedAtZ\" = $3\n WHERE id = $4`,\n [Math.round(tokenCount), nowStr, nowStr, id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SET_PENDING_MESSAGE_TOKENS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SET_PENDING_MESSAGE_TOKENS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id, tokenCount },\n },\n error,\n );\n }\n }\n\n // ============================================\n // Async Buffering Methods\n // ============================================\n\n async updateBufferedObservations(input: UpdateBufferedObservationsInput): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n // Create new chunk with ID and timestamp\n const newChunk: BufferedObservationChunk = {\n id: `ombuf-${randomUUID()}`,\n cycleId: input.chunk.cycleId,\n observations: input.chunk.observations,\n tokenCount: Math.round(input.chunk.tokenCount),\n messageIds: input.chunk.messageIds,\n messageTokens: Math.round(input.chunk.messageTokens ?? 0),\n lastObservedAt: input.chunk.lastObservedAt,\n createdAt: new Date(),\n suggestedContinuation: input.chunk.suggestedContinuation,\n currentTask: input.chunk.currentTask,\n };\n\n // Append chunk to existing array using JSONB concatenation\n const lastBufferedAtTime = input.lastBufferedAtTime ? input.lastBufferedAtTime.toISOString() : null;\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"bufferedObservationChunks\" = COALESCE(\"bufferedObservationChunks\", '[]'::jsonb) || $1::jsonb,\n \"lastBufferedAtTime\" = COALESCE($2, \"lastBufferedAtTime\"),\n \"updatedAt\" = $3,\n \"updatedAtZ\" = $4\n WHERE id = $5`,\n [JSON.stringify([newChunk]), lastBufferedAtTime, nowStr, nowStr, input.id],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_OBSERVATIONS', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_OBSERVATIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedToActive(input: SwapBufferedToActiveInput): Promise<SwapBufferedToActiveResult> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n // Get current record\n const record = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [input.id]);\n if (!record) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n\n // Parse buffered chunks\n let chunks: BufferedObservationChunk[] = [];\n if (record.bufferedObservationChunks) {\n try {\n const parsed =\n typeof record.bufferedObservationChunks === 'string'\n ? JSON.parse(record.bufferedObservationChunks)\n : record.bufferedObservationChunks;\n chunks = Array.isArray(parsed) ? parsed : [];\n } catch {\n chunks = [];\n }\n }\n\n if (chunks.length === 0) {\n return {\n chunksActivated: 0,\n messageTokensActivated: 0,\n observationTokensActivated: 0,\n messagesActivated: 0,\n activatedCycleIds: [],\n activatedMessageIds: [],\n };\n }\n\n // Calculate target message tokens to activate based on new formula:\n // retentionFloor = threshold * (1 - ratio) represents tokens to keep as raw messages\n // targetMessageTokens = max(0, currentPending - retentionFloor) represents tokens to activate\n const retentionFloor = input.messageTokensThreshold * (1 - input.activationRatio);\n const targetMessageTokens = Math.max(0, input.currentPendingTokens - retentionFloor);\n\n // Find the closest chunk boundary to the target, biased under\n let cumulativeMessageTokens = 0;\n let chunksToActivate = 0;\n let bestBoundary = 0;\n let bestBoundaryMessageTokens = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n cumulativeMessageTokens += chunks[i]!.messageTokens ?? 0;\n const boundary = i + 1;\n\n // Prefer boundaries that are under the target (leaves more raw messages in context)\n // Only go over if there's no under option\n const isUnder = cumulativeMessageTokens <= targetMessageTokens;\n const bestIsUnder = bestBoundaryMessageTokens <= targetMessageTokens;\n\n if (bestBoundary === 0) {\n // First boundary, take it\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n } else if (isUnder && !bestIsUnder) {\n // Current is under, best is over - prefer under\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n } else if (isUnder && bestIsUnder) {\n // Both under - prefer the one closer to target (higher)\n if (cumulativeMessageTokens > bestBoundaryMessageTokens) {\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n }\n } else if (!isUnder && !bestIsUnder) {\n // Both over - prefer the one closer to target (lower)\n if (cumulativeMessageTokens < bestBoundaryMessageTokens) {\n bestBoundary = boundary;\n bestBoundaryMessageTokens = cumulativeMessageTokens;\n }\n }\n // If current is over and best is under, keep best (do nothing)\n }\n\n // If bestBoundary is 0 (no boundary under target), activate at least 1 chunk\n // since we've reached threshold and need to clear some context\n chunksToActivate = bestBoundary === 0 ? 1 : bestBoundary;\n\n // Split chunks\n const activatedChunks = chunks.slice(0, chunksToActivate);\n const remainingChunks = chunks.slice(chunksToActivate);\n\n // Combine activated observations\n const activatedContent = activatedChunks.map(c => c.observations).join('\\n\\n');\n const activatedTokens = Math.round(activatedChunks.reduce((sum, c) => sum + c.tokenCount, 0));\n const activatedMessageTokens = Math.round(activatedChunks.reduce((sum, c) => sum + (c.messageTokens ?? 0), 0));\n const activatedMessageCount = activatedChunks.reduce((sum, c) => sum + c.messageIds.length, 0);\n const activatedCycleIds = activatedChunks.map(c => c.cycleId).filter((id): id is string => !!id);\n const activatedMessageIds = activatedChunks.flatMap(c => c.messageIds ?? []);\n\n // Derive lastObservedAt from the latest activated chunk, or use provided value\n const latestChunk = activatedChunks[activatedChunks.length - 1];\n const lastObservedAt =\n input.lastObservedAt ?? (latestChunk?.lastObservedAt ? new Date(latestChunk.lastObservedAt) : new Date());\n const lastObservedAtStr = lastObservedAt.toISOString();\n\n // NOTE: We intentionally do NOT add message IDs to observedMessageIds during buffered activation.\n // Buffered chunks represent observations of messages as they were at buffering time.\n // With streaming, messages grow after buffering, so we rely on lastObservedAt for filtering.\n // New content after lastObservedAt will be picked up in subsequent observations.\n\n // Atomic update\n await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"activeObservations\" = CASE \n WHEN \"activeObservations\" IS NOT NULL AND \"activeObservations\" != '' \n THEN \"activeObservations\" || E'\\\\n\\\\n' || $1\n ELSE $1\n END,\n \"observationTokenCount\" = COALESCE(\"observationTokenCount\", 0) + $2,\n \"pendingMessageTokens\" = GREATEST(0, COALESCE(\"pendingMessageTokens\", 0) - $3),\n \"bufferedObservationChunks\" = $4,\n \"lastObservedAt\" = $5,\n \"lastObservedAtZ\" = $6,\n \"updatedAt\" = $7,\n \"updatedAtZ\" = $8\n WHERE id = $9`,\n [\n activatedContent,\n activatedTokens,\n activatedMessageTokens,\n remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,\n lastObservedAtStr,\n lastObservedAtStr,\n nowStr,\n nowStr,\n input.id,\n ],\n );\n\n return {\n chunksActivated: activatedChunks.length,\n messageTokensActivated: activatedMessageTokens,\n observationTokensActivated: activatedTokens,\n messagesActivated: activatedMessageCount,\n activatedCycleIds,\n activatedMessageIds,\n observations: activatedContent,\n perChunk: activatedChunks.map(c => ({\n cycleId: c.cycleId ?? '',\n messageTokens: c.messageTokens ?? 0,\n observationTokens: c.tokenCount,\n messageCount: c.messageIds.length,\n observations: c.observations,\n })),\n };\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async updateBufferedReflection(input: UpdateBufferedReflectionInput): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n const nowStr = new Date().toISOString();\n\n // Append reflection to existing buffered content\n const result = await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"bufferedReflection\" = CASE \n WHEN \"bufferedReflection\" IS NOT NULL AND \"bufferedReflection\" != '' \n THEN \"bufferedReflection\" || E'\\\\n\\\\n' || $1\n ELSE $1\n END,\n \"bufferedReflectionTokens\" = COALESCE(\"bufferedReflectionTokens\", 0) + $2,\n \"bufferedReflectionInputTokens\" = COALESCE(\"bufferedReflectionInputTokens\", 0) + $3,\n \"reflectedObservationLineCount\" = $4,\n \"updatedAt\" = $5,\n \"updatedAtZ\" = $6\n WHERE id = $7`,\n [\n input.reflection,\n Math.round(input.tokenCount),\n Math.round(input.inputTokenCount),\n input.reflectedObservationLineCount,\n nowStr,\n nowStr,\n input.id,\n ],\n );\n\n if (result.rowCount === 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_REFLECTION', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n });\n }\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_BUFFERED_REFLECTION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.id },\n },\n error,\n );\n }\n }\n\n async swapBufferedReflectionToActive(input: SwapBufferedReflectionToActiveInput): Promise<ObservationalMemoryRecord> {\n try {\n const tableName = getTableName({\n indexName: OM_TABLE,\n schemaName: getSchemaName(this.#schema),\n });\n\n // Get current record to calculate split\n const record = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [\n input.currentRecord.id,\n ]);\n if (!record) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NOT_FOUND'),\n text: `Observational memory record not found: ${input.currentRecord.id}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n });\n }\n\n const bufferedReflection = record.bufferedReflection || '';\n const reflectedLineCount = Number(record.reflectedObservationLineCount || 0);\n\n if (!bufferedReflection) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'NO_CONTENT'),\n text: 'No buffered reflection to swap',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { id: input.currentRecord.id },\n });\n }\n\n // Split current activeObservations by the recorded boundary.\n // Lines 0..reflectedLineCount were reflected on → replaced by bufferedReflection.\n // Lines after reflectedLineCount were added after reflection started → kept as-is.\n const currentObservations = (record.activeObservations as string) || '';\n const allLines = currentObservations.split('\\n');\n const unreflectedLines = allLines.slice(reflectedLineCount);\n const unreflectedContent = unreflectedLines.join('\\n').trim();\n\n // New activeObservations = bufferedReflection + unreflected observations\n const newObservations = unreflectedContent\n ? `${bufferedReflection}\\n\\n${unreflectedContent}`\n : bufferedReflection;\n\n // Create new generation with the merged content.\n // tokenCount is computed by the processor using its token counter on the combined content.\n const newRecord = await this.createReflectionGeneration({\n currentRecord: input.currentRecord,\n reflection: newObservations,\n tokenCount: input.tokenCount,\n });\n\n // Clear buffered state on old record\n const nowStr = new Date().toISOString();\n await this.#db.client.query(\n `UPDATE ${tableName} SET\n \"bufferedReflection\" = NULL,\n \"bufferedReflectionTokens\" = NULL,\n \"bufferedReflectionInputTokens\" = NULL,\n \"reflectedObservationLineCount\" = NULL,\n \"updatedAt\" = $1,\n \"updatedAtZ\" = $2\n WHERE id = $3`,\n [nowStr, nowStr, input.currentRecord.id],\n );\n\n return newRecord;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SWAP_BUFFERED_REFLECTION_TO_ACTIVE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { id: input.currentRecord.id },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n TABLE_SCHEMAS,\n TABLE_SPANS,\n toTraceSpans,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n TracingStorageStrategy,\n ListTracesArgs,\n ListTracesResponse,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL, generateTimestampTriggerSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { transformFromSqlRow, getTableName, getSchemaName } from '../utils';\n\nexport class ObservabilityPG extends ObservabilityStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SPANS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (ObservabilityPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_SPANS, schema: TABLE_SCHEMAS[TABLE_SPANS] });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Returns default index definitions for the observability domain tables.\n * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n */\n static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n return [\n {\n name: `${schemaPrefix}mastra_ai_spans_traceid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['traceId', 'startedAt DESC'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_parentspanid_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['parentSpanId', 'startedAt DESC'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_name_idx`,\n table: TABLE_SPANS,\n columns: ['name'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_spantype_startedat_idx`,\n table: TABLE_SPANS,\n columns: ['spanType', 'startedAt DESC'],\n },\n // Root spans partial index - every listTraces query filters parentSpanId IS NULL\n {\n name: `${schemaPrefix}mastra_ai_spans_root_spans_idx`,\n table: TABLE_SPANS,\n columns: ['startedAt DESC'],\n where: '\"parentSpanId\" IS NULL',\n },\n // Entity identification indexes - common filtering patterns\n {\n name: `${schemaPrefix}mastra_ai_spans_entitytype_entityid_idx`,\n table: TABLE_SPANS,\n columns: ['entityType', 'entityId'],\n },\n {\n name: `${schemaPrefix}mastra_ai_spans_entitytype_entityname_idx`,\n table: TABLE_SPANS,\n columns: ['entityType', 'entityName'],\n },\n // Multi-tenant filtering - organizationId + userId\n {\n name: `${schemaPrefix}mastra_ai_spans_orgid_userid_idx`,\n table: TABLE_SPANS,\n columns: ['organizationId', 'userId'],\n },\n // Metadata JSONB GIN index - for custom filtering with @> containment\n {\n name: `${schemaPrefix}mastra_ai_spans_metadata_gin_idx`,\n table: TABLE_SPANS,\n columns: ['metadata'],\n method: 'gin',\n },\n // Tags array GIN index - for array containment queries\n {\n name: `${schemaPrefix}mastra_ai_spans_tags_gin_idx`,\n table: TABLE_SPANS,\n columns: ['tags'],\n method: 'gin',\n },\n ];\n }\n\n /**\n * Returns all DDL statements for this domain: table, constraints, timestamp trigger, and indexes.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n // Table\n statements.push(\n generateTableSQL({\n tableName: TABLE_SPANS,\n schema: TABLE_SCHEMAS[TABLE_SPANS],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n\n // Timestamp trigger\n statements.push(generateTimestampTriggerSQL(TABLE_SPANS, schemaName));\n\n // Indexes\n for (const idx of ObservabilityPG.getDefaultIndexDefs(schemaPrefix)) {\n statements.push(generateIndexSQL(idx, schemaName));\n }\n\n return statements;\n }\n\n /**\n * Returns default index definitions for this instance's schema.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return ObservabilityPG.getDefaultIndexDefs(schemaPrefix);\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Manually run the spans migration to deduplicate and add the unique constraint.\n * This is intended to be called from the CLI when duplicates are detected.\n *\n * @returns Migration result with status and details\n */\n async migrateSpans(): Promise<{\n success: boolean;\n alreadyMigrated: boolean;\n duplicatesRemoved: number;\n message: string;\n }> {\n return this.#db.migrateSpans();\n }\n\n /**\n * Check migration status for the spans table.\n * Returns information about whether migration is needed.\n */\n async checkSpansMigrationStatus(): Promise<{\n needsMigration: boolean;\n hasDuplicates: boolean;\n duplicateCount: number;\n constraintExists: boolean;\n tableName: string;\n }> {\n return this.#db.checkSpansMigrationStatus();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_SPANS });\n }\n\n public override get tracingStrategy(): {\n preferred: TracingStorageStrategy;\n supported: TracingStorageStrategy[];\n } {\n return {\n preferred: 'batch-with-updates',\n supported: ['batch-with-updates', 'insert-only'],\n };\n }\n\n async createSpan(args: CreateSpanArgs): Promise<void> {\n const { span } = args;\n try {\n const startedAt = span.startedAt instanceof Date ? span.startedAt.toISOString() : span.startedAt;\n const endedAt = span.endedAt instanceof Date ? span.endedAt.toISOString() : span.endedAt;\n\n const record = {\n ...span,\n startedAt,\n endedAt,\n startedAtZ: startedAt,\n endedAtZ: endedAt,\n };\n\n return this.#db.insert({ tableName: TABLE_SPANS, record });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'CREATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId: span.spanId,\n traceId: span.traceId,\n spanType: span.spanType,\n name: span.name,\n },\n },\n error,\n );\n }\n }\n\n async getSpan(args: GetSpanArgs): Promise<GetSpanResponse | null> {\n const { traceId, spanId } = args;\n try {\n const tableName = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const row = await this.#db.client.oneOrNone<SpanRecord>(\n `SELECT\n \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n \"entityType\", \"entityId\", \"entityName\",\n \"userId\", \"organizationId\", \"resourceId\",\n \"runId\", \"sessionId\", \"threadId\", \"requestId\",\n \"environment\", \"source\", \"serviceName\", \"scope\",\n \"spanType\", \"attributes\", \"metadata\", \"tags\", \"links\",\n \"input\", \"output\", \"error\", \"isEvent\",\n \"startedAtZ\" as \"startedAt\", \"endedAtZ\" as \"endedAt\",\n \"createdAtZ\" as \"createdAt\", \"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName}\n WHERE \"traceId\" = $1 AND \"spanId\" = $2`,\n [traceId, spanId],\n );\n\n if (!row) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: row,\n }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const row = await this.#db.client.oneOrNone<SpanRecord>(\n `SELECT\n \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n \"entityType\", \"entityId\", \"entityName\",\n \"userId\", \"organizationId\", \"resourceId\",\n \"runId\", \"sessionId\", \"threadId\", \"requestId\",\n \"environment\", \"source\", \"serviceName\", \"scope\",\n \"spanType\", \"attributes\", \"metadata\", \"tags\", \"links\",\n \"input\", \"output\", \"error\", \"isEvent\",\n \"startedAtZ\" as \"startedAt\", \"endedAtZ\" as \"endedAt\",\n \"createdAtZ\" as \"createdAt\", \"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName}\n WHERE \"traceId\" = $1 AND \"parentSpanId\" IS NULL`,\n [traceId],\n );\n\n if (!row) {\n return null;\n }\n\n return {\n span: transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: row,\n }),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const spans = await this.#db.client.manyOrNone<SpanRecord>(\n `SELECT\n \"traceId\", \"spanId\", \"parentSpanId\", \"name\",\n \"entityType\", \"entityId\", \"entityName\",\n \"userId\", \"organizationId\", \"resourceId\",\n \"runId\", \"sessionId\", \"threadId\", \"requestId\",\n \"environment\", \"source\", \"serviceName\", \"scope\",\n \"spanType\", \"attributes\", \"metadata\", \"tags\", \"links\",\n \"input\", \"output\", \"error\", \"isEvent\",\n \"startedAtZ\" as \"startedAt\", \"endedAtZ\" as \"endedAt\",\n \"createdAtZ\" as \"createdAt\", \"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName}\n WHERE \"traceId\" = $1\n ORDER BY \"startedAtZ\" ASC`,\n [traceId],\n );\n\n if (!spans || spans.length === 0) {\n return null;\n }\n\n return {\n traceId,\n spans: spans.map(span =>\n transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: span,\n }),\n ),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_TRACE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async updateSpan(args: UpdateSpanArgs): Promise<void> {\n const { traceId, spanId, updates } = args;\n try {\n const data: Record<string, any> = { ...updates };\n if (data.endedAt instanceof Date) {\n const endedAt = data.endedAt.toISOString();\n data.endedAt = endedAt;\n data.endedAtZ = endedAt;\n }\n if (data.startedAt instanceof Date) {\n const startedAt = data.startedAt.toISOString();\n data.startedAt = startedAt;\n data.startedAtZ = startedAt;\n }\n\n await this.#db.update({\n tableName: TABLE_SPANS,\n keys: { spanId, traceId },\n data,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'UPDATE_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n spanId,\n traceId,\n },\n },\n error,\n );\n }\n }\n\n async listTraces(args: ListTracesArgs): Promise<ListTracesResponse> {\n // Parse args through schema to apply defaults\n const { filters, pagination, orderBy } = listTracesArgsSchema.parse(args);\n const { page, perPage } = pagination;\n\n const tableName = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n try {\n // Build WHERE clause for filters\n const conditions: string[] = ['r.\"parentSpanId\" IS NULL']; // Only root spans\n const params: any[] = [];\n let paramIndex = 1;\n\n if (filters) {\n // Date range filters\n if (filters.startedAt?.start) {\n conditions.push(`r.\"startedAtZ\" >= $${paramIndex++}`);\n params.push(filters.startedAt.start.toISOString());\n }\n if (filters.startedAt?.end) {\n conditions.push(`r.\"startedAtZ\" <= $${paramIndex++}`);\n params.push(filters.startedAt.end.toISOString());\n }\n if (filters.endedAt?.start) {\n conditions.push(`r.\"endedAtZ\" >= $${paramIndex++}`);\n params.push(filters.endedAt.start.toISOString());\n }\n if (filters.endedAt?.end) {\n conditions.push(`r.\"endedAtZ\" <= $${paramIndex++}`);\n params.push(filters.endedAt.end.toISOString());\n }\n\n // Span type filter\n if (filters.spanType !== undefined) {\n conditions.push(`r.\"spanType\" = $${paramIndex++}`);\n params.push(filters.spanType);\n }\n\n // Entity filters\n if (filters.entityType !== undefined) {\n conditions.push(`r.\"entityType\" = $${paramIndex++}`);\n params.push(filters.entityType);\n }\n if (filters.entityId !== undefined) {\n conditions.push(`r.\"entityId\" = $${paramIndex++}`);\n params.push(filters.entityId);\n }\n if (filters.entityName !== undefined) {\n conditions.push(`r.\"entityName\" = $${paramIndex++}`);\n params.push(filters.entityName);\n }\n\n // Identity & Tenancy filters\n if (filters.userId !== undefined) {\n conditions.push(`r.\"userId\" = $${paramIndex++}`);\n params.push(filters.userId);\n }\n if (filters.organizationId !== undefined) {\n conditions.push(`r.\"organizationId\" = $${paramIndex++}`);\n params.push(filters.organizationId);\n }\n if (filters.resourceId !== undefined) {\n conditions.push(`r.\"resourceId\" = $${paramIndex++}`);\n params.push(filters.resourceId);\n }\n\n // Correlation ID filters\n if (filters.runId !== undefined) {\n conditions.push(`r.\"runId\" = $${paramIndex++}`);\n params.push(filters.runId);\n }\n if (filters.sessionId !== undefined) {\n conditions.push(`r.\"sessionId\" = $${paramIndex++}`);\n params.push(filters.sessionId);\n }\n if (filters.threadId !== undefined) {\n conditions.push(`r.\"threadId\" = $${paramIndex++}`);\n params.push(filters.threadId);\n }\n if (filters.requestId !== undefined) {\n conditions.push(`r.\"requestId\" = $${paramIndex++}`);\n params.push(filters.requestId);\n }\n\n // Deployment context filters\n if (filters.environment !== undefined) {\n conditions.push(`r.\"environment\" = $${paramIndex++}`);\n params.push(filters.environment);\n }\n if (filters.source !== undefined) {\n conditions.push(`r.\"source\" = $${paramIndex++}`);\n params.push(filters.source);\n }\n if (filters.serviceName !== undefined) {\n conditions.push(`r.\"serviceName\" = $${paramIndex++}`);\n params.push(filters.serviceName);\n }\n\n // Scope filter (JSONB containment)\n if (filters.scope != null) {\n conditions.push(`r.\"scope\" @> $${paramIndex++}`);\n params.push(JSON.stringify(filters.scope));\n }\n\n // Metadata filter (JSONB containment)\n if (filters.metadata != null) {\n conditions.push(`r.\"metadata\" @> $${paramIndex++}`);\n params.push(JSON.stringify(filters.metadata));\n }\n\n // Tags filter (all tags must be present)\n if (filters.tags != null && filters.tags.length > 0) {\n conditions.push(`r.\"tags\" @> $${paramIndex++}`);\n params.push(JSON.stringify(filters.tags));\n }\n\n // Status filter (derived from error and endedAt)\n if (filters.status !== undefined) {\n switch (filters.status) {\n case TraceStatus.ERROR:\n conditions.push(`r.\"error\" IS NOT NULL`);\n break;\n case TraceStatus.RUNNING:\n conditions.push(`r.\"endedAtZ\" IS NULL AND r.\"error\" IS NULL`);\n break;\n case TraceStatus.SUCCESS:\n conditions.push(`r.\"endedAtZ\" IS NOT NULL AND r.\"error\" IS NULL`);\n break;\n }\n }\n\n // hasChildError filter (requires subquery)\n if (filters.hasChildError !== undefined) {\n if (filters.hasChildError) {\n conditions.push(`EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.\"traceId\" = r.\"traceId\" AND c.\"error\" IS NOT NULL\n )`);\n } else {\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${tableName} c\n WHERE c.\"traceId\" = r.\"traceId\" AND c.\"error\" IS NOT NULL\n )`);\n }\n }\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Build ORDER BY clause with proper NULL handling for endedAt\n // For endedAt DESC: NULLs FIRST (running spans on top when viewing newest)\n // For endedAt ASC: NULLs LAST (running spans at end when viewing oldest)\n // startedAt is never null (required field), so no special handling needed\n const sortField = `${orderBy.field}Z`;\n const sortDirection = orderBy.direction;\n let orderClause: string;\n if (orderBy.field === 'endedAt') {\n const nullsOrder = sortDirection === 'DESC' ? 'NULLS FIRST' : 'NULLS LAST';\n orderClause = `ORDER BY r.\"${sortField}\" ${sortDirection} ${nullsOrder}`;\n } else {\n orderClause = `ORDER BY r.\"${sortField}\" ${sortDirection}`;\n }\n\n // Get total count\n const countResult = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${tableName} r ${whereClause}`,\n params,\n );\n const count = Number(countResult?.count ?? 0);\n\n if (count === 0) {\n return {\n pagination: {\n total: 0,\n page,\n perPage,\n hasMore: false,\n },\n spans: [],\n };\n }\n\n // Get paginated spans\n const spans = await this.#db.client.manyOrNone<SpanRecord>(\n `SELECT\n r.\"traceId\", r.\"spanId\", r.\"parentSpanId\", r.\"name\",\n r.\"entityType\", r.\"entityId\", r.\"entityName\",\n r.\"userId\", r.\"organizationId\", r.\"resourceId\",\n r.\"runId\", r.\"sessionId\", r.\"threadId\", r.\"requestId\",\n r.\"environment\", r.\"source\", r.\"serviceName\", r.\"scope\",\n r.\"spanType\", r.\"attributes\", r.\"metadata\", r.\"tags\", r.\"links\",\n r.\"input\", r.\"output\", r.\"error\", r.\"isEvent\",\n r.\"startedAtZ\" as \"startedAt\", r.\"endedAtZ\" as \"endedAt\",\n r.\"createdAtZ\" as \"createdAt\", r.\"updatedAtZ\" as \"updatedAt\"\n FROM ${tableName} r\n ${whereClause}\n ${orderClause}\n LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`,\n [...params, perPage, page * perPage],\n );\n\n return {\n pagination: {\n total: count,\n page,\n perPage,\n hasMore: (page + 1) * perPage < count,\n },\n spans: toTraceSpans(\n spans.map(span =>\n transformFromSqlRow<SpanRecord>({\n tableName: TABLE_SPANS,\n sqlRow: span,\n }),\n ),\n ),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchCreateSpans(args: BatchCreateSpansArgs): Promise<void> {\n try {\n const records = args.records.map(record => {\n const startedAt = record.startedAt instanceof Date ? record.startedAt.toISOString() : record.startedAt;\n const endedAt = record.endedAt instanceof Date ? record.endedAt.toISOString() : record.endedAt;\n\n return {\n ...record,\n startedAt,\n endedAt,\n startedAtZ: startedAt,\n endedAtZ: endedAt,\n };\n });\n\n return this.#db.batchInsert({\n tableName: TABLE_SPANS,\n records,\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_CREATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchUpdateSpans(args: BatchUpdateSpansArgs): Promise<void> {\n try {\n return this.#db.batchUpdate({\n tableName: TABLE_SPANS,\n updates: args.records.map(record => {\n const data: Record<string, any> = { ...record.updates };\n if (data.endedAt instanceof Date) {\n const endedAt = data.endedAt.toISOString();\n data.endedAt = endedAt;\n data.endedAtZ = endedAt;\n }\n if (data.startedAt instanceof Date) {\n const startedAt = data.startedAt.toISOString();\n data.startedAt = startedAt;\n data.startedAtZ = startedAt;\n }\n\n return {\n keys: { spanId: record.spanId, traceId: record.traceId },\n data,\n };\n }),\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_UPDATE_SPANS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n\n async batchDeleteTraces(args: BatchDeleteTracesArgs): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SPANS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const placeholders = args.traceIds.map((_, i) => `$${i + 1}`).join(', ');\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"traceId\" IN (${placeholders})`, args.traceIds);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'BATCH_DELETE_TRACES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n PromptBlocksStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_PROMPT_BLOCKS,\n TABLE_PROMPT_BLOCK_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StoragePromptBlockType,\n StorageCreatePromptBlockInput,\n StorageUpdatePromptBlockInput,\n StorageListPromptBlocksInput,\n StorageListPromptBlocksOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n PromptBlockVersion,\n CreatePromptBlockVersionInput,\n ListPromptBlockVersionsInput,\n ListPromptBlockVersionsOutput,\n} from '@mastra/core/storage/domains/prompt-blocks';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nconst SNAPSHOT_FIELDS = ['name', 'description', 'content', 'rules'] as const;\n\nexport class PromptBlocksPG extends PromptBlocksStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx => (PromptBlocksPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n /**\n * Returns default index definitions for the prompt blocks domain tables.\n * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n */\n static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n return [\n {\n name: `${schemaPrefix}idx_prompt_block_versions_block_version`,\n table: TABLE_PROMPT_BLOCK_VERSIONS,\n columns: ['blockId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /**\n * Returns all DDL statements for this domain: tables and indexes.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n // Tables\n for (const tableName of PromptBlocksPG.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n }\n\n // Indexes\n for (const idx of PromptBlocksPG.getDefaultIndexDefs(schemaPrefix)) {\n statements.push(generateIndexSQL(idx, schemaName));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return PromptBlocksPG.getDefaultIndexDefs(schemaPrefix);\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch {\n // Indexes are performance optimizations, continue on failure\n }\n }\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_PROMPT_BLOCKS, schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCKS] });\n await this.#db.createTable({\n tableName: TABLE_PROMPT_BLOCK_VERSIONS,\n schema: TABLE_SCHEMAS[TABLE_PROMPT_BLOCK_VERSIONS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\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 // ==========================================================================\n // Prompt Block CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StoragePromptBlockType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseBlockRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async create(input: { promptBlock: StorageCreatePromptBlockInput }): Promise<StoragePromptBlockType> {\n const { promptBlock } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin block record\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, status, \"activeVersionId\", \"authorId\", metadata,\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n promptBlock.id,\n 'draft',\n null,\n promptBlock.authorId ?? null,\n promptBlock.metadata ? JSON.stringify(promptBlock.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract snapshot fields and create version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n blockId: promptBlock.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: [...SNAPSHOT_FIELDS],\n changeMessage: 'Initial version',\n });\n\n return {\n id: promptBlock.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: promptBlock.authorId,\n metadata: promptBlock.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n // Best-effort cleanup\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n await this.#db.client.none(\n `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [promptBlock.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async update(input: StorageUpdatePromptBlockInput): Promise<StoragePromptBlockType> {\n const { id, ...updates } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n\n const existingBlock = await this.getById(id);\n if (!existingBlock) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n let versionCreated = false;\n\n // Check if any snapshot config fields are present\n const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_PROMPT_BLOCK', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for prompt block ${id}`,\n details: { blockId: id },\n });\n }\n\n const {\n id: _versionId,\n blockId: _blockId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = SNAPSHOT_FIELDS.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n versionCreated = true;\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n blockId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields: [...changedFields],\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the block record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n if (status === undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push('published');\n }\n }\n\n if (status !== undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push(status);\n }\n\n if (metadata !== undefined) {\n const mergedMetadata = { ...(existingBlock.metadata || {}), ...metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\n }\n\n // Always update timestamps\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n values.push(id);\n\n if (setClauses.length > 2 || versionCreated) {\n // More than just updatedAt and updatedAtZ, or a new version was created\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n const updatedBlock = await this.getById(id);\n if (!updatedBlock) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 updatedBlock;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n await this.deleteVersionsByParentId(id);\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async list(args?: StorageListPromptBlocksInput): Promise<StorageListPromptBlocksOutput> {\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('PG', '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 = getTableName({ indexName: TABLE_PROMPT_BLOCKS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 1;\n\n if (authorId !== undefined) {\n conditions.push(`\"authorId\" = $${paramIdx++}`);\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n queryParams.push(JSON.stringify(metadata));\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n promptBlocks: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n [...queryParams, limitValue, offset],\n );\n\n const promptBlocks = (dataResult || []).map(row => this.parseBlockRow(row));\n\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('PG', 'LIST_PROMPT_BLOCKS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Prompt Block Version Methods\n // ==========================================================================\n\n async createVersion(input: CreatePromptBlockVersionInput): Promise<PromptBlockVersion> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"blockId\", \"versionNumber\",\n name, description, content, rules,\n \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`,\n [\n input.id,\n input.blockId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.content,\n input.rules ? JSON.stringify(input.rules) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersion(id: string): Promise<PromptBlockVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersionByNumber(blockId: string, versionNumber: number): Promise<PromptBlockVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 AND \"versionNumber\" = $2`,\n [blockId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getLatestVersion(blockId: string): Promise<PromptBlockVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [blockId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_PROMPT_BLOCK_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListPromptBlockVersionsInput): Promise<ListPromptBlockVersionsOutput> {\n const { blockId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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\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 tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const countResult = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"blockId\" = $1`, [\n blockId,\n ]);\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"blockId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [blockId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersion(id: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"blockId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_PROMPT_BLOCK_VERSIONS_BY_BLOCK_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { blockId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(blockId: string): Promise<number> {\n try {\n const tableName = getTableName({\n indexName: TABLE_PROMPT_BLOCK_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.one(`SELECT COUNT(*) as count FROM ${tableName} WHERE \"blockId\" = $1`, [\n blockId,\n ]);\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseBlockRow(row: any): StoragePromptBlockType {\n return {\n id: row.id as string,\n status: row.status as StoragePromptBlockType['status'],\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAtZ || row.createdAt),\n updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n };\n }\n\n private parseVersionRow(row: any): PromptBlockVersion {\n return {\n id: row.id as string,\n blockId: row.blockId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n content: row.content as string,\n rules: this.parseJson(row.rules, 'rules'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAtZ || row.createdAt),\n };\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n ScorerDefinitionsStorage,\n createStorageErrorId,\n normalizePerPage,\n calculatePagination,\n TABLE_SCORER_DEFINITIONS,\n TABLE_SCORER_DEFINITION_VERSIONS,\n TABLE_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageScorerDefinitionType,\n StorageCreateScorerDefinitionInput,\n StorageUpdateScorerDefinitionInput,\n StorageListScorerDefinitionsInput,\n StorageListScorerDefinitionsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type {\n ScorerDefinitionVersion,\n CreateScorerDefinitionVersionInput,\n ListScorerDefinitionVersionsInput,\n ListScorerDefinitionVersionsOutput,\n} from '@mastra/core/storage/domains/scorer-definitions';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\nimport { getTableName, getSchemaName } from '../utils';\n\nconst SNAPSHOT_FIELDS = [\n 'name',\n 'description',\n 'type',\n 'model',\n 'instructions',\n 'scoreRange',\n 'presetConfig',\n 'defaultSampling',\n] as const;\n\nexport class ScorerDefinitionsPG extends ScorerDefinitionsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n static readonly MANAGED_TABLES = [TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n this.#indexes = indexes?.filter(idx =>\n (ScorerDefinitionsPG.MANAGED_TABLES as readonly string[]).includes(idx.table),\n );\n }\n\n /**\n * Returns default index definitions for the scorer definitions domain tables.\n * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n */\n static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n return [\n {\n name: `${schemaPrefix}idx_scorer_definition_versions_def_version`,\n table: TABLE_SCORER_DEFINITION_VERSIONS,\n columns: ['scorerDefinitionId', 'versionNumber'],\n unique: true,\n },\n ];\n }\n\n /**\n * Returns all DDL statements for this domain: tables and indexes.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n // Tables\n for (const tableName of ScorerDefinitionsPG.MANAGED_TABLES) {\n statements.push(\n generateTableSQL({\n tableName,\n schema: TABLE_SCHEMAS[tableName],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n }\n\n // Indexes\n for (const idx of ScorerDefinitionsPG.getDefaultIndexDefs(schemaPrefix)) {\n statements.push(generateIndexSQL(idx, schemaName));\n }\n\n return statements;\n }\n\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return ScorerDefinitionsPG.getDefaultIndexDefs(schemaPrefix);\n }\n\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch {\n // Indexes are performance optimizations, continue on failure\n }\n }\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({\n tableName: TABLE_SCORER_DEFINITIONS,\n schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITIONS],\n });\n await this.#db.createTable({\n tableName: TABLE_SCORER_DEFINITION_VERSIONS,\n schema: TABLE_SCHEMAS[TABLE_SCORER_DEFINITION_VERSIONS],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\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 // ==========================================================================\n // Scorer Definition CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StorageScorerDefinitionType | null> {\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseScorerRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async create(input: { scorerDefinition: StorageCreateScorerDefinitionInput }): Promise<StorageScorerDefinitionType> {\n const { scorerDefinition } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n const now = new Date();\n const nowIso = now.toISOString();\n\n // 1. Create the thin scorer definition record\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, status, \"activeVersionId\", \"authorId\", metadata,\n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`,\n [\n scorerDefinition.id,\n 'draft',\n null,\n scorerDefinition.authorId ?? null,\n scorerDefinition.metadata ? JSON.stringify(scorerDefinition.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n // 2. Extract snapshot fields and create version 1\n const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n scorerDefinitionId: scorerDefinition.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: [...SNAPSHOT_FIELDS],\n changeMessage: 'Initial version',\n });\n\n return {\n id: scorerDefinition.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: scorerDefinition.authorId,\n metadata: scorerDefinition.metadata,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\n // Best-effort cleanup\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(\n `DELETE FROM ${tableName} WHERE id = $1 AND status = 'draft' AND \"activeVersionId\" IS NULL`,\n [scorerDefinition.id],\n );\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async update(input: StorageUpdateScorerDefinitionInput): Promise<StorageScorerDefinitionType> {\n const { id, ...updates } = input;\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n\n const existingScorer = await this.getById(id);\n if (!existingScorer) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 const { authorId, activeVersionId, metadata, status, ...configFields } = updates;\n let versionCreated = false;\n\n // Check if any snapshot config fields are present\n const hasConfigUpdate = SNAPSHOT_FIELDS.some(field => field in configFields);\n\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'UPDATE_SCORER_DEFINITION', 'NO_VERSIONS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `No versions found for scorer definition ${id}`,\n details: { scorerDefinitionId: id },\n });\n }\n\n const {\n id: _versionId,\n scorerDefinitionId: _scorerDefinitionId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = { ...latestConfig, ...configFields };\n const changedFields = SNAPSHOT_FIELDS.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n versionCreated = true;\n const newVersionId = crypto.randomUUID();\n await this.createVersion({\n id: newVersionId,\n scorerDefinitionId: id,\n versionNumber: latestVersion.versionNumber + 1,\n ...newConfig,\n changedFields: [...changedFields],\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Update metadata fields on the scorer definition record\n const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (authorId !== undefined) {\n setClauses.push(`\"authorId\" = $${paramIndex++}`);\n values.push(authorId);\n }\n\n if (activeVersionId !== undefined) {\n setClauses.push(`\"activeVersionId\" = $${paramIndex++}`);\n values.push(activeVersionId);\n // Auto-set status to 'published' when activeVersionId is set, consistent with InMemory and LibSQL\n if (status === undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push('published');\n }\n }\n\n if (status !== undefined) {\n setClauses.push(`status = $${paramIndex++}`);\n values.push(status);\n }\n\n if (metadata !== undefined) {\n const mergedMetadata = { ...(existingScorer.metadata || {}), ...metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\n }\n\n // Always update timestamps\n const now = new Date().toISOString();\n setClauses.push(`\"updatedAt\" = $${paramIndex++}`);\n values.push(now);\n setClauses.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(now);\n\n values.push(id);\n\n if (setClauses.length > 2 || versionCreated) {\n // More than just updatedAt and updatedAtZ, or a new version was created\n await this.#db.client.none(\n `UPDATE ${tableName} SET ${setClauses.join(', ')} WHERE id = $${paramIndex}`,\n values,\n );\n }\n\n const updatedScorer = await this.getById(id);\n if (!updatedScorer) {\n throw new MastraError({\n id: createStorageErrorId('PG', '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 updatedScorer;\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async delete(id: string): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n await this.deleteVersionsByParentId(id);\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async list(args?: StorageListScorerDefinitionsInput): Promise<StorageListScorerDefinitionsOutput> {\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('PG', '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 = getTableName({ indexName: TABLE_SCORER_DEFINITIONS, schemaName: getSchemaName(this.#schema) });\n\n // Build WHERE conditions\n const conditions: string[] = [];\n const queryParams: any[] = [];\n let paramIdx = 1;\n\n if (authorId !== undefined) {\n conditions.push(`\"authorId\" = $${paramIdx++}`);\n queryParams.push(authorId);\n }\n\n if (metadata && Object.keys(metadata).length > 0) {\n conditions.push(`metadata @> $${paramIdx++}::jsonb`);\n queryParams.push(JSON.stringify(metadata));\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n // Get total count\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`,\n queryParams,\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n scorerDefinitions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} ${whereClause} ORDER BY \"${field}\" ${direction} LIMIT $${paramIdx++} OFFSET $${paramIdx++}`,\n [...queryParams, limitValue, offset],\n );\n\n const scorerDefinitions = (dataResult || []).map(row => this.parseScorerRow(row));\n\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('PG', 'LIST_SCORER_DEFINITIONS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n // ==========================================================================\n // Scorer Definition Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateScorerDefinitionVersionInput): Promise<ScorerDefinitionVersion> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const now = new Date();\n const nowIso = now.toISOString();\n\n await this.#db.client.none(\n `INSERT INTO ${tableName} (\n id, \"scorerDefinitionId\", \"versionNumber\",\n name, description, type, model, instructions, \"scoreRange\", \"presetConfig\", \"defaultSampling\",\n \"changedFields\", \"changeMessage\",\n \"createdAt\", \"createdAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)`,\n [\n input.id,\n input.scorerDefinitionId,\n input.versionNumber,\n input.name,\n input.description ?? null,\n input.type,\n input.model ? JSON.stringify(input.model) : null,\n input.instructions ?? null,\n input.scoreRange ? JSON.stringify(input.scoreRange) : null,\n input.presetConfig ? JSON.stringify(input.presetConfig) : null,\n input.defaultSampling ? JSON.stringify(input.defaultSampling) : null,\n input.changedFields ? JSON.stringify(input.changedFields) : null,\n input.changeMessage ?? null,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...input,\n createdAt: now,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersion(id: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(`SELECT * FROM ${tableName} WHERE id = $1`, [id]);\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getVersionByNumber(scorerDefinitionId: string, versionNumber: number): Promise<ScorerDefinitionVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 AND \"versionNumber\" = $2`,\n [scorerDefinitionId, versionNumber],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async getLatestVersion(scorerDefinitionId: string): Promise<ScorerDefinitionVersion | null> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.oneOrNone(\n `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 ORDER BY \"versionNumber\" DESC LIMIT 1`,\n [scorerDefinitionId],\n );\n\n if (!result) {\n return null;\n }\n\n return this.parseVersionRow(result);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_LATEST_SCORER_DEFINITION_VERSION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId },\n },\n error,\n );\n }\n }\n\n async listVersions(input: ListScorerDefinitionVersionsInput): Promise<ListScorerDefinitionVersionsOutput> {\n const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input;\n\n if (page < 0) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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\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 tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`,\n [scorerDefinitionId],\n );\n const total = parseInt(countResult.count, 10);\n\n if (total === 0) {\n return {\n versions: [],\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n };\n }\n\n const limitValue = perPageInput === false ? total : perPage;\n const dataResult = await this.#db.client.manyOrNone(\n `SELECT * FROM ${tableName} WHERE \"scorerDefinitionId\" = $1 ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`,\n [scorerDefinitionId, limitValue, offset],\n );\n\n const versions = (dataResult || []).map(row => this.parseVersionRow(row));\n\n return {\n versions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: perPageInput === false ? false : offset + perPage < total,\n };\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersion(id: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 async deleteVersionsByParentId(entityId: string): Promise<void> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`, [entityId]);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_SCORER_DEFINITION_VERSIONS_BY_SCORER_DEFINITION_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { scorerDefinitionId: entityId },\n },\n error,\n );\n }\n }\n\n async countVersions(scorerDefinitionId: string): Promise<number> {\n try {\n const tableName = getTableName({\n indexName: TABLE_SCORER_DEFINITION_VERSIONS,\n schemaName: getSchemaName(this.#schema),\n });\n const result = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"scorerDefinitionId\" = $1`,\n [scorerDefinitionId],\n );\n return parseInt(result.count, 10);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createStorageErrorId('PG', '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 // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private parseJson(value: any, fieldName?: string): any {\n if (!value) return undefined;\n if (typeof value !== 'string') return value;\n\n try {\n return JSON.parse(value);\n } catch (error) {\n if (error instanceof MastraError) throw error;\n const details: Record<string, string> = {\n value: value.length > 100 ? value.substring(0, 100) + '...' : value,\n };\n if (fieldName) {\n details.field = fieldName;\n }\n\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PARSE_JSON', 'INVALID_JSON'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.SYSTEM,\n text: `Failed to parse JSON${fieldName ? ` for field \"${fieldName}\"` : ''}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n details,\n },\n error,\n );\n }\n }\n\n private parseScorerRow(row: any): StorageScorerDefinitionType {\n return {\n id: row.id as string,\n status: row.status as StorageScorerDefinitionType['status'],\n activeVersionId: row.activeVersionId as string | undefined,\n authorId: row.authorId as string | undefined,\n metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: new Date(row.createdAtZ || row.createdAt),\n updatedAt: new Date(row.updatedAtZ || row.updatedAt),\n };\n }\n\n private parseVersionRow(row: any): ScorerDefinitionVersion {\n return {\n id: row.id as string,\n scorerDefinitionId: row.scorerDefinitionId as string,\n versionNumber: row.versionNumber as number,\n name: row.name as string,\n description: row.description as string | undefined,\n type: row.type as ScorerDefinitionVersion['type'],\n model: this.parseJson(row.model, 'model'),\n instructions: row.instructions as string | undefined,\n scoreRange: this.parseJson(row.scoreRange, 'scoreRange'),\n presetConfig: this.parseJson(row.presetConfig, 'presetConfig'),\n defaultSampling: this.parseJson(row.defaultSampling, 'defaultSampling'),\n changedFields: this.parseJson(row.changedFields, 'changedFields'),\n changeMessage: row.changeMessage as string | undefined,\n createdAt: new Date(row.createdAtZ || row.createdAt),\n };\n }\n}\n","import { 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 calculatePagination,\n createStorageErrorId,\n normalizePerPage,\n ScoresStorage,\n TABLE_SCORERS,\n TABLE_SCHEMAS,\n transformScoreRow as coreTransformScoreRow,\n} from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { PgDB, resolvePgConfig, generateTableSQL, generateIndexSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const quotedIndexName = `\"${indexName}\"`;\n return schemaName ? `${schemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * PostgreSQL-specific score row transformation.\n * Uses Z-suffix timestamps (createdAtZ, updatedAtZ) when available.\n */\nfunction transformScoreRow(row: Record<string, any>): ScoreRowData {\n return coreTransformScoreRow(row, {\n preferredTimestampFields: {\n createdAt: 'createdAtZ',\n updatedAt: 'updatedAtZ',\n },\n });\n}\n\nexport class ScoresPG extends ScoresStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_SCORERS] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (ScoresPG.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 // Add columns for backwards compatibility (v0.x to v1 migration)\n await this.#db.alterTable({\n tableName: TABLE_SCORERS,\n schema: TABLE_SCHEMAS[TABLE_SCORERS],\n ifNotExists: ['spanId', 'requestContext'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Returns default index definitions for the scores domain tables.\n * @param schemaPrefix - Prefix for index names (e.g. \"my_schema_\" or \"\")\n */\n static getDefaultIndexDefs(schemaPrefix: string): CreateIndexOptions[] {\n return [\n {\n name: `${schemaPrefix}mastra_scores_trace_id_span_id_created_at_idx`,\n table: TABLE_SCORERS,\n columns: ['traceId', 'spanId', 'createdAt DESC'],\n },\n ];\n }\n\n /**\n * Returns all DDL statements for this domain: table and indexes.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n const parsedSchema = schemaName ? parseSqlIdentifier(schemaName, 'schema name') : '';\n const schemaPrefix = parsedSchema && parsedSchema !== 'public' ? `${parsedSchema}_` : '';\n\n // Table\n statements.push(\n generateTableSQL({\n tableName: TABLE_SCORERS,\n schema: TABLE_SCHEMAS[TABLE_SCORERS],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n\n // Indexes\n for (const idx of ScoresPG.getDefaultIndexDefs(schemaPrefix)) {\n statements.push(generateIndexSQL(idx, schemaName));\n }\n\n return statements;\n }\n\n /**\n * Returns default index definitions for this instance's schema.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n const schemaPrefix = this.#schema !== 'public' ? `${this.#schema}_` : '';\n return ScoresPG.getDefaultIndexDefs(schemaPrefix);\n }\n\n /**\n * Creates default indexes for optimal query performance.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n\n for (const indexDef of this.getDefaultIndexDefinitions()) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create index ${indexDef.name}:`, error);\n }\n }\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\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 result = await this.#db.client.oneOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE id = $1`,\n [id],\n );\n\n return result ? transformScoreRow(result) : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORE_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\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: string[] = [`\"scorerId\" = $1`];\n const queryParams: any[] = [scorerId];\n let paramIndex = 2;\n\n if (entityId) {\n conditions.push(`\"entityId\" = $${paramIndex++}`);\n queryParams.push(entityId);\n }\n\n if (entityType) {\n conditions.push(`\"entityType\" = $${paramIndex++}`);\n queryParams.push(entityType);\n }\n\n if (source) {\n conditions.push(`\"source\" = $${paramIndex++}`);\n queryParams.push(source);\n }\n\n const whereClause = conditions.join(' AND ');\n\n const total = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE ${whereClause}`,\n queryParams,\n );\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n if (total?.count === '0' || !total?.count) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n const limitValue = perPageInput === false ? Number(total?.count) : perPage;\n const end = perPageInput === false ? Number(total?.count) : start + perPage;\n const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE ${whereClause} ORDER BY \"createdAt\" DESC LIMIT $${paramIndex++} OFFSET $${paramIndex++}`,\n [...queryParams, limitValue, start],\n );\n\n return {\n pagination: {\n total: Number(total?.count) || 0,\n page,\n perPage: perPageForResponse,\n hasMore: end < Number(total?.count),\n },\n scores: result.map(transformScoreRow),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_SCORER_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async saveScore(score: SaveScorePayload): Promise<{ score: ScoreRowData }> {\n let parsedScore: SaveScorePayload;\n try {\n parsedScore = saveScorePayloadSchema.parse(score);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_SCORE', 'VALIDATION_FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n scorer: typeof score.scorer?.id === 'string' ? score.scorer.id : String(score.scorer?.id ?? 'unknown'),\n entityId: score.entityId ?? 'unknown',\n entityType: score.entityType ?? 'unknown',\n traceId: score.traceId ?? '',\n spanId: score.spanId ?? '',\n },\n },\n error,\n );\n }\n\n try {\n const id = crypto.randomUUID();\n const now = new Date();\n\n const {\n scorer,\n preprocessStepResult,\n analyzeStepResult,\n metadata,\n input,\n output,\n additionalContext,\n requestContext,\n entity,\n ...rest\n } = parsedScore;\n\n await this.#db.insert({\n tableName: TABLE_SCORERS,\n record: {\n id,\n ...rest,\n input: JSON.stringify(input) || '',\n output: JSON.stringify(output) || '',\n scorer: scorer ? JSON.stringify(scorer) : null,\n preprocessStepResult: preprocessStepResult ? JSON.stringify(preprocessStepResult) : null,\n analyzeStepResult: analyzeStepResult ? JSON.stringify(analyzeStepResult) : null,\n metadata: metadata ? JSON.stringify(metadata) : null,\n additionalContext: additionalContext ? JSON.stringify(additionalContext) : null,\n requestContext: requestContext ? JSON.stringify(requestContext) : null,\n entity: entity ? JSON.stringify(entity) : null,\n createdAt: now.toISOString(),\n updatedAt: now.toISOString(),\n },\n });\n\n return { score: { ...parsedScore, id, createdAt: now, updatedAt: now } as ScoreRowData };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'SAVE_SCORE', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByRunId({\n runId,\n pagination,\n }: {\n runId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const total = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"runId\" = $1`,\n [runId],\n );\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n if (total?.count === '0' || !total?.count) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const limitValue = perPageInput === false ? Number(total?.count) : perPage;\n const end = perPageInput === false ? Number(total?.count) : start + perPage;\n\n const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"runId\" = $1 LIMIT $2 OFFSET $3`,\n [runId, limitValue, start],\n );\n return {\n pagination: {\n total: Number(total?.count) || 0,\n page,\n perPage: perPageForResponse,\n hasMore: end < Number(total?.count),\n },\n scores: result.map(transformScoreRow),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_RUN_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresByEntityId({\n entityId,\n entityType,\n pagination,\n }: {\n pagination: StoragePagination;\n entityId: string;\n entityType: string;\n }): Promise<ListScoresResponse> {\n try {\n const total = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"entityId\" = $1 AND \"entityType\" = $2`,\n [entityId, entityType],\n );\n const { page, perPage: perPageInput } = pagination;\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset: start, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n if (total?.count === '0' || !total?.count) {\n return {\n pagination: {\n total: 0,\n page,\n perPage: perPageForResponse,\n hasMore: false,\n },\n scores: [],\n };\n }\n\n const limitValue = perPageInput === false ? Number(total?.count) : perPage;\n const end = perPageInput === false ? Number(total?.count) : start + perPage;\n\n const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) })} WHERE \"entityId\" = $1 AND \"entityType\" = $2 LIMIT $3 OFFSET $4`,\n [entityId, entityType, limitValue, start],\n );\n return {\n pagination: {\n total: Number(total?.count) || 0,\n page,\n perPage: perPageForResponse,\n hasMore: end < Number(total?.count),\n },\n scores: result.map(transformScoreRow),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_ENTITY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async listScoresBySpan({\n traceId,\n spanId,\n pagination,\n }: {\n traceId: string;\n spanId: string;\n pagination: StoragePagination;\n }): Promise<ListScoresResponse> {\n try {\n const tableName = getTableName({ indexName: TABLE_SCORERS, schemaName: getSchemaName(this.#schema) });\n const countSQLResult = await this.#db.client.oneOrNone<{ count: string }>(\n `SELECT COUNT(*) as count FROM ${tableName} WHERE \"traceId\" = $1 AND \"spanId\" = $2`,\n [traceId, spanId],\n );\n\n const total = Number(countSQLResult?.count ?? 0);\n const { page, perPage: perPageInput } = pagination;\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 const result = await this.#db.client.manyOrNone<ScoreRowData>(\n `SELECT * FROM ${tableName} WHERE \"traceId\" = $1 AND \"spanId\" = $2 ORDER BY \"createdAt\" DESC LIMIT $3 OFFSET $4`,\n [traceId, spanId, limitValue, start],\n );\n\n const hasMore = end < total;\n const scores = result.map(row => transformScoreRow(row)) ?? [];\n\n return {\n scores,\n pagination: {\n total,\n page,\n perPage: perPageForResponse,\n hasMore,\n },\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_SCORES_BY_SPAN', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n normalizePerPage,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_SCHEMAS,\n WorkflowsStorage,\n createStorageErrorId,\n} from '@mastra/core/storage';\nimport type {\n UpdateWorkflowStateOptions,\n StorageListWorkflowRunsInput,\n WorkflowRun,\n WorkflowRuns,\n CreateIndexOptions,\n} from '@mastra/core/storage';\nimport type { StepResult, WorkflowRunState } from '@mastra/core/workflows';\nimport { PgDB, resolvePgConfig, generateTableSQL } from '../../db';\nimport type { PgDomainConfig } from '../../db';\n\nfunction getSchemaName(schema?: string) {\n return schema ? `\"${schema}\"` : '\"public\"';\n}\n\nfunction getTableName({ indexName, schemaName }: { indexName: string; schemaName?: string }) {\n const quotedIndexName = `\"${indexName}\"`;\n return schemaName ? `${schemaName}.${quotedIndexName}` : quotedIndexName;\n}\n\n/**\n * Sanitizes JSON string by removing problematic Unicode sequences that PostgreSQL jsonb rejects.\n * Removes:\n * - \\u0000 (null character) - causes error 22P05 \"unsupported Unicode escape sequence\"\n * - \\uD800-\\uDFFF (unpaired surrogates) - causes \"Unicode low surrogate must follow a high surrogate\"\n */\nfunction sanitizeJsonForPg(jsonString: string): string {\n return jsonString.replace(/\\\\u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})/g, '');\n}\n\nexport class WorkflowsPG extends WorkflowsStorage {\n #db: PgDB;\n #schema: string;\n #skipDefaultIndexes?: boolean;\n #indexes?: CreateIndexOptions[];\n\n /** Tables managed by this domain */\n static readonly MANAGED_TABLES = [TABLE_WORKFLOW_SNAPSHOT] as const;\n\n constructor(config: PgDomainConfig) {\n super();\n const { client, schemaName, skipDefaultIndexes, indexes } = resolvePgConfig(config);\n this.#db = new PgDB({ client, schemaName, skipDefaultIndexes });\n this.#schema = schemaName || 'public';\n this.#skipDefaultIndexes = skipDefaultIndexes;\n // Filter indexes to only those for tables managed by this domain\n this.#indexes = indexes?.filter(idx => (WorkflowsPG.MANAGED_TABLES as readonly string[]).includes(idx.table));\n }\n\n private parseWorkflowRun(row: Record<string, any>): WorkflowRun {\n let parsedSnapshot: WorkflowRunState | string = row.snapshot as string;\n if (typeof parsedSnapshot === 'string') {\n try {\n parsedSnapshot = JSON.parse(row.snapshot as string) as WorkflowRunState;\n } catch (e) {\n this.logger.warn(`Failed to parse snapshot for workflow ${row.workflow_name}: ${e}`);\n }\n }\n return {\n workflowName: row.workflow_name as string,\n runId: row.run_id as string,\n snapshot: parsedSnapshot,\n resourceId: row.resourceId as string,\n createdAt: new Date(row.createdAtZ || (row.createdAt as string)),\n updatedAt: new Date(row.updatedAtZ || (row.updatedAt as string)),\n };\n }\n\n /**\n * Returns all DDL statements for this domain: table with unique constraint.\n * Used by exportSchemas to produce a complete, reproducible schema export.\n */\n static getExportDDL(schemaName?: string): string[] {\n const statements: string[] = [];\n\n // Table (includes the UNIQUE constraint on workflow_name, run_id via generateTableSQL)\n statements.push(\n generateTableSQL({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n schemaName,\n includeAllConstraints: true,\n }),\n );\n\n return statements;\n }\n\n /**\n * Returns default index definitions for the workflows domain tables.\n * Currently no default indexes are defined for workflows.\n */\n getDefaultIndexDefinitions(): CreateIndexOptions[] {\n return [];\n }\n\n /**\n * Creates default indexes for optimal query performance.\n * Currently no default indexes are defined for workflows.\n */\n async createDefaultIndexes(): Promise<void> {\n if (this.#skipDefaultIndexes) {\n return;\n }\n // No default indexes for workflows domain\n }\n\n async init(): Promise<void> {\n await this.#db.createTable({ tableName: TABLE_WORKFLOW_SNAPSHOT, schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT] });\n await this.#db.alterTable({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT],\n ifNotExists: ['resourceId'],\n });\n await this.createDefaultIndexes();\n await this.createCustomIndexes();\n }\n\n /**\n * Creates custom user-defined indexes for this domain's tables.\n */\n async createCustomIndexes(): Promise<void> {\n if (!this.#indexes || this.#indexes.length === 0) {\n return;\n }\n\n for (const indexDef of this.#indexes) {\n try {\n await this.#db.createIndex(indexDef);\n } catch (error) {\n // Log but continue - indexes are performance optimizations\n this.logger?.warn?.(`Failed to create custom index ${indexDef.name}:`, error);\n }\n }\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.#db.clearTable({ tableName: TABLE_WORKFLOW_SNAPSHOT });\n }\n\n updateWorkflowResults(\n {\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 },\n ): Promise<Record<string, StepResult<any, any, any, any>>> {\n throw new Error('Method not implemented.');\n }\n updateWorkflowState(\n {\n // workflowName,\n // runId,\n // opts,\n }: {\n workflowName: string;\n runId: string;\n opts: UpdateWorkflowStateOptions;\n },\n ): Promise<WorkflowRunState | undefined> {\n throw new Error('Method not implemented.');\n }\n\n async persistWorkflowSnapshot({\n workflowName,\n runId,\n resourceId,\n snapshot,\n createdAt,\n updatedAt,\n }: {\n workflowName: string;\n runId: string;\n resourceId?: string;\n snapshot: WorkflowRunState;\n createdAt?: Date;\n updatedAt?: Date;\n }): Promise<void> {\n try {\n const now = new Date();\n const createdAtValue = createdAt ? createdAt : now;\n const updatedAtValue = updatedAt ? updatedAt : now;\n // Sanitize the snapshot JSON to remove problematic Unicode sequences\n const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(snapshot));\n await this.#db.client.none(\n `INSERT INTO ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} (workflow_name, run_id, \"resourceId\", snapshot, \"createdAt\", \"updatedAt\")\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT (workflow_name, run_id) DO UPDATE\n SET \"resourceId\" = $3, snapshot = $4, \"updatedAt\" = $6`,\n [workflowName, runId, resourceId, sanitizedSnapshot, createdAtValue, updatedAtValue],\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'PERSIST_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async loadWorkflowSnapshot({\n workflowName,\n runId,\n }: {\n workflowName: string;\n runId: string;\n }): Promise<WorkflowRunState | null> {\n try {\n const result = await this.#db.load<{ snapshot: WorkflowRunState }>({\n tableName: TABLE_WORKFLOW_SNAPSHOT,\n keys: { workflow_name: workflowName, run_id: runId },\n });\n\n return result ? result.snapshot : null;\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LOAD_WORKFLOW_SNAPSHOT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async getWorkflowRunById({\n runId,\n workflowName,\n }: {\n runId: string;\n workflowName?: string;\n }): Promise<WorkflowRun | null> {\n try {\n const conditions: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (runId) {\n conditions.push(`run_id = $${paramIndex}`);\n values.push(runId);\n paramIndex++;\n }\n\n if (workflowName) {\n conditions.push(`workflow_name = $${paramIndex}`);\n values.push(workflowName);\n paramIndex++;\n }\n\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n const query = `\n SELECT * FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })}\n ${whereClause}\n ORDER BY \"createdAt\" DESC LIMIT 1\n `;\n\n const queryValues = values;\n\n const result = await this.#db.client.oneOrNone(query, queryValues);\n\n if (!result) {\n return null;\n }\n\n return this.parseWorkflowRun(result);\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'GET_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n runId,\n workflowName: workflowName || '',\n },\n },\n error,\n );\n }\n }\n\n async deleteWorkflowRunById({ runId, workflowName }: { runId: string; workflowName: string }): Promise<void> {\n try {\n await this.#db.client.none(\n `DELETE FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} WHERE run_id = $1 AND workflow_name = $2`,\n [runId, workflowName],\n );\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'DELETE_WORKFLOW_RUN_BY_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n runId,\n workflowName,\n },\n },\n error,\n );\n }\n }\n\n async listWorkflowRuns({\n workflowName,\n fromDate,\n toDate,\n perPage,\n page,\n resourceId,\n status,\n }: StorageListWorkflowRunsInput = {}): Promise<WorkflowRuns> {\n try {\n const conditions: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (workflowName) {\n conditions.push(`workflow_name = $${paramIndex}`);\n values.push(workflowName);\n paramIndex++;\n }\n\n if (status) {\n // Use regexp_replace to strip problematic Unicode escape sequences before casting to jsonb.\n // PostgreSQL's jsonb cast fails on:\n // - \\u0000 (null character) with error 22P05 \"unsupported Unicode escape sequence\"\n // - \\uD800-\\uDFFF (unpaired surrogates) with \"Unicode low surrogate must follow a high surrogate\"\n // The regex pattern matches \\u0000 and all surrogate code points (D800-DFFF).\n // See: https://github.com/mastra-ai/mastra/issues/11563\n conditions.push(\n `regexp_replace(snapshot::text, '\\\\\\\\u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})', '', 'g')::jsonb ->> 'status' = $${paramIndex}`,\n );\n values.push(status);\n paramIndex++;\n }\n\n if (resourceId) {\n const hasResourceId = await this.#db.hasColumn(TABLE_WORKFLOW_SNAPSHOT, 'resourceId');\n if (hasResourceId) {\n conditions.push(`\"resourceId\" = $${paramIndex}`);\n values.push(resourceId);\n paramIndex++;\n } else {\n this.logger?.warn?.(`[${TABLE_WORKFLOW_SNAPSHOT}] resourceId column not found. Skipping resourceId filter.`);\n }\n }\n\n if (fromDate) {\n conditions.push(`\"createdAt\" >= $${paramIndex}`);\n values.push(fromDate);\n paramIndex++;\n }\n\n if (toDate) {\n conditions.push(`\"createdAt\" <= $${paramIndex}`);\n values.push(toDate);\n paramIndex++;\n }\n const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n\n let total = 0;\n const usePagination = typeof perPage === 'number' && typeof page === 'number';\n if (usePagination) {\n const countResult = await this.#db.client.one(\n `SELECT COUNT(*) as count FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })} ${whereClause}`,\n values,\n );\n total = Number(countResult.count);\n }\n\n const normalizedPerPage = usePagination ? normalizePerPage(perPage, Number.MAX_SAFE_INTEGER) : 0;\n const offset = usePagination ? page! * normalizedPerPage : undefined;\n\n const query = `\n SELECT * FROM ${getTableName({ indexName: TABLE_WORKFLOW_SNAPSHOT, schemaName: getSchemaName(this.#schema) })}\n ${whereClause}\n ORDER BY \"createdAt\" DESC\n ${usePagination ? ` LIMIT $${paramIndex} OFFSET $${paramIndex + 1}` : ''}\n `;\n\n const queryValues = usePagination ? [...values, normalizedPerPage, offset] : values;\n\n const result = await this.#db.client.manyOrNone(query, queryValues);\n\n const runs = (result || []).map(row => {\n return this.parseWorkflowRun(row);\n });\n\n return { runs, total: total || runs.length };\n } catch (error) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'LIST_WORKFLOW_RUNS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n workflowName: workflowName || 'all',\n },\n },\n error,\n );\n }\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { createStorageErrorId, MastraCompositeStore } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport { parseSqlIdentifier } from '@mastra/core/utils';\nimport { Pool } from 'pg';\nimport {\n validateConfig,\n isCloudSqlConfig,\n isConnectionStringConfig,\n isHostConfig,\n isPoolConfig,\n} from '../shared/config';\nimport type { PostgresStoreConfig } from '../shared/config';\nimport { PoolAdapter } from './client';\nimport type { DbClient } from './client';\nimport type { PgDomainClientConfig } from './db';\nimport { getSchemaName } from './db';\nimport { AgentsPG } from './domains/agents';\nimport { DatasetsPG } from './domains/datasets';\nimport { ExperimentsPG } from './domains/experiments';\nimport { MCPClientsPG } from './domains/mcp-clients';\nimport { MemoryPG } from './domains/memory';\nimport { ObservabilityPG } from './domains/observability';\nimport { PromptBlocksPG } from './domains/prompt-blocks';\nimport { ScorerDefinitionsPG } from './domains/scorer-definitions';\nimport { ScoresPG } from './domains/scores';\nimport { WorkflowsPG } from './domains/workflows';\n\n/** Default maximum number of connections in the pool */\nconst DEFAULT_MAX_CONNECTIONS = 20;\n/** Default idle timeout in milliseconds */\nconst DEFAULT_IDLE_TIMEOUT_MS = 30000;\n\n/**\n * All storage domain classes, in order. Each provides a static getExportDDL method\n * that returns the complete DDL (tables, constraints, indexes, triggers) for that domain.\n */\nconst ALL_DOMAINS = [\n MemoryPG,\n ObservabilityPG,\n ScoresPG,\n ScorerDefinitionsPG,\n PromptBlocksPG,\n AgentsPG,\n WorkflowsPG,\n DatasetsPG,\n ExperimentsPG,\n] as const;\n\n/**\n * Exports the Mastra database schema as SQL DDL statements, including tables, indexes, and triggers.\n * Does not require a database connection. Each domain class provides its own DDL contribution\n * via a static getExportDDL method, ensuring a single source of truth.\n */\nexport function exportSchemas(schemaName?: string): string {\n const statements: string[] = [];\n\n if (schemaName) {\n const quotedSchemaName = getSchemaName(schemaName);\n statements.push(`CREATE SCHEMA IF NOT EXISTS ${quotedSchemaName};`);\n statements.push('');\n }\n\n for (const Domain of ALL_DOMAINS) {\n statements.push(...Domain.getExportDDL(schemaName));\n }\n\n return statements.join('\\n');\n}\n// Export domain classes for direct use with MastraStorage composition\nexport {\n AgentsPG,\n DatasetsPG,\n ExperimentsPG,\n MCPClientsPG,\n MemoryPG,\n ObservabilityPG,\n PromptBlocksPG,\n ScorerDefinitionsPG,\n ScoresPG,\n WorkflowsPG,\n};\nexport { PoolAdapter } from './client';\nexport type { DbClient, TxClient, QueryValues, Pool, PoolClient, QueryResult } from './client';\nexport type { PgDomainConfig, PgDomainClientConfig, PgDomainPoolConfig, PgDomainRestConfig } from './db';\n\n/**\n * PostgreSQL storage adapter for Mastra.\n *\n * @example\n * ```typescript\n * // Option 1: Connection string\n * const store = new PostgresStore({\n * id: 'my-store',\n * connectionString: 'postgresql://...',\n * });\n *\n * // Option 2: Pre-configured pool\n * const pool = new Pool({ connectionString: 'postgresql://...' });\n * const store = new PostgresStore({ id: 'my-store', pool });\n *\n * // Access domain storage\n * const memory = await store.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Execute custom queries\n * const rows = await store.db.any('SELECT * FROM my_table');\n * ```\n */\nexport class PostgresStore extends MastraCompositeStore {\n #pool: Pool;\n #db: DbClient;\n #ownsPool: boolean;\n private schema: string;\n private isInitialized: boolean = false;\n\n stores: StorageDomains;\n\n constructor(config: PostgresStoreConfig) {\n try {\n validateConfig('PostgresStore', config);\n super({ id: config.id, name: 'PostgresStore', disableInit: config.disableInit });\n // Validate schema name to prevent SQL injection\n this.schema = parseSqlIdentifier(config.schemaName || 'public', 'schema name');\n\n if (isPoolConfig(config)) {\n this.#pool = config.pool;\n this.#ownsPool = false;\n } else {\n this.#pool = this.createPool(config);\n this.#ownsPool = true;\n }\n\n this.#db = new PoolAdapter(this.#pool);\n\n const domainConfig: PgDomainClientConfig = {\n client: this.#db,\n schemaName: this.schema,\n skipDefaultIndexes: config.skipDefaultIndexes,\n indexes: config.indexes,\n };\n\n this.stores = {\n scores: new ScoresPG(domainConfig),\n workflows: new WorkflowsPG(domainConfig),\n memory: new MemoryPG(domainConfig),\n observability: new ObservabilityPG(domainConfig),\n agents: new AgentsPG(domainConfig),\n promptBlocks: new PromptBlocksPG(domainConfig),\n scorerDefinitions: new ScorerDefinitionsPG(domainConfig),\n mcpClients: new MCPClientsPG(domainConfig),\n datasets: new DatasetsPG(domainConfig),\n experiments: new ExperimentsPG(domainConfig),\n };\n } catch (e) {\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INITIALIZATION', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n },\n e,\n );\n }\n }\n\n private createPool(config: PostgresStoreConfig): Pool {\n if (isConnectionStringConfig(config)) {\n return new Pool({\n connectionString: config.connectionString,\n ssl: config.ssl,\n max: config.max ?? DEFAULT_MAX_CONNECTIONS,\n idleTimeoutMillis: config.idleTimeoutMillis ?? DEFAULT_IDLE_TIMEOUT_MS,\n });\n }\n\n if (isHostConfig(config)) {\n return new Pool({\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: config.ssl,\n max: config.max ?? DEFAULT_MAX_CONNECTIONS,\n idleTimeoutMillis: config.idleTimeoutMillis ?? DEFAULT_IDLE_TIMEOUT_MS,\n });\n }\n\n if (isCloudSqlConfig(config)) {\n return new Pool(config as any);\n }\n\n throw new Error('PostgresStore: invalid config');\n }\n\n async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n this.isInitialized = true;\n await super.init();\n } catch (error) {\n this.isInitialized = false;\n // Rethrow MastraError directly to preserve structured error IDs (e.g., MIGRATION_REQUIRED::DUPLICATE_SPANS)\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: createStorageErrorId('PG', 'INIT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Database client for executing queries.\n *\n * @example\n * ```typescript\n * const rows = await store.db.any('SELECT * FROM users WHERE active = $1', [true]);\n * const user = await store.db.one('SELECT * FROM users WHERE id = $1', [userId]);\n * ```\n */\n public get db(): DbClient {\n return this.#db;\n }\n\n /**\n * The underlying pg.Pool for direct database access or ORM integration.\n */\n public get pool(): Pool {\n return this.#pool;\n }\n\n /**\n * Closes the connection pool if it was created by this store.\n * If a pool was passed in via config, it will not be closed.\n */\n async close(): Promise<void> {\n if (this.#ownsPool) {\n await this.#pool.end();\n }\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for PG Vector.\n */\nexport const PGVECTOR_PROMPT = `When querying PG Vector, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n- $all: Match all values in array\n Example: { \"tags\": { \"$all\": [\"premium\", \"sale\"] } }\n- $elemMatch: Match array elements that meet all specified conditions\n Example: { \"items\": { \"$elemMatch\": { \"price\": { \"$gt\": 100 } } } }\n- $contains: Check if array contains value\n Example: { \"tags\": { \"$contains\": \"premium\" } }\n\nLogical Operators:\n- $and: Logical AND (implicit when using multiple conditions)\n Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n- $nor: Logical NOR\n Example: { \"$nor\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n\nSpecial Operators:\n- $size: Array length check\n Example: { \"tags\": { \"$size\": 2 } }\n\nRestrictions:\n- Regex patterns are not supported\n- Direct RegExp patterns will throw an error\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- Array operations work on array fields only\n- Basic operators handle array values as JSON strings\n- Empty arrays in conditions are handled gracefully\n- Only logical operators ($and, $or, $not, $nor) can be used at the top level\n- All other operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n Invalid: { \"$contains\": \"value\" }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- $not operator:\n - Must be an object\n - Cannot be empty\n - Can be used at field level or top level\n - Valid: { \"$not\": { \"field\": \"value\" } }\n - Valid: { \"field\": { \"$not\": { \"$eq\": \"value\" } } }\n- Other logical operators ($and, $or, $nor):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n- $elemMatch requires an object with conditions\n Valid: { \"array\": { \"$elemMatch\": { \"field\": \"value\" } } }\n Invalid: { \"array\": { \"$elemMatch\": \"value\" } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"tags\": { \"$all\": [\"premium\"] } },\n { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": true }\n ]}\n ]\n}`;\n"]}