@mastra/pg 1.0.0-beta.10 → 1.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/dist/index.cjs +340 -149
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +341 -150
- package/dist/index.js.map +1 -1
- package/dist/shared/config.d.ts +61 -66
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/storage/client.d.ts +91 -0
- package/dist/storage/client.d.ts.map +1 -0
- package/dist/storage/db/index.d.ts +36 -17
- package/dist/storage/db/index.d.ts.map +1 -1
- package/dist/storage/domains/memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +35 -14
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/test-utils.d.ts.map +1 -1
- package/package.json +3 -4
package/dist/index.js.map
CHANGED
|
@@ -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/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/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["result","conditions","operatorFn","operatorResult","mastraError","installedSchema","existingSchema","parseSqlIdentifier","MastraError","ErrorDomain","ErrorCategory","quotedCol","getSchemaName","getTableName","TABLE_SCHEMAS","createStorageErrorId","normalizePerPage","calculatePagination","TABLE_SPANS","coreTransformScoreRow","TABLE_WORKFLOW_SNAPSHOT","pgPromise"],"mappings":"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","file":"index.js","sourcesContent":["import type { ConnectionOptions } from 'node:tls';\nimport type { CreateIndexOptions } from '@mastra/core/storage';\nimport type { ClientConfig } from 'pg';\nimport type * as pg from 'pg';\nimport type pgPromise from 'pg-promise';\nimport type { ISSLConfig } from 'pg-promise/typescript/pg-subset';\n\n/**\n * Generic PostgreSQL configuration type.\n * @template SSLType - The SSL configuration type (ISSLConfig for pg-promise, ConnectionOptions for pg)\n */\nexport type PostgresConfig<SSLType = ISSLConfig | ConnectionOptions> = {\n id: string;\n schemaName?: string;\n max?: number;\n idleTimeoutMillis?: number;\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new 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 host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | SSLType;\n }\n | {\n connectionString: string;\n ssl?: boolean | SSLType;\n }\n // Support Cloud SQL Connector & pg ClientConfig\n | ClientConfig\n);\n\n/**\n * PostgreSQL configuration for PostgresStore (uses pg-promise with ISSLConfig)\n *\n * Accepts either:\n * - A pre-configured pg-promise client: `{ id, client, schemaName? }`\n * - Connection string: `{ id, connectionString, ... }`\n * - Host/port config: `{ id, host, port, database, user, password, ... }`\n * - Cloud SQL connector config: `{ id, stream, ... }`\n */\nexport type PostgresStoreConfig =\n | PostgresConfig<ISSLConfig>\n | {\n id: string;\n /**\n * Pre-configured pg-promise database client.\n * Use this when you need to configure the client before initialization,\n * e.g., to add pool listeners or set connection-level settings.\n *\n * @example\n * ```typescript\n * import pgPromise from 'pg-promise';\n *\n * const pgp = pgPromise();\n * const client = pgp({ connectionString: '...' });\n *\n * // Custom setup before using\n * client.$pool.on('connect', async (poolClient) => {\n * await poolClient.query('SET ROLE my_role;');\n * });\n *\n * const store = new PostgresStore({ id: 'my-store', client });\n * ```\n */\n client: pgPromise.IDatabase<{}>;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n };\n\n/**\n * PostgreSQL configuration for PgVector (uses pg with ConnectionOptions)\n */\nexport type PgVectorConfig = PostgresConfig<ConnectionOptions> & {\n pgPoolOptions?: Omit<pg.PoolConfig, 'connectionString'>;\n};\n\nexport const isConnectionStringConfig = <SSLType>(\n cfg: PostgresConfig<SSLType>,\n): cfg is PostgresConfig<SSLType> & { connectionString: string; ssl?: boolean | SSLType } => {\n return 'connectionString' in cfg;\n};\n\nexport const isHostConfig = <SSLType>(\n cfg: PostgresConfig<SSLType>,\n): cfg is PostgresConfig<SSLType> & {\n host: string;\n port: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean | SSLType;\n} => {\n return 'host' in cfg && 'database' in cfg && 'user' in cfg && 'password' in cfg;\n};\n\nexport const isCloudSqlConfig = <SSLType>(\n cfg: PostgresConfig<SSLType>,\n): cfg is PostgresConfig<SSLType> & ClientConfig => {\n return 'stream' in cfg || ('password' in cfg && typeof cfg.password === 'function');\n};\n\n/**\n * Type guard for pre-configured client config (PostgresStore only)\n */\nexport const isClientConfig = (\n cfg: PostgresStoreConfig,\n): cfg is {\n id: string;\n client: pgPromise.IDatabase<{}>;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n indexes?: CreateIndexOptions[];\n} => {\n return 'client' in cfg;\n};\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 // Client config: user provides pre-configured pg-promise client\n if (isClientConfig(config)) {\n if (!config.client) {\n throw new Error(`${name}: client must be provided when using client config.`);\n }\n return; // Valid client 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 {client}, {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 => {\n const jsonPathKey = parseJsonPathKey(key);\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 [[operator, operatorValue] = []] = Object.entries(value);\n\n // Special handling for nested $not\n if (operator === '$not') {\n const entries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = entries\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 values.push(nestedValue as number);\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 [[operator, operatorValue] = []] = Object.entries(value);\n\n // Special handling for nested $not\n if (operator === '$not') {\n const entries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = entries\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 values.push(nestedValue as number);\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 } 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.max ?? 20,\n idleTimeoutMillis: config.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 if (!Number.isInteger(topK) || topK <= 0) {\n throw new Error('topK must be a positive integer');\n }\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 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 { 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 pgPromise from 'pg-promise';\nimport type { IDatabase } from 'pg-promise';\nimport type { ISSLConfig } from 'pg-promise/typescript/pg-subset';\n\n/**\n * Configuration for standalone domain usage.\n * Accepts either:\n * 1. An existing pg-promise database instance\n * 2. Config to create a new client internally\n */\nexport type PgDomainConfig = PgDomainClientConfig | PgDomainRestConfig;\n\n/**\n * Pass an existing pg-promise database instance\n */\nexport interface PgDomainClientConfig {\n /** The pg-promise database instance */\n client: IDatabase<{}>;\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-promise client 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 | ISSLConfig;\n }\n | {\n connectionString: string;\n ssl?: boolean | ISSLConfig;\n }\n);\n\n/**\n * Resolves PgDomainConfig to a pg-promise database instance and schema.\n * Handles creating a new client if config is provided.\n */\nexport function resolvePgConfig(config: PgDomainConfig): {\n client: IDatabase<{}>;\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 // Config to create new client\n const pgp = pgPromise();\n const client = pgp(config as any);\n return {\n client,\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\n/**\n * Internal config for PgDB - accepts already-resolved client\n */\nexport interface PgDBInternalConfig {\n client: IDatabase<{}>;\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: IDatabase<{}>;\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 getSqlType(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\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\n await this.client.none(\n `INSERT INTO ${getTableName({ indexName: tableName, schemaName })} (${columns.map(c => `\"${c}\"`).join(', ')}) VALUES (${placeholders})`,\n 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 || 'mastra', 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 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}\" ${this.getSqlType(def.type)} ${constraints.join(' ')}`;\n });\n\n if (this.schemaName) {\n await this.setupSchema();\n }\n\n const finalColumns = [...columns, ...timeZColumns].join(',\\n');\n const constraintPrefix = this.schemaName ? `${this.schemaName}_` : '';\n const schemaName = getSchemaName(this.schemaName);\n\n const sql = `\n CREATE TABLE IF NOT EXISTS ${getTableName({ indexName: tableName, schemaName })} (\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 = '${constraintPrefix}mastra_workflow_snapshot_workflow_name_run_id_key'\n ) AND NOT EXISTS (\n SELECT 1 FROM pg_indexes WHERE indexname = '${constraintPrefix}mastra_workflow_snapshot_workflow_name_run_id_key'\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName })}\n ADD CONSTRAINT ${constraintPrefix}mastra_workflow_snapshot_workflow_name_run_id_key\n UNIQUE (workflow_name, run_id);\n END IF;\n END $$;\n `\n : ''\n }\n ${\n tableName === TABLE_SPANS\n ? `\n DO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = '${constraintPrefix}mastra_ai_spans_traceid_spanid_pk'\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: getSchemaName(this.schemaName) })}\n ADD CONSTRAINT ${constraintPrefix}mastra_ai_spans_traceid_spanid_pk\n PRIMARY KEY (\"traceId\", \"spanId\");\n END IF;\n END $$;\n `\n : ''\n }\n `;\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 } catch (error) {\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 = this.getSqlType(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 * 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 = this.getSqlType(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(result.scans) || 0,\n tuples_read: parseInt(result.tuples_read) || 0,\n tuples_fetched: parseInt(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_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageAgentType,\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\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] 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 await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\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_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 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 name: row.name as string,\n description: row.description as string | undefined,\n instructions: 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 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 metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: row.createdAtZ || row.createdAt,\n updatedAt: row.updatedAtZ || row.updatedAt,\n };\n }\n\n async getAgentById({ id }: { 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 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 createAgent({ agent }: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, 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, name, description, instructions, model, tools, \n \"defaultOptions\", workflows, agents, \"inputProcessors\", \"outputProcessors\", memory, scorers, metadata, \n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)`,\n [\n agent.id,\n agent.name,\n agent.description ?? null,\n agent.instructions,\n JSON.stringify(agent.model),\n agent.tools ? JSON.stringify(agent.tools) : null,\n agent.defaultOptions ? JSON.stringify(agent.defaultOptions) : null,\n agent.workflows ? JSON.stringify(agent.workflows) : null,\n agent.agents ? JSON.stringify(agent.agents) : null,\n agent.inputProcessors ? JSON.stringify(agent.inputProcessors) : null,\n agent.outputProcessors ? JSON.stringify(agent.outputProcessors) : null,\n agent.memory ? JSON.stringify(agent.memory) : null,\n agent.scorers ? JSON.stringify(agent.scorers) : null,\n agent.metadata ? JSON.stringify(agent.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...agent,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\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 updateAgent({ id, ...updates }: StorageUpdateAgentInput): Promise<StorageAgentType> {\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.getAgentById({ 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 const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (updates.name !== undefined) {\n setClauses.push(`name = $${paramIndex++}`);\n values.push(updates.name);\n }\n\n if (updates.description !== undefined) {\n setClauses.push(`description = $${paramIndex++}`);\n values.push(updates.description);\n }\n\n if (updates.instructions !== undefined) {\n setClauses.push(`instructions = $${paramIndex++}`);\n values.push(updates.instructions);\n }\n\n if (updates.model !== undefined) {\n setClauses.push(`model = $${paramIndex++}`);\n values.push(JSON.stringify(updates.model));\n }\n\n if (updates.tools !== undefined) {\n setClauses.push(`tools = $${paramIndex++}`);\n values.push(JSON.stringify(updates.tools));\n }\n\n if (updates.defaultOptions !== undefined) {\n setClauses.push(`\"defaultOptions\" = $${paramIndex++}`);\n values.push(JSON.stringify(updates.defaultOptions));\n }\n\n if (updates.workflows !== undefined) {\n setClauses.push(`workflows = $${paramIndex++}`);\n values.push(JSON.stringify(updates.workflows));\n }\n\n if (updates.agents !== undefined) {\n setClauses.push(`agents = $${paramIndex++}`);\n values.push(JSON.stringify(updates.agents));\n }\n\n if (updates.inputProcessors !== undefined) {\n setClauses.push(`\"inputProcessors\" = $${paramIndex++}`);\n values.push(JSON.stringify(updates.inputProcessors));\n }\n\n if (updates.outputProcessors !== undefined) {\n setClauses.push(`\"outputProcessors\" = $${paramIndex++}`);\n values.push(JSON.stringify(updates.outputProcessors));\n }\n\n if (updates.memory !== undefined) {\n setClauses.push(`memory = $${paramIndex++}`);\n values.push(JSON.stringify(updates.memory));\n }\n\n if (updates.scorers !== undefined) {\n setClauses.push(`scorers = $${paramIndex++}`);\n values.push(JSON.stringify(updates.scorers));\n }\n\n if (updates.metadata !== undefined) {\n // Merge metadata\n const mergedMetadata = { ...existingAgent.metadata, ...updates.metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\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.getAgentById({ 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 deleteAgent({ id }: { id: string }): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (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 listAgents(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 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","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n createStorageErrorId,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n CreateIndexOptions,\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\nexport class MemoryPG extends MemoryStorage {\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] 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 await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\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 listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n\n if (page < 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'LIST_THREADS_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 { field, direction } = this.parseOrderBy(orderBy);\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const baseQuery = `FROM ${tableName} WHERE \"resourceId\" = $1`;\n const queryParams: any[] = [resourceId];\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 const dataQuery = `SELECT id, \"resourceId\", title, metadata, \"createdAt\", \"updatedAt\" ${baseQuery} ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`;\n const rows = await this.#db.client.manyOrNone(dataQuery, [...queryParams, limitValue, offset]);\n\n const threads = (rows || []).map(thread => ({\n ...thread,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAt,\n updatedAt: 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_BY_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId,\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 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\" = $3\n WHERE id = $4\n RETURNING *\n `,\n [title, mergedMetadata, new Date().toISOString(), 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 m.\"createdAt\" <= (SELECT \"createdAt\" FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY 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 m.\"createdAt\" > (SELECT \"createdAt\" FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY 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 (${messageIds.map((_, i) => `$${i + 1}`).join(', ')})\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 threadPlaceholders = threadIds.map((_, i) => `$${i + 1}`).join(', ');\n const conditions: string[] = [`thread_id IN (${threadPlaceholders})`];\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 conditions.push(`\"createdAt\" >= $${paramIndex++}`);\n queryParams.push(filter.dateRange.start);\n }\n\n if (filter?.dateRange?.end) {\n conditions.push(`\"createdAt\" <= $${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 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 threadUpdate = t.none(\n `UPDATE ${threadTableName}\n SET\n \"updatedAt\" = $1,\n \"updatedAtZ\" = $1\n WHERE id = $2\n `,\n [new Date().toISOString(), 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 ($1:list)`;\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 queries.push(\n t.none(\n `UPDATE ${getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) })} SET \"updatedAt\" = NOW(), \"updatedAtZ\" = NOW() WHERE id IN ($1:list)`,\n [Array.from(threadIdsToUpdate)],\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 updates.push(`\"updatedAt\" = $${paramIndex}`);\n values.push(updatedResource.updatedAt.toISOString());\n updates.push(`\"updatedAtZ\" = $${paramIndex++}`);\n values.push(updatedResource.updatedAt.toISOString());\n\n paramIndex++;\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","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n TABLE_SCHEMAS,\n TABLE_SPANS,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n TracingStorageStrategy,\n ListTracesArgs,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n ListTracesResponse,\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 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: 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', '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 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 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\nfunction 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 console.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\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 /**\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 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, JSON.stringify(snapshot), 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 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 conditions.push(`snapshot::jsonb ->> 'status' = $${paramIndex}`);\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 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, MastraStorage } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\nimport pgPromise from 'pg-promise';\nimport {\n validateConfig,\n isCloudSqlConfig,\n isConnectionStringConfig,\n isHostConfig,\n isClientConfig,\n} from '../shared/config';\nimport type { PostgresStoreConfig } from '../shared/config';\nimport type { PgDomainConfig } from './db';\nimport { AgentsPG } from './domains/agents';\nimport { MemoryPG } from './domains/memory';\nimport { ObservabilityPG } from './domains/observability';\nimport { ScoresPG } from './domains/scores';\nimport { WorkflowsPG } from './domains/workflows';\n\n// Export domain classes for direct use with MastraStorage composition\nexport { AgentsPG, MemoryPG, ObservabilityPG, ScoresPG, WorkflowsPG };\nexport type { PgDomainConfig } from './db';\n\n/**\n * PostgreSQL storage adapter for Mastra.\n *\n * Access domain-specific storage via `getStore()`:\n *\n * @example\n * ```typescript\n * const storage = new PostgresStore({ connectionString: '...' });\n *\n * // Access memory domain\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n *\n * // Access workflows domain\n * const workflows = await storage.getStore('workflows');\n * await workflows?.persistWorkflowSnapshot({ workflowName, runId, snapshot });\n * ```\n */\nexport class PostgresStore extends MastraStorage {\n #db: pgPromise.IDatabase<{}>;\n #pgp: pgPromise.IMain;\n private schema: string;\n private isInitialized: boolean = false;\n\n stores: StorageDomains;\n\n constructor(config: PostgresStoreConfig) {\n // Validation: connectionString or host/database/user/password must not be empty\n try {\n validateConfig('PostgresStore', config);\n super({ id: config.id, name: 'PostgresStore', disableInit: config.disableInit });\n this.schema = config.schemaName || 'public';\n\n // Initialize pg-promise\n this.#pgp = pgPromise();\n\n // Handle pre-configured client vs creating new connection\n if (isClientConfig(config)) {\n // User provided a pre-configured pg-promise client\n this.#db = config.client;\n } else {\n // Create connection from config\n let pgConfig: PostgresStoreConfig;\n if (isConnectionStringConfig(config)) {\n pgConfig = {\n id: config.id,\n connectionString: config.connectionString,\n max: config.max,\n idleTimeoutMillis: config.idleTimeoutMillis,\n ssl: config.ssl,\n };\n } else if (isCloudSqlConfig(config)) {\n // Cloud SQL connector config\n pgConfig = {\n ...config,\n id: config.id,\n max: config.max,\n idleTimeoutMillis: config.idleTimeoutMillis,\n };\n } else if (isHostConfig(config)) {\n pgConfig = {\n id: config.id,\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,\n idleTimeoutMillis: config.idleTimeoutMillis,\n };\n } else {\n // This should never happen due to validation above, but included for completeness\n throw new Error(\n 'PostgresStore: invalid config. Provide either {client}, {connectionString}, {host,port,database,user,password}, or a pg ClientConfig (e.g., Cloud SQL connector with `stream`).',\n );\n }\n\n // Note: pg-promise creates connections lazily when queries are executed,\n // so this is safe to do in the constructor\n this.#db = this.#pgp(pgConfig as any);\n }\n\n // Create all domain instances synchronously in the constructor\n // This is required for Memory to work correctly, as it checks for\n // stores.memory during getInputProcessors() before init() is called\n const skipDefaultIndexes = config.skipDefaultIndexes;\n const indexes = config.indexes;\n const domainConfig: PgDomainConfig = { client: this.#db, schemaName: this.schema, skipDefaultIndexes, indexes };\n\n const scores = new ScoresPG(domainConfig);\n const workflows = new WorkflowsPG(domainConfig);\n const memory = new MemoryPG(domainConfig);\n const observability = new ObservabilityPG(domainConfig);\n const agents = new AgentsPG(domainConfig);\n\n this.stores = {\n scores,\n workflows,\n memory,\n observability,\n agents,\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 async init(): Promise<void> {\n if (this.isInitialized) {\n return;\n }\n\n try {\n this.isInitialized = true;\n\n // Each domain creates its own indexes during init()\n await super.init();\n } catch (error) {\n this.isInitialized = false;\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 public get db() {\n return this.#db;\n }\n\n public get pgp() {\n return this.#pgp;\n }\n\n /**\n * Closes the pg-promise connection pool.\n *\n * This will close ALL connections in the pool, including pre-configured clients.\n */\n async close(): Promise<void> {\n this.pgp.end();\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/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/scores/index.ts","../src/storage/domains/workflows/index.ts","../src/storage/index.ts","../src/vector/prompt.ts"],"names":["result","conditions","operatorFn","operatorResult","mastraError","installedSchema","existingSchema","Pool","parseSqlIdentifier","MastraError","ErrorDomain","ErrorCategory","quotedCol","getSchemaName","getTableName","TABLE_SCHEMAS","createStorageErrorId","normalizePerPage","calculatePagination","TABLE_SPANS","coreTransformScoreRow","TABLE_WORKFLOW_SNAPSHOT"],"mappings":"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","file":"index.js","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 => {\n const jsonPathKey = parseJsonPathKey(key);\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 [[operator, operatorValue] = []] = Object.entries(value);\n\n // Special handling for nested $not\n if (operator === '$not') {\n const entries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = entries\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 values.push(nestedValue as number);\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 [[operator, operatorValue] = []] = Object.entries(value);\n\n // Special handling for nested $not\n if (operator === '$not') {\n const entries = Object.entries(operatorValue as Record<string, unknown>);\n const conditions = entries\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 values.push(nestedValue as number);\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 } 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 if (!Number.isInteger(topK) || topK <= 0) {\n throw new Error('topK must be a positive integer');\n }\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 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","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';\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}: {\n tableName: TABLE_NAMES;\n schema: Record<string, StorageColumn>;\n schemaName?: string;\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 const constraintPrefix = parsedSchemaName ? `${parsedSchemaName}_` : '';\n const quotedSchemaName = getSchemaName(schemaName);\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 = '${constraintPrefix}mastra_workflow_snapshot_workflow_name_run_id_key'\n ) AND NOT EXISTS (\n SELECT 1 FROM pg_indexes WHERE indexname = '${constraintPrefix}mastra_workflow_snapshot_workflow_name_run_id_key'\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n ADD CONSTRAINT ${constraintPrefix}mastra_workflow_snapshot_workflow_name_run_id_key\n UNIQUE (workflow_name, run_id);\n END IF;\n END $$;\n `\n : ''\n }\n ${\n tableName === TABLE_SPANS\n ? `\n DO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM pg_constraint WHERE conname = '${constraintPrefix}mastra_ai_spans_traceid_spanid_pk'\n ) THEN\n ALTER TABLE ${getTableName({ indexName: tableName, schemaName: quotedSchemaName })}\n ADD CONSTRAINT ${constraintPrefix}mastra_ai_spans_traceid_spanid_pk\n PRIMARY KEY (\"traceId\", \"spanId\");\n END IF;\n END $$;\n `\n : ''\n }\n `;\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 });\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\n await this.client.none(\n `INSERT INTO ${getTableName({ indexName: tableName, schemaName })} (${columns.map(c => `\"${c}\"`).join(', ')}) VALUES (${placeholders})`,\n 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 || 'mastra', 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 } catch (error) {\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 * 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_SCHEMAS,\n} from '@mastra/core/storage';\nimport type {\n StorageAgentType,\n StorageCreateAgentInput,\n StorageUpdateAgentInput,\n StorageListAgentsInput,\n StorageListAgentsOutput,\n CreateIndexOptions,\n} from '@mastra/core/storage';\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] 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 await this.#db.createTable({ tableName: TABLE_AGENTS, schema: TABLE_SCHEMAS[TABLE_AGENTS] });\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_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 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 name: row.name as string,\n description: row.description as string | undefined,\n instructions: 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 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 metadata: this.parseJson(row.metadata, 'metadata'),\n createdAt: row.createdAtZ || row.createdAt,\n updatedAt: row.updatedAtZ || row.updatedAt,\n };\n }\n\n async getAgentById({ id }: { 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 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 createAgent({ agent }: { agent: StorageCreateAgentInput }): Promise<StorageAgentType> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, 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, name, description, instructions, model, tools, \n \"defaultOptions\", workflows, agents, \"inputProcessors\", \"outputProcessors\", memory, scorers, metadata, \n \"createdAt\", \"createdAtZ\", \"updatedAt\", \"updatedAtZ\"\n ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)`,\n [\n agent.id,\n agent.name,\n agent.description ?? null,\n agent.instructions,\n JSON.stringify(agent.model),\n agent.tools ? JSON.stringify(agent.tools) : null,\n agent.defaultOptions ? JSON.stringify(agent.defaultOptions) : null,\n agent.workflows ? JSON.stringify(agent.workflows) : null,\n agent.agents ? JSON.stringify(agent.agents) : null,\n agent.inputProcessors ? JSON.stringify(agent.inputProcessors) : null,\n agent.outputProcessors ? JSON.stringify(agent.outputProcessors) : null,\n agent.memory ? JSON.stringify(agent.memory) : null,\n agent.scorers ? JSON.stringify(agent.scorers) : null,\n agent.metadata ? JSON.stringify(agent.metadata) : null,\n nowIso,\n nowIso,\n nowIso,\n nowIso,\n ],\n );\n\n return {\n ...agent,\n createdAt: now,\n updatedAt: now,\n };\n } catch (error) {\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 updateAgent({ id, ...updates }: StorageUpdateAgentInput): Promise<StorageAgentType> {\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.getAgentById({ 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 const setClauses: string[] = [];\n const values: any[] = [];\n let paramIndex = 1;\n\n if (updates.name !== undefined) {\n setClauses.push(`name = $${paramIndex++}`);\n values.push(updates.name);\n }\n\n if (updates.description !== undefined) {\n setClauses.push(`description = $${paramIndex++}`);\n values.push(updates.description);\n }\n\n if (updates.instructions !== undefined) {\n setClauses.push(`instructions = $${paramIndex++}`);\n values.push(updates.instructions);\n }\n\n if (updates.model !== undefined) {\n setClauses.push(`model = $${paramIndex++}`);\n values.push(JSON.stringify(updates.model));\n }\n\n if (updates.tools !== undefined) {\n setClauses.push(`tools = $${paramIndex++}`);\n values.push(JSON.stringify(updates.tools));\n }\n\n if (updates.defaultOptions !== undefined) {\n setClauses.push(`\"defaultOptions\" = $${paramIndex++}`);\n values.push(JSON.stringify(updates.defaultOptions));\n }\n\n if (updates.workflows !== undefined) {\n setClauses.push(`workflows = $${paramIndex++}`);\n values.push(JSON.stringify(updates.workflows));\n }\n\n if (updates.agents !== undefined) {\n setClauses.push(`agents = $${paramIndex++}`);\n values.push(JSON.stringify(updates.agents));\n }\n\n if (updates.inputProcessors !== undefined) {\n setClauses.push(`\"inputProcessors\" = $${paramIndex++}`);\n values.push(JSON.stringify(updates.inputProcessors));\n }\n\n if (updates.outputProcessors !== undefined) {\n setClauses.push(`\"outputProcessors\" = $${paramIndex++}`);\n values.push(JSON.stringify(updates.outputProcessors));\n }\n\n if (updates.memory !== undefined) {\n setClauses.push(`memory = $${paramIndex++}`);\n values.push(JSON.stringify(updates.memory));\n }\n\n if (updates.scorers !== undefined) {\n setClauses.push(`scorers = $${paramIndex++}`);\n values.push(JSON.stringify(updates.scorers));\n }\n\n if (updates.metadata !== undefined) {\n // Merge metadata\n const mergedMetadata = { ...existingAgent.metadata, ...updates.metadata };\n setClauses.push(`metadata = $${paramIndex++}`);\n values.push(JSON.stringify(mergedMetadata));\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.getAgentById({ 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 deleteAgent({ id }: { id: string }): Promise<void> {\n try {\n const tableName = getTableName({ indexName: TABLE_AGENTS, schemaName: getSchemaName(this.#schema) });\n\n await this.#db.client.none(`DELETE FROM ${tableName} WHERE id = $1`, [id]);\n } catch (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 listAgents(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 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","import { MessageList } from '@mastra/core/agent';\nimport type { MastraMessageContentV2 } from '@mastra/core/agent';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type { MastraMessageV1, MastraDBMessage, StorageThreadType } from '@mastra/core/memory';\nimport {\n MemoryStorage,\n normalizePerPage,\n calculatePagination,\n TABLE_MESSAGES,\n TABLE_RESOURCES,\n TABLE_THREADS,\n TABLE_SCHEMAS,\n createStorageErrorId,\n} from '@mastra/core/storage';\nimport type {\n StorageResourceType,\n StorageListMessagesInput,\n StorageListMessagesOutput,\n StorageListThreadsByResourceIdInput,\n StorageListThreadsByResourceIdOutput,\n CreateIndexOptions,\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 #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] 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 await this.#db.alterTable({\n tableName: TABLE_MESSAGES,\n schema: TABLE_SCHEMAS[TABLE_MESSAGES],\n ifNotExists: ['resourceId'],\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 listThreadsByResourceId(\n args: StorageListThreadsByResourceIdInput,\n ): Promise<StorageListThreadsByResourceIdOutput> {\n const { resourceId, page = 0, perPage: perPageInput, orderBy } = args;\n\n if (page < 0) {\n throw new MastraError({\n id: createStorageErrorId('PG', 'LIST_THREADS_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 { field, direction } = this.parseOrderBy(orderBy);\n const perPage = normalizePerPage(perPageInput, 100);\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n try {\n const tableName = getTableName({ indexName: TABLE_THREADS, schemaName: getSchemaName(this.#schema) });\n const baseQuery = `FROM ${tableName} WHERE \"resourceId\" = $1`;\n const queryParams: any[] = [resourceId];\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 const dataQuery = `SELECT id, \"resourceId\", title, metadata, \"createdAt\", \"updatedAt\" ${baseQuery} ORDER BY \"${field}\" ${direction} LIMIT $2 OFFSET $3`;\n const rows = await this.#db.client.manyOrNone(dataQuery, [...queryParams, limitValue, offset]);\n\n const threads = (rows || []).map(thread => ({\n ...thread,\n metadata: typeof thread.metadata === 'string' ? JSON.parse(thread.metadata) : thread.metadata,\n createdAt: thread.createdAt,\n updatedAt: 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_BY_RESOURCE_ID', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n resourceId,\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 m.\"createdAt\" <= (SELECT \"createdAt\" FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY 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 m.\"createdAt\" > (SELECT \"createdAt\" FROM ${tableName} WHERE id = $${paramIdx})\n ORDER BY 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 conditions.push(`\"createdAt\" >= $${paramIndex++}`);\n queryParams.push(filter.dateRange.start);\n }\n\n if (filter?.dateRange?.end) {\n conditions.push(`\"createdAt\" <= $${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 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","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport {\n createStorageErrorId,\n listTracesArgsSchema,\n ObservabilityStorage,\n TABLE_SCHEMAS,\n TABLE_SPANS,\n TraceStatus,\n} from '@mastra/core/storage';\nimport type {\n SpanRecord,\n TracingStorageStrategy,\n ListTracesArgs,\n UpdateSpanArgs,\n BatchDeleteTracesArgs,\n BatchUpdateSpansArgs,\n BatchCreateSpansArgs,\n CreateSpanArgs,\n GetSpanArgs,\n GetSpanResponse,\n GetRootSpanArgs,\n GetRootSpanResponse,\n GetTraceArgs,\n GetTraceResponse,\n ListTracesResponse,\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 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: 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', '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 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 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\nfunction 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 console.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\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 /**\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 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, JSON.stringify(snapshot), 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 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 conditions.push(`snapshot::jsonb ->> 'status' = $${paramIndex}`);\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 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, MastraStorage } from '@mastra/core/storage';\nimport type { StorageDomains } from '@mastra/core/storage';\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 { 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, 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 MastraStorage {\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 this.schema = config.schemaName || 'public';\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 };\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 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"]}
|